You are here

public function WidgetBase::form in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/lib/Drupal/Core/Field/WidgetBase.php \Drupal\Core\Field\WidgetBase::form()

Creates a form element for a field.

If the entity associated with the form is new (i.e., $entity->isNew() is TRUE), the 'default value', if any, is pre-populated. Also allows other modules to alter the form element by implementing their own hooks.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: An array of the field values. When creating a new entity this may be NULL or an empty array to use default values.

array $form: An array representing the form that the editing element will be attached to.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

int $get_delta: Used to get only a specific delta value of a multiple value field.

Return value

array The form element array created for this field.

Overrides WidgetBaseInterface::form

File

core/lib/Drupal/Core/Field/WidgetBase.php, line 65
Contains \Drupal\Core\Field\WidgetBase.

Class

WidgetBase
Base class for 'Field widget' plugin implementations.

Namespace

Drupal\Core\Field

Code

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

  // Store field information in $form_state.
  if (!static::getWidgetState($parents, $field_name, $form_state)) {
    $field_state = array(
      'items_count' => count($items),
      'array_parents' => array(),
    );
    static::setWidgetState($parents, $field_name, $form_state, $field_state);
  }

  // Collect widget elements.
  $elements = array();

  // If the widget is handling multiple values (e.g Options), or if we are
  // displaying an individual element, just get a single form element and make
  // it the $delta value.
  if ($this
    ->handlesMultipleValues() || isset($get_delta)) {
    $delta = isset($get_delta) ? $get_delta : 0;
    $element = array(
      '#title' => $this->fieldDefinition
        ->getLabel(),
      '#description' => FieldFilteredMarkup::create(\Drupal::token()
        ->replace($this->fieldDefinition
        ->getDescription())),
    );
    $element = $this
      ->formSingleElement($items, $delta, $element, $form, $form_state);
    if ($element) {
      if (isset($get_delta)) {

        // If we are processing a specific delta value for a field where the
        // field module handles multiples, set the delta in the result.
        $elements[$delta] = $element;
      }
      else {

        // For fields that handle their own processing, we cannot make
        // assumptions about how the field is structured, just merge in the
        // returned element.
        $elements = $element;
      }
    }
  }
  else {
    $elements = $this
      ->formMultipleElements($items, $form, $form_state);
  }

  // Populate the 'array_parents' information in $form_state->get('field')
  // after the form is built, so that we catch changes in the form structure
  // performed in alter() hooks.
  $elements['#after_build'][] = array(
    get_class($this),
    'afterBuild',
  );
  $elements['#field_name'] = $field_name;
  $elements['#field_parents'] = $parents;

  // Enforce the structure of submitted values.
  $elements['#parents'] = array_merge($parents, array(
    $field_name,
  ));

  // Most widgets need their internal structure preserved in submitted values.
  $elements += array(
    '#tree' => TRUE,
  );
  return array(
    // Aid in theming of widgets by rendering a classified container.
    '#type' => 'container',
    // Assign a different parent, to keep the main id for the widget itself.
    '#parents' => array_merge($parents, array(
      $field_name . '_wrapper',
    )),
    '#attributes' => array(
      'class' => array(
        'field--type-' . Html::getClass($this->fieldDefinition
          ->getType()),
        'field--name-' . Html::getClass($field_name),
        'field--widget-' . Html::getClass($this
          ->getPluginId()),
      ),
    ),
    'widget' => $elements,
  );
}