address_suggestion-1.0.3/src/Plugin/AddressProvider/PostCh.php

src/Plugin/AddressProvider/PostCh.php
<?php

namespace Drupal\address_suggestion\Plugin\AddressProvider;

use Drupal\address_suggestion\AddressProviderBase;
use Drupal\Component\Utility\Html;
use Drupal\Core\Utility\Error;
use GuzzleHttp\Exception\RequestException;

/**
 * Defines a PostCh plugin for address_suggestion.
 *
 * @package Drupal\address_suggestion\Plugin\AddressProvider
 * @AddressProvider(
 *   id = "post_ch",
 *   label = @Translation("Post CH"),
 *   api = "https://post.ch",
 *   login = "TRUE",
 * )
 */
class PostCh extends AddressProviderBase {

  /**
   * {@inheritDoc}
   */
  public function processQuery($string, $settings) {
    $addresses = $this->prepareRequest($string, $settings);
    $results = [];

    foreach ($addresses as $address) {
      $street_name = Html::escape($address->Streetname);
      $house_number = Html::escape($address->HouseNumber);
      $zip_code = Html::escape($address->Zipcode);
      $town_name = Html::escape($address->TownName);
      $country_code = Html::escape($address->countryCode ?? 'CH');

      $results[] = [
        'street_name' => $street_name . " " . $house_number,
        'zip_code' => $zip_code,
        'town_name' => $town_name,
        'country_code' => $country_code,
        'label' => $street_name . " " . $house_number . " " . $zip_code . " " . $town_name,
      ];
    }

    return $results;
  }

  /**
   * {@inheritdoc}
   */
  public function prepareRequest($string, $settings) {
    $request = [
      'request' => [
        'Onrp' => 0,
        'Zipcode' => '',
        'ZipAddition' => '',
        'TownName' => '',
        'StrId' => 0,
        'Streetname' => $string,
        'HouseKey' => 0,
        'HouseNumber' => '',
        'HouseNumberAddition' => '',
      ],
      'zipOrderMode' => 0,
    ];

    // If last entered word starts with number, let's guess it's house number
    // ie: Schultheissenstrasse 2b.
    $pieces = explode(' ', $string);
    $pos_number = array_pop($pieces);

    if (!empty($pieces) && is_numeric($pos_number[0])) {
      $request['request']['Streetname'] = implode(' ', $pieces);
      $request['request']['HouseNumber'] = $pos_number;
    }

    $results = $this->request($request, $settings);

    // Sometimes guessing may be wrong, as numbers could be part of streetname
    // ie: Avenue 14-Avril
    // do fallback here.
    if (empty($results) && !empty($request['request']['HouseNumber'])) {
      $request['request']['Streetname'] = $string;
      $request['request']['HouseNumber'] = '';
      $results = $this->request($request, $settings);
    }

    return $results;
  }

  /**
   * {@inheritdoc}
   */
  public function request($request, $settings) {
    try {
      $response = $this->client->post(
        !empty($settings['endpoint']) ? $settings['endpoint'] : $settings['api'],
        [
          'auth' => [
            $settings['username'],
            $settings['password'],
          ],
          'body' => json_encode($request),
          'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
          ],
        ]
      );
      $content = json_decode($response->getBody()->getContents());
      $results = $content->QueryAutoComplete2Result->AutoCompleteResult;
      // Limit number of results to 10.
      $results = array_slice($results, 0, 10);
    }
    catch (RequestException $e) {
      $logger = \Drupal::logger('address_autocomplete');
      Error::logException($logger, $e);
      $results = [];
    }

    return $results;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc