1<?php 2 3namespace Drupal\Core\Field\Plugin\Field\FieldWidget; 4 5use Drupal\Component\Utility\Html; 6use Drupal\Core\Field\FieldItemListInterface; 7use Drupal\Core\Form\FormStateInterface; 8 9/** 10 * Plugin implementation of the 'options_select' widget. 11 * 12 * @FieldWidget( 13 * id = "options_select", 14 * label = @Translation("Select list"), 15 * field_types = { 16 * "entity_reference", 17 * "list_integer", 18 * "list_float", 19 * "list_string" 20 * }, 21 * multiple_values = TRUE 22 * ) 23 */ 24class OptionsSelectWidget extends OptionsWidgetBase { 25 26 /** 27 * {@inheritdoc} 28 */ 29 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { 30 $element = parent::formElement($items, $delta, $element, $form, $form_state); 31 32 $element += [ 33 '#type' => 'select', 34 '#options' => $this->getOptions($items->getEntity()), 35 '#default_value' => $this->getSelectedOptions($items), 36 // Do not display a 'multiple' select box if there is only one option. 37 '#multiple' => $this->multiple && count($this->options) > 1, 38 ]; 39 40 return $element; 41 } 42 43 /** 44 * {@inheritdoc} 45 */ 46 protected function sanitizeLabel(&$label) { 47 // Select form inputs allow unencoded HTML entities, but no HTML tags. 48 $label = Html::decodeEntities(strip_tags($label)); 49 } 50 51 /** 52 * {@inheritdoc} 53 */ 54 protected function supportsGroups() { 55 return TRUE; 56 } 57 58 /** 59 * {@inheritdoc} 60 */ 61 protected function getEmptyLabel() { 62 if ($this->multiple) { 63 // Multiple select: add a 'none' option for non-required fields. 64 if (!$this->required) { 65 return t('- None -'); 66 } 67 } 68 else { 69 // Single select: add a 'none' option for non-required fields, 70 // and a 'select a value' option for required fields that do not come 71 // with a value selected. 72 if (!$this->required) { 73 return t('- None -'); 74 } 75 if (!$this->has_value) { 76 return t('- Select a value -'); 77 } 78 } 79 } 80 81} 82