diff --git a/core/includes/theme.inc b/core/includes/theme.inc index 498c490..8635336 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1613,6 +1613,7 @@ function template_preprocess_field_multiple_value_form(&$variables) { 'class' => array('field-label'), ), t('Order', array(), array('context' => 'Sort order')), + t('Remove', array(), array('context' => 'Remove item')), ); $rows = array(); @@ -1634,15 +1635,17 @@ function template_preprocess_field_multiple_value_form(&$variables) { foreach ($items as $item) { $item['_weight']['#attributes']['class'] = [$order_class]; - // Remove weight form element from item render array so it can be rendered - // in a separate table column. + // Remove weight and remove form element from item render array so they + // can be rendered in a separate table columns. $delta_element = $item['_weight']; - unset($item['_weight']); + $remove_element = $item['_remove']; + unset($item['_weight'], $item['_remove']); $cells = array( array('data' => '', 'class' => array('field-multiple-drag')), array('data' => $item), array('data' => $delta_element, 'class' => array('delta-order')), + array('data' => $remove_element, 'class' => array('delta-remove')), ); $rows[] = array( 'data' => $cells, diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php index b1579f2..3bdab11 100644 --- a/core/lib/Drupal/Core/Field/WidgetBase.php +++ b/core/lib/Drupal/Core/Field/WidgetBase.php @@ -202,6 +202,22 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f '#default_value' => $items[$delta]->_weight ?: $delta, '#weight' => 100, ); + + foreach (Element::children($element) as $key) { + $element[$key]['#states'] = [ + 'disabled' => [ + ':input[name="' . $field_name . '[' . $delta . '][_remove]"]' => ['checked' => TRUE], + ], + ]; + } + + $element['_remove'] = [ + '#title' => $this->t('Remove'), + '#title_display' => 'invisible', + '#type' => 'checkbox', + '#default_value' => $items[$delta]->_remove ?: FALSE, + '#weight' => 101, + ]; } $elements[$delta] = $element; @@ -353,6 +369,11 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo // Remove the 'value' of the 'add more' button. unset($values['add_more']); + // Filter out removed items. + foreach ($values as $delta => $value) { + if (!empty($value['_remove'])) unset($values[$delta]); + } + // The original delta, before drag-and-drop reordering, is needed to // route errors to the correct form element. foreach ($values as $delta => &$value) { @@ -375,7 +396,7 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo $field_state = static::getWidgetState($form['#parents'], $field_name, $form_state); foreach ($items as $delta => $item) { $field_state['original_deltas'][$delta] = isset($item->_original_delta) ? $item->_original_delta : $delta; - unset($item->_original_delta, $item->_weight); + unset($item->_original_delta, $item->_weight, $item->_remove); } static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state); }