template_preprocess_field_multiple_value_form

template_preprocess_field_multiple_value_form(&$variables)

Prepares variables for individual form element templates.

Default template: field-multiple-value-form.html.twig.

Combines multiple values into a table with drag-n-drop reordering.

Parameters

array $variables: An associative array containing:

  • element: A render element representing the form element.

File

core/includes/theme.inc, line 1587
The theme system, which controls the output of Drupal.

Code

function template_preprocess_field_multiple_value_form(&$variables) {
  $element = $variables['element'];
  $variables['multiple'] = $element['#cardinality_multiple'];

  if ($variables['multiple']) {
    $table_id = Html::getUniqueId($element['#field_name'] . '_values');
    $order_class = $element['#field_name'] . '-delta-order';
    $header_attributes = new Attribute(array('class' => array('label')));
    if (!empty($element['#required'])) {
      $header_attributes['class'][] = 'js-form-required';
      $header_attributes['class'][] = 'form-required';
    }
    $header = array(
      array(
        'data' => array(
          '#prefix' => '<h4' . $header_attributes . '>',
          'title' => array(
            '#markup' => $element['#title'],
          ),
          '#suffix' => '</h4>',
        ),
        'colspan' => 2,
        'class' => array('field-label'),
      ),
      t('Order', array(), array('context' => 'Sort order')),
    );
    $rows = array();

    // Sort items according to '_weight' (needed when the form comes back after
    // preview or failed validation).
    $items = array();
    $variables['button'] = array();
    foreach (Element::children($element) as $key) {
      if ($key === 'add_more') {
        $variables['button'] = &$element[$key];
      }
      else {
        $items[] = &$element[$key];
      }
    }
    usort($items, '_field_multiple_value_form_sort_helper');

    // Add the items as table rows.
    foreach ($items as $item) {
      $item['_weight']['#attributes']['class'] = array($order_class);

      // Remove weight form element from item render array so it can be rendered
      // in a separate table column.
      $delta_element = $item['_weight'];
      unset($item['_weight']);

      $cells = array(
        array('data' => '', 'class' => array('field-multiple-drag')),
        array('data' => $item),
        array('data' => $delta_element, 'class' => array('delta-order')),
      );
      $rows[] = array(
        'data' => $cells,
        'class' => array('draggable'),
      );
    }

    $variables['table'] = array(
      '#type' => 'table',
      '#header' => $header,
      '#rows' => $rows,
      '#attributes' => array(
        'id' => $table_id,
        'class' => array('field-multiple-table'),
      ),
      '#tabledrag' => array(
        array(
          'action' => 'order',
          'relationship' => 'sibling',
          'group' => $order_class,
        ),
      ),
    );

    if (!empty($element['#description'])) {
      $description_id = $element['#attributes']['aria-describedby'];
      $description_attributes['id'] = $description_id;
      $variables['description']['attributes'] = new Attribute($description_attributes);
      $variables['description']['content'] = $element['#description'];

      // Add the description's id to the table aria attributes.
      $variables['table']['#attributes']['aria-describedby'] = $element['#attributes']['aria-describedby'];
    }
  }
  else {
    $variables['elements'] = array();
    foreach (Element::children($element) as $key) {
      $variables['elements'][] = $element[$key];
    }
  }
}
doc_Drupal
2016-10-29 09:46:40
Comments
Leave a Comment

Please login to continue.