/** * Form validation handler for widget elements. * * @param array $element * The form element. * @param array $form_state * The form state. */ public static function validateElement(array $element, FormStateInterface $form_state) { parent::validateElement($element, $form_state); // Massage submitted form values. // Drupal\Core\Field\WidgetBase::submit() expects values as // an array of values keyed by delta first, then by column, while our // widgets return the opposite. if (is_array($element['#value'])) { $values = array_values($element['#value']); } else { $values = array($element['#value']); } // Filter out the 'none' option. Use a strict comparison, because // 0 == 'any string'. $index = array_search('_none', $values, TRUE); if ($index !== FALSE) { unset($values[$index]); } // Transpose selections from field => delta to delta => field. $items = array(); foreach ($values as $value) { $items[] = array($element['#key_column'] => $value); } NestedArray::setValue($form_state['values'], $element['#parents'], $items); }
/** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $element = parent::formElement($items, $delta, $element, $form, $form_state); $options = $this->getOptions($items->getEntity()); $selected = $this->getSelectedOptions($items); // If required and there is one single option, preselect it. if ($this->required && count($options) == 1) { reset($options); $selected = array(key($options)); } if ($this->multiple) { $element += array('#type' => 'checkboxes', '#default_value' => $selected, '#options' => $options); } else { $element += array('#type' => 'radios', '#default_value' => $selected ? reset($selected) : NULL, '#options' => $options); } return $element; }
/** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $element = parent::formElement($items, $delta, $element, $form, $form_state); $element += array('#type' => 'select', '#options' => $this->getOptions($items->getEntity()), '#default_value' => $this->getSelectedOptions($items), '#multiple' => $this->multiple && count($this->options) > 1); return $element; }