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;
}
}
