diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php index 15ecaefb404a2c049fc248b267d828fb55fd6d59..cc13ae4413ab050c84b48ba8db19548b7f06cf4c 100644 --- a/core/lib/Drupal/Core/Field/WidgetBase.php +++ b/core/lib/Drupal/Core/Field/WidgetBase.php @@ -176,10 +176,21 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f // For multiple fields, title and description are handled by the wrapping // table. - $element = array( - '#title' => $is_multiple ? '' : $title, - '#description' => $is_multiple ? '' : $description, - ); + if ($is_multiple) { + $element = [ + '#title' => $title . ' ' . $this->t('(value @number)', ['@number' => $delta + 1]), + '#title_display' => 'invisible', + '#description' => '', + ]; + } + else { + $element = [ + '#title' => $title, + '#title_display' => 'before', + '#description' => $description, + ]; + } + $element = $this->formSingleElement($items, $delta, $element, $form, $form_state); if ($element) { @@ -189,7 +200,7 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f // defined by widget. $element['_weight'] = array( '#type' => 'weight', - '#title' => t('Weight for row @number', array('@number' => $delta + 1)), + '#title' => $this->t('Weight for row @number', array('@number' => $delta + 1)), '#title_display' => 'invisible', // Note: this 'delta' is the FAPI #type 'weight' element's property. '#delta' => $max, diff --git a/core/modules/field/src/Tests/FormTest.php b/core/modules/field/src/Tests/FormTest.php index dc2d7a97c4cadfa72bf2c5a8b2b7c383d0e36f0a..748d2ac24c143990f782c12b108b375ba17a6d76 100644 --- a/core/modules/field/src/Tests/FormTest.php +++ b/core/modules/field/src/Tests/FormTest.php @@ -10,6 +10,8 @@ use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\Form\FormState; +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; /** * Tests field form handling. @@ -316,6 +318,30 @@ function testFieldFormUnlimited() { // Test with several multiple fields in a form } + /** + * Tests the position of the required label. + */ + public function testFieldFormUnlimitedRequired() { + $field_name = $this->fieldStorageUnlimited['field_name']; + $this->field['field_name'] = $field_name; + $this->field['required'] = TRUE; + FieldStorageConfig::create($this->fieldStorageUnlimited)->save(); + FieldConfig::create($this->field)->save(); + entity_get_form_display($this->field['entity_type'], $this->field['bundle'], 'default') + ->setComponent($field_name) + ->save(); + + // Display creation form -> 1 widget. + $this->drupalGet('entity_test/add'); + // Check that the Required symbol is present for the multifield label. + $this->assertRaw(SafeMarkup::format('

@label

', array('@label' => $this->field['label'])), + 'Required symbol added field label.'); + // Check that the label of the field input is visually hidden and contains + // the field title and an indication of the delta for a11y. + $this->assertRaw(SafeMarkup::format('', array('@label' => $this->field['label'])), + 'Required symbol not added for field input.'); + } + /** * Tests widget handling of multiple required radios. */