diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php index fd979fcc4e..02f0d3e323 100644 --- a/core/lib/Drupal/Core/Field/WidgetBase.php +++ b/core/lib/Drupal/Core/Field/WidgetBase.php @@ -174,12 +174,12 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f $field_name = $this->fieldDefinition->getName(); $cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality(); $parents = $form['#parents']; - $field_state = static::getWidgetState($parents, $field_name, $form_state); // Determine the number of widgets to display. switch ($cardinality) { case FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED: - $max = $field_state['items_count'] - 1; + $field_state = static::getWidgetState($parents, $field_name, $form_state); + $max = $field_state['items_count']; $is_multiple = TRUE; break; @@ -255,7 +255,7 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f ], ]; - $element['actions'] = [ + $element['_actions'] = [ 'remove_button' => $remove_button, '#weight' => 101, ]; @@ -266,37 +266,38 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f } } - $elements += [ - '#theme' => 'field_multiple_value_form', - '#field_name' => $field_name, - '#cardinality' => $cardinality, - '#cardinality_multiple' => $this->fieldDefinition->getFieldStorageDefinition()->isMultiple(), - '#required' => $this->fieldDefinition->isRequired(), - '#title' => $title, - '#description' => $description, - '#max_delta' => $max, - ]; - - // Add 'add more' button, if not working with a programmed form. - if ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED && !$form_state->isProgrammed()) { - $elements['#wrapper_id'] = $wrapper_id; - $elements['#prefix'] = '
'; - $elements['#suffix'] = '
'; - - $elements['add_more'] = [ - '#type' => 'submit', - '#name' => str_replace('-', '_', $id_prefix) . '_add_more', - '#value' => $delta > 0 ? $this->t('Add another item') : $this->t('Add item'), - '#attributes' => ['class' => ['field-add-more-submit']], - '#limit_validation_errors' => [], - '#submit' => [[static::class, 'addMoreSubmit']], - '#ajax' => [ - 'callback' => [static::class, 'addMoreAjax'], - 'wrapper' => $wrapper_id, - 'effect' => 'fade', - ], + if ($elements) { + $elements += [ + '#theme' => 'field_multiple_value_form', + '#field_name' => $field_name, + '#cardinality' => $cardinality, + '#cardinality_multiple' => $this->fieldDefinition->getFieldStorageDefinition()->isMultiple(), + '#required' => $this->fieldDefinition->isRequired(), + '#title' => $title, + '#description' => $description, + '#max_delta' => $max, ]; + // Add 'add more' button, if not working with a programmed form. + if ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED && !$form_state->isProgrammed()) { + $elements['#prefix'] = '
'; + $elements['#suffix'] = '
'; + + $elements['add_more'] = [ + '#type' => 'submit', + '#name' => strtr($id_prefix, '-', '_') . '_add_more', + // delta + 1 should equal the count since the array is 0 indexed. + '#value' => $this->formatPlural($delta + 1, 'Add item', 'Add another item'), + '#attributes' => ['class' => ['field-add-more-submit']], + '#limit_validation_errors' => [array_merge($parents, [$field_name])], + '#submit' => [[static::class, 'addMoreSubmit']], + '#ajax' => [ + 'callback' => [static::class, 'addMoreAjax'], + 'wrapper' => $wrapper_id, + 'effect' => 'fade', + ], + ]; + } } return $elements; @@ -498,7 +499,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] = $item->_original_delta ?? $delta; - unset($item->_original_delta, $item->_weight); + unset($item->_original_delta, $item->_weight, $item->_actions); } static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state); }