address_suggestion-1.0.3/src/Element/AddressSuggestion.php

src/Element/AddressSuggestion.php
<?php

namespace Drupal\address_suggestion\Element;

use Drupal\address\Element\Address;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Locale\CountryManager;

/**
 * Provides an address_suggestion form element.
 *
 * Usage example:
 *
 * @code
 * $form['address_suggestion'] = [
 *   '#type' => 'address_suggestion',
 * ];
 * @endcode
 *
 * @FormElement("address_suggestion")
 */
class AddressSuggestion extends Address {

  /**
   * {@inheritDoc}
   */
  public function getInfo() {
    $info = parent::getInfo();

    $info['#process'][] = [
      get_class($this),
      'processAutocomplete',
    ];

    return $info;
  }

  /**
   * {@inheritDoc}
   */
  public static function processAutocomplete(&$element, FormStateInterface $form_state, &$complete_form) {
    $element["#attached"]["library"][] = 'address_suggestion/address_suggestion';
    $field_name = $element["#field_name"];
    $bundle = $element["#bundle"];
    $entity_type_id = $element["#entity_type"];
    $form_display = EntityFormDisplay::load("$entity_type_id.$bundle.default");
    $address_component = $form_display ? $form_display->getComponent($field_name) : NULL;
    $isFormSetting = $complete_form["#form_id"] == 'field_config_edit_form';
    if (!$isFormSetting && !empty($address_component) && !empty($address_component['settings']['hide'])) {
      $value = $element['#value'];
      // Set default country.
      if (empty($value['country_code'])) {
        $system_country = \Drupal::config('system.date')->get('country.default');
        $value['country_code'] = !empty($system_country) ? $system_country : 'US';
      }
      $element = static::addressElements($element, $value);
      $element["address_line"] = $element["address_line1"];
      $element["address_line"]["#required"] = FALSE;
      $element["address_line"]["#attributes"] = [
        "class" => ['address-line', 'address-suggestion'],
        'placeholder' => t('Please start typing your address...'),
        'maxlength' => 255,
        'data-hide' => 'true',
      ];
      $element["address_line"]['#default_value'] = implode(' ', array_filter([
        $value['address_line1'],
        $value['address_line2'],
        $value['postal_code'],
        $value['locality'],
        $value['administrative_area'],
        $value['country_code'],
      ]));
      $element["address_line"]['#autocomplete_route_name'] = 'address_suggestion.addresses';
      $element["address_line"]['#autocomplete_query_parameters'] = ['country' => FALSE];
      $element["address_line"]['#autocomplete_route_parameters'] = [
        'entity_type' => $element["#entity_type"],
        'bundle' => $element["#bundle"],
        'field_name' => $element["#field_name"],
        'country' => $value['country_code'],
      ];

      $hideAddress = [
        'country_code',
        'address_line1',
        'address_line2',
        'address_line3',
        'postal_code',
        'locality',
        'dependent_locality',
        'sorting_code',
        'administrative_area',
      ];
      foreach ($hideAddress as $fieldAddress) {
        if (!empty($element[$fieldAddress]['#type'])) {
          $element[$fieldAddress]['#type'] = 'hidden';
          $element[$fieldAddress]["#required"] = FALSE;
        }
      }
      $element['country_code']['#attributes'] = ['class' => ['country']];
      return $element;
    }
    $element["address_line1"]['#attributes']['class'][] = 'address-suggestion';
    $element["address_line1"]['#autocomplete_route_name'] = 'address_suggestion.addresses';
    $element["address_line1"]['#autocomplete_route_parameters'] = $parameters = [
      'entity_type' => $element["#entity_type"],
      'bundle' => $element["#bundle"],
      'field_name' => $element["#field_name"],
    ];
    $values = $form_state->getValue($element["#field_name"]);
    if (!empty($values[0]) && !empty($values[0]["address"]["country_code"])) {
      $listCountry = CountryManager::getStandardList();
      $country = $values[0]["address"]["country_code"];
      \Drupal::state()->set($stateField = implode('|', $parameters), $country);
      if (!empty($listCountry[$country])) {
        $country = (string) $listCountry[$country];
      }
      \Drupal::state()->set($stateField . '|Country', $country);
      $element["address_line1"]['#autocomplete_route_parameters']['country'] = $values[0]["address"]["country_code"];
    }
    $element["address_line1"]["#attributes"]['placeholder'] = t('Please start typing your address...');
    return $element;
  }

}

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

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