View source
<?php
namespace Drupal\select2\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget;
use Drupal\Core\Form\FormStateInterface;
class Select2Widget extends OptionsSelectWidget {
public static function defaultSettings() {
return [
'width' => '100%',
] + parent::defaultSettings();
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$element['width'] = [
'#type' => 'textfield',
'#title' => $this
->t('Field width'),
'#default_value' => $this
->getSetting('width'),
'#description' => $this
->t("Define a width for the select2 field. It can be either 'element', 'computedstyle', 'style', 'resolve' or any possible CSS value. E.g. 500px, 50%, 200em. See the <a href='https://select2.org/appearance#container-width'>select2 documentation</a> for further explanations."),
'#required' => TRUE,
'#size' => '12',
'#pattern' => "([0-9]*\\.[0-9]+|[0-9]+)(cm|mm|in|px|pt|pc|em|ex|ch|rem|vm|vh|vmin|vmax|%)|element|computedstyle|style|resolve|auto|initial|inherit",
];
return $element;
}
public function settingsSummary() {
$summary = [];
$summary[] = $this
->t('Field width: @width', [
'@width' => $this
->getSetting('width'),
]);
return $summary;
}
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$element['#type'] = 'select2';
$element['#cardinality'] = $this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality();
$element['#select2'] = [
'width' => $this
->getSetting('width'),
];
return $element;
}
protected function getEmptyLabel() {
}
public static function validateElement(array $element, FormStateInterface $form_state) {
if ($element['#required'] && $element['#value'] == '') {
$form_state
->setError($element, t('@name field is required.', [
'@name' => $element['#title'],
]));
}
if (is_array($element['#value'])) {
$values = array_values($element['#value']);
}
else {
$values = [
$element['#value'],
];
}
$index = array_search('', $values, TRUE);
if ($index !== FALSE) {
unset($values[$index]);
}
$items = static::prepareFieldValues($values, $element);
$form_state
->setValueForElement($element, $items);
}
protected static function prepareFieldValues(array $values, array $element) {
$items = [];
foreach ($values as $value) {
$items[] = [
$element['#key_column'] => $value,
];
}
return $items;
}
}