Skip to content
Snippets Groups Projects
GeocoderJsonConsumer.php 2.09 KiB
Newer Older
bcweaver's avatar
bcweaver committed
<?php

namespace Drupal\geocoder_autocomplete;

use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Component\Utility\Html;
use GuzzleHttp\ClientInterface;

/**
 * Defines the GeocoderJsonConsumer service, for return parse GeoJson.
 */
class GeocoderJsonConsumer {

  /**
   * Drupal http client.
   *
   * @var \GuzzleHttp\ClientInterface
   */
  protected $httpClient;

  /**
   * Language Manager service.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $languageManager;

  /**
   * Service constructor.
   *
   * @param \GuzzleHttp\ClientInterface $http_client
   *   The http client.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   The language manager.
   */
  public function __construct(
      ClientInterface $http_client,
      LanguageManagerInterface $language_manager
  ) {
    $this->httpClient = $http_client;
    $this->languageManager = $language_manager;
  }

  /**
   * Return json list of geolocation matching $text.
   *
   * @param string $text
   *   The text query for search a place.
   *
   * @return array
   *   An array of matching location.
   */
  public function getAddress($text) {
    $language_interface = $this->languageManager->getCurrentLanguage();
    $language = isset($language_interface) ? $language_interface->getId() : 'en';

    $query = [
      'address' => $text,
      'language' => $language,
      'sensor' => 'false',
    ];
    $uri = 'http://maps.googleapis.com/maps/api/geocode/json';

    $response = $this->httpClient->request('GET', $uri, [
      'query' => $query,
    ]);

    $matches = array();
    if (empty($response->error)) {
      $data = json_decode($response->getBody());
      if ($data->status == 'OK') {
        foreach ($data->results as $result) {
          if (!empty($result->formatted_address)) {
            $formatted_address = $result->formatted_address;
            $matches[] = array(
              'value' => Html::escape($formatted_address),
              'label' => Html::escape($formatted_address),
            );
          }
        }

      }
    }

    return $matches;
  }

}