You are here

public function VideoEmbedWidget::formMultipleElements in Video 8

Same name and namespace in other branches
  1. 8.2 src/Plugin/Field/FieldWidget/VideoEmbedWidget.php \Drupal\video\Plugin\Field\FieldWidget\VideoEmbedWidget::formMultipleElements()

Overrides \Drupal\Core\Field\WidgetBase::formMultipleElements().

Special handling for draggable multiple widgets and 'add more' button.

Overrides FileWidget::formMultipleElements

File

src/Plugin/Field/FieldWidget/VideoEmbedWidget.php, line 115

Class

VideoEmbedWidget
Plugin implementation of the 'video_embed' widget.

Namespace

Drupal\video\Plugin\Field\FieldWidget

Code

public function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
  $field_name = $this->fieldDefinition
    ->getName();
  $cardinality = $this->fieldDefinition
    ->getFieldStorageDefinition()
    ->getCardinality();
  $parents = $form['#parents'];

  // Load the items for form rebuilds from the field state as they might not
  // be in $form_state->getValues() because of validation limitations. Also,
  // they are only passed in as $items when editing existing entities.
  $field_state = static::getWidgetState($parents, $field_name, $form_state);
  if (isset($field_state['items'])) {
    $items
      ->setValue($field_state['items']);
  }

  // Determine the number of widgets to display.
  switch ($cardinality) {
    case FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED:
      $field_state = static::getWidgetState($parents, $field_name, $form_state);
      $max = $field_state['items_count'];
      $is_multiple = TRUE;
      break;
    default:
      $max = $cardinality - 1;
      $is_multiple = $cardinality > 1;
      break;
  }
  $title = $this->fieldDefinition
    ->getLabel();
  $description = FieldFilteredMarkup::create(\Drupal::token()
    ->replace($this->fieldDefinition
    ->getDescription()));
  $elements = [];
  for ($delta = 0; $delta <= $max; $delta++) {

    // Add a new empty item if it doesn't exist yet at this delta.
    if (!isset($items[$delta])) {
      $items
        ->appendItem();
    }

    // For multiple fields, title and description are handled by the wrapping
    // table.
    if ($is_multiple) {
      $element = [
        '#title' => $this
          ->t('@title (value @number)', [
          '@title' => $title,
          '@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) {

      // Input field for the delta (drag-n-drop reordering).
      if ($is_multiple) {

        // We name the element '_weight' to avoid clashing with elements
        // defined by widget.
        $element['_weight'] = [
          '#type' => 'weight',
          '#title' => $this
            ->t('Weight for row @number', [
            '@number' => $delta + 1,
          ]),
          '#title_display' => 'invisible',
          // Note: this 'delta' is the FAPI #type 'weight' element's property.
          '#delta' => $max,
          '#default_value' => $items[$delta]->_weight ?: $delta,
          '#weight' => 100,
        ];
      }
      $elements[$delta] = $element;
    }
  }
  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()) {
      $id_prefix = implode('-', array_merge($parents, [
        $field_name,
      ]));
      $wrapper_id = Html::getUniqueId($id_prefix . '-add-more-wrapper');

      // $elements['#prefix'] = '<div id="' . $wrapper_id . '">';
      // $elements['#suffix'] = '</div>';
      $elements['add_more'] = [
        '#type' => 'submit',
        '#name' => strtr($id_prefix, '-', '_') . '_add_more',
        '#value' => t('Add another item'),
        '#attributes' => [
          'class' => [
            'field-add-more-submit',
          ],
        ],
        '#limit_validation_errors' => [
          array_merge($parents, [
            $field_name,
          ]),
        ],
        '#submit' => [
          [
            get_class($this),
            'addMoreSubmit',
          ],
        ],
        '#ajax' => [
          'callback' => [
            get_class($this),
            'addMoreAjax',
          ],
          'effect' => 'fade',
        ],
        '#weight' => 1000,
      ];
    }
  }
  if ($is_multiple) {

    // The group of elements all-together need some extra functionality after
    // building up the full list (like draggable table rows).
    $elements['#file_upload_delta'] = $delta;
    $elements['#process'] = [
      [
        get_class($this),
        'processMultiple',
      ],
    ];
    $elements['#field_name'] = $field_name;
    $elements['#language'] = $items
      ->getLangcode();
  }
  return $elements;
}