Commit f18c71f3 authored by Nikolay Grachev's avatar Nikolay Grachev
Browse files

Issue #3194599: mapbox integration improvements

parent 2ac3450f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -51,6 +51,9 @@ class AddressAutocomplete extends ControllerBase {
   */
  public function handleAutocomplete(Request $request) {
    $input = $request->query->get('q');
    if (!empty($request->query->get('country'))) {
      $input .= '||' . $request->query->get('country');
    }
    $results = $this->getProviderResults($input);
    return new JsonResponse($results);
  }
+5 −0
Original line number Diff line number Diff line
@@ -41,6 +41,11 @@ class AddressAutocomplete extends Address {
    $element["#attached"]["library"][] = 'address_autocomplete/address_autocomplete';
    $element["address_line1"]['#autocomplete_route_name'] = 'address_autocomplete.addresses';
    $element["address_line1"]["#attributes"]['placeholder'] = t('Please start typing your address...');
    $country_code = !empty($element["#default_value"]["country_code"]) ? $element["#default_value"]["country_code"] : NULL;
    if (!empty($element["#value"]["country_code"])) {
      $country_code = $element["#value"]["country_code"];
    }
    $element["address_line1"]['#autocomplete_route_parameters'] = ['country' => $country_code];
    return $element;
  }

+49 −5
Original line number Diff line number Diff line
@@ -32,16 +32,60 @@ class MapboxGeocoding extends AddressProviderBase {
    $results = [];

    $token = $this->configuration['token'];
    $url = 'https://api.mapbox.com/geocoding/v5/mapbox.places/' . $string . '.json?access_token=' . $token . '&autocomplete=true&types=address&limit=10';
    $exploded_query = explode('||', $string);
    $address = $exploded_query[0].'.json?';
    $query = [
      'autocomplete' => 'true',
      'types' => 'address',
      'limit' => 10,
      'access_token' => $token,
      'language' => \Drupal::languageManager()->getCurrentLanguage()->getId(),
    ];
    if (!empty($exploded_query[1])) {
      $query['country'] = $exploded_query[1];
    }
    $url = 'https://api.mapbox.com/geocoding/v5/mapbox.places/' . $address . http_build_query($query) ;

    $response = $this->client->request('GET', $url);
    $content = Json::decode($response->getBody());

    //some country have format Street number street name
    $country_format_special = ['FR','CA','IE','IN','IL','HK','MY','OM','NZ','PH','SA','SE','SG','LK','TH','UK','US','VN'];
    foreach ($content["features"] as $key => $feature) {
      $results[$key]['street_name'] = $feature["text"];
      $results[$key]['street_name'] .= isset($feature["address"]) ? ' ' . $feature["address"] : '';
      $results[$key]['town_name'] = $feature["context"][1]["text"];
      $results[$key]['zip_code'] = $feature["context"][0]["text"];
      $results[$key]['street_name'] = !empty($feature["text_".$query['language']]) ? $feature["text_".$query['language']] : $feature["text"];
      if(!empty($feature["address"])){
        if (!empty($query['country']) && in_array($query['country'], $country_format_special)) {
          $results[$key]['street_name'] = $feature["address"] . ' ' . $results[$key]['street_name'];
        } else {
          $results[$key]['street_name'] .= ', ' . $feature["address"];
        }
      }
      if(!empty($feature["context"])){
        foreach ($feature["context"] as $context) {
          if (strpos($context['id'], 'region') !== FALSE) {
            $results[$key]['administrative_area'] = $context['text'];
            if(!empty($context['short_code'])){
              $explode_region = explode('-',$context['short_code']);
              $results[$key]['administrative_area'] = end($explode_region);
            }
          }
          if (strpos($context['id'], 'postcode') !== FALSE) {
            $results[$key]['zip_code'] = $context["text"];
          }
          if (strpos($context['id'], 'locality') !== FALSE) {
            $results[$key]['town_name'] = $context["text"];
          }
          if (strpos($context['id'], 'place') !== FALSE) {
            $results[$key]['town_name'] = $context["text"];
          }
        }
      }
      if(!empty( $feature["center"])){
        $results[$key]['location'] = [
          'longitude' => $feature["center"][0],
          'latitude' => $feature["center"][1],
        ];
      }
      $results[$key]['label'] = $feature["place_name"];
    }