Select2BoxesAutocompleteListWidget.php in Select2 Boxes 8
File
src/Plugin/Field/FieldWidget/Select2BoxesAutocompleteListWidget.php
View source
<?php
namespace Drupal\select2boxes\Plugin\Field\FieldWidget;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\select2boxes\MinSearchLengthTrait;
class Select2BoxesAutocompleteListWidget extends OptionsSelectWidget {
use MinSearchLengthTrait;
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
if ($this->fieldDefinition
->getType() === 'country') {
$this
->setCountriesList();
}
elseif ($this->fieldDefinition
->getType() === 'language') {
$this
->setLanguagesList();
}
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$element['#attributes'] = [
'data-jquery-once-autocomplete' => 'true',
'data-select2-autocomplete-list-widget' => 'true',
'class' => [
'select2-widget',
],
];
if ($this->fieldDefinition
->getFieldStorageDefinition()
->isMultiple()) {
unset($element['#options']['_none']);
$element['#attributes']['data-select2-multiple'] = 'true';
}
if ($this->fieldDefinition
->getType() === 'language') {
$languages = \Drupal::languageManager()
->getLanguages(LanguageInterface::STATE_ALL);
$element['#options'] = array_map(function ($language) {
return $language
->getName();
}, $languages);
if ($items
->getEntity() instanceof EntityInterface) {
$element['#default_value'] = $items
->getEntity()
->language()
->getId();
}
}
$this
->includeFlagsIcons($element);
$this
->limitSearchByMinLength($element['#attributes']);
$element['#attached']['library'][] = 'select2boxes/widget';
return $element;
}
protected function includeFlagsIcons(array &$element) {
$types = [
'language_field',
'language',
'country',
];
if (\Drupal::moduleHandler()
->moduleExists('flags') && in_array($this->fieldDefinition
->getType(), $types) && $this
->getThirdPartySetting('select2boxes', 'enable_flags') == '1') {
$flags = [];
$mapper = $this->fieldDefinition
->getType() == 'country' ? \Drupal::service('flags.mapping.country') : \Drupal::service('flags.mapping.language');
foreach (array_keys($element['#options']) as $key) {
$flags[$key] = [
'flag',
'flag-' . $mapper
->map($key),
$mapper
->getExtraClasses()[0],
];
}
if (!isset($element['#attached']['drupalSettings']['flagsClasses'])) {
$element['#attached']['drupalSettings']['flagsClasses'] = [];
}
$element['#attached']['drupalSettings']['flagsClasses'] += $flags;
$element['#attached']['drupalSettings']['flagsFields'][$this->fieldDefinition
->getName()] = TRUE;
$element['#attached']['library'][] = 'flags/flags';
}
}
protected function setLanguagesList() {
if (!isset($this->options)) {
$this->options = [
'_none' => $this
->t('- None -'),
];
$this->options += array_map(function ($language) {
return $language
->getName();
}, \Drupal::languageManager()
->getLanguages());
}
}
protected function setCountriesList() {
if (!isset($this->options)) {
$this->options = [
'_none' => $this
->t('- None -'),
];
$this->options += \Drupal::service('country_manager')
->getList();
}
}
}