APIKey = $settings['api_key']; $this->curLanguage = Vtiger_Language_Handler::getShortLanguageName(); } public function getProviderFields($type) { switch($type) { case SPTips_SearchType_Model::ADDRESS: return [ 'street_number' => 'Street number', 'route' => 'Street', 'locality' => 'City', 'country' => 'Country', 'postal_code' => 'Postal code' ]; default: return []; } } public function searchAddress($search, $dependentFields) { $response = []; $url = $this->getAPIAutocompleteUrl($search); if ($curl = curl_init($url)) { $this->prepareRequest($curl); $json = curl_exec($curl); $result = json_decode($json, true); curl_close($curl); } foreach ($result['predictions'] as $prediction) { $placeId = $prediction['place_id']; $detailInfo = $this->searchDetailAddress($placeId); $tipData = [ 'tip' => $prediction['description'] ]; if(!empty($dependentFields)) { $tipData['fill'] = $this->getFillData($detailInfo, $dependentFields); } $response[] = $tipData; } return $response; } public function getSupportedSearchTypes() { return [ SPTips_SearchType_Model::ADDRESS ]; } public function searchOrganization($search, $dependentFields) { /* Not supported */ return []; } private function getHeaders() { return array( 'Content-Type: application/json', 'Accept: application/json', ); } private function prepareRequest($curl) { curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, $this->getHeaders()); curl_setopt($curl, CURLOPT_GET, 1); } private function searchDetailAddress($placeId) { $url = $this->getAPIDetailsUrl($placeId); $result = []; if ($curl = curl_init($url)) { $this->prepareRequest($curl); $json = curl_exec($curl); $result = json_decode($json, true); curl_close($curl); } return $result; } /** * * @param type $detailInfo * @param Settings_SPTips_RuleDependentField_Model[] $dependentFields * @return type */ private function getFillData($detailInfo, $dependentFields) { $fillMap = []; foreach($dependentFields as $dependentField) { $fillMap[$dependentField->getProviderFieldName()] = $dependentField->getVtigerFieldName(); } $result = []; foreach ($detailInfo["result"]["address_components"] as $value) { $answerLocationTypes = $value['types']; foreach($answerLocationTypes as $locationType) { if(array_key_exists($locationType, $fillMap)) { $result[] = [ 'vtigerField' => $fillMap[$locationType], 'value' => $value['long_name'] ]; } } } return $result; } private function getAPIAutocompleteUrl($searchParam, $types = "address", $format = "json") { $url = "https://maps.googleapis.com/maps/api/place/autocomplete/"; $url .= $format . "?input=" . urlencode($searchParam) . "&types=" . $types . "&language=" . $this->curLanguage . "&key=" . $this->APIKey; return $url; } private function getAPIDetailsUrl($placeId, $format = "json") { $url = "https://maps.googleapis.com/maps/api/place/details/"; $url .= $format . "?placeid=" . $placeId . "&language=" . $this->curLanguage . "&key=" . $this->APIKey; return $url; } }