Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
namespace Drupal\geocoder_autocomplete\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldWidget\StringTextfieldWidget;
use Drupal\Core\Form\FormStateInterface;
/**
* Implements geocoder_autocomplete widget on 'string' fields.
*
* @FieldWidget(
* id = "geocoder_autocomplete",
* label = @Translation("Geocoder text field with autocomplete"),
* field_types = {"string"}
* )
*/
class GeocoderAutocomplete extends StringTextfieldWidget {
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return array(
'size' => '60',
'autocomplete_route_name' => 'geocoder_autocomplete.autocomplete',
'placeholder' => t('Digit a place'),
) + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$main_widget = parent::formElement($items, $delta, $element, $form, $form_state);
$element['value'] = $main_widget['value'];
if (\Drupal::currentUser()->hasPermission('access geocoder autocomplete')) {
$element['value'] = $element['value'] + array(
'#size' => $this->getSetting('size'),
'#autocomplete_route_name' => $this->getSetting('autocomplete_route_name'),
'#autocomplete_route_parameters' => array(),
'#placeholder' => $this->getSetting('placeholder'),
'#maxlength' => 255,
'#element_validate' => array(array(get_class($this), 'validateFormElement')),
);
}
return $element;
}
/**
* Form element validate handler.
*
* @param array $element
* The form element to validate.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*/
public static function validateFormElement($element, FormStateInterface $form_state) {
if ($geocoded_address = $element['#value']) {
$geocoded_address_cleaned = trim($geocoded_address, '"');
$form_state->setValueForElement($element, $geocoded_address_cleaned);
}
}
}