Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save colepacak/cdd3a757853313564d31277c67838397 to your computer and use it in GitHub Desktop.
Save colepacak/cdd3a757853313564d31277c67838397 to your computer and use it in GitHub Desktop.
Multiple Selects - Support required fields
diff --git a/src/Plugin/Field/FieldWidget/OptionsMultipleSelectWidget.php b/src/Plugin/Field/FieldWidget/OptionsMultipleSelectWidget.php
index d635943..f5a21f0 100755
--- a/src/Plugin/Field/FieldWidget/OptionsMultipleSelectWidget.php
+++ b/src/Plugin/Field/FieldWidget/OptionsMultipleSelectWidget.php
@@ -31,10 +31,22 @@ class OptionsMultipleSelectWidget extends OptionsSelectWidget implements WidgetI
/**
* {@inheritdoc}
*/
+ public function form(FieldItemListInterface $items, array &$form, FormStateInterface $form_state, $get_delta = NULL) {
+ $element = parent::form($items, $form, $form_state, $get_delta);
+ $element['widget']['#element_validate'][] = array(get_class($this), 'validateMultipleElements');
+ $element['widget']['#column'] = $this->column;
+ 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['#required'] = FALSE;
+ $option_element = parent::formElement($items, $delta, $element, $form, $form_state);
+ $option_element['#multiple'] = FALSE;
- $element[$this->column] = $element;
+ $element[$this->column] = $option_element;
$element[$this->column]['#default_value'] = empty($items[$delta]->{$this->column}) ? '_none' : $items[$delta]->{$this->column};
$element[$this->column]['#multiple'] = FALSE;
unset($element['#type']);
@@ -87,15 +99,22 @@ class OptionsMultipleSelectWidget extends OptionsSelectWidget implements WidgetI
}
}
+ public static function validateMultipleElements(array $element, FormStateInterface $form_state) {
+ if ($element['#required'] == TRUE) {
+ foreach (Element::children($element) as $key) {
+ if (is_integer($key) && $element[$key][$element['#column']]['#value'] != '_none') {
+ return;
+ }
+ }
+ $form_state->setError($element[0], t('@name field is required.', array('@name' => $element['#title'])));
+ }
+ }
+
/**
* {@inheritdoc}
*/
public static function validateElement(array $element, FormStateInterface $form_state) {
- if ($element['#required'] && $element['#value'] == '_none') {
- $form_state->setError($element, t('@name field is required.', array('@name' => $element['#title'])));
- }
-
- if ($element['#value'] === '_none') {
+ if (isset($element['#value']) && $element['#value'] === '_none') {
$form_state->setValueForElement($element, NULL);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment