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);
}