function Table::preRenderTable

Same name in other branches
  1. 9 core/lib/Drupal/Core/Render/Element/Table.php \Drupal\Core\Render\Element\Table::preRenderTable()
  2. 8.9.x core/lib/Drupal/Core/Render/Element/Table.php \Drupal\Core\Render\Element\Table::preRenderTable()
  3. 10 core/lib/Drupal/Core/Render/Element/Table.php \Drupal\Core\Render\Element\Table::preRenderTable()

#pre_render callback to transform children of an element of #type 'table'.

This function converts sub-elements of an element of #type 'table' to be suitable for table.html.twig:

  • The first level of sub-elements are table rows. Only the #attributes property is taken into account.
  • The second level of sub-elements is converted into columns for the corresponding first-level table row.

Simple example usage:


$form['table'] = [
  '#type' => 'table',
  '#header' => [$this->t('Title'), ['data' => $this->t('Operations'), 'colspan' => '1']],
  // Optionally, to add tableDrag support:
  '#tabledrag' => [
    [
      'action' => 'order',
      'relationship' => 'sibling',
      'group' => 'thing-weight',
    ],
  ],
];
foreach ($things as $row => $thing) {
  $form['table'][$row]['#weight'] = $thing['weight'];

  $form['table'][$row]['title'] = [
    '#type' => 'textfield',
    '#default_value' => $thing['title'],
  ];

  // Optionally, to add tableDrag support:
  $form['table'][$row]['#attributes']['class'][] = 'draggable';
  $form['table'][$row]['weight'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Weight for @title', ['@title' => $thing['title']]),
    '#title_display' => 'invisible',
    '#size' => 4,
    '#default_value' => $thing['weight'],
    '#attributes' => ['class' => ['thing-weight']],
  );

  // The amount of link columns should be identical to the 'colspan'
  // attribute in #header above.
  $form['table'][$row]['edit'] = [
    '#type' => 'link',
    '#title' => $this->t('Edit'),
    '#url' => Url::fromRoute('entity.test_entity.edit_form', ['test_entity' => $row]),
  ];
}

Parameters

array $element: A structured array containing two sub-levels of elements. Properties used:

  • #tabledrag: The value is a list of $options arrays that are passed to drupal_attach_tabledrag(). The HTML ID of the table is added to each $options array.

Return value

array

See also

template_preprocess_table()

\Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments()

drupal_attach_tabledrag()

File

core/lib/Drupal/Core/Render/Element/Table.php, line 391

Class

Table
Provides a render element for a table.

Namespace

Drupal\Core\Render\Element

Code

public static function preRenderTable($element) {
    foreach (Element::children($element) as $first) {
        $row = [
            'data' => [],
        ];
        // Apply attributes of first-level elements as table row attributes.
        if (isset($element[$first]['#attributes'])) {
            $row += $element[$first]['#attributes'];
        }
        // Turn second-level elements into table row columns.
        // @todo Do not render a cell for children of #type 'value'.
        // @see https://www.drupal.org/node/1248940
        foreach (Element::children($element[$first]) as $second) {
            // Assign the element by reference, so any potential changes to the
            // original element are taken over.
            $column = [
                'data' => &$element[$first][$second],
            ];
            // Apply wrapper attributes of second-level elements as table cell
            // attributes.
            if (isset($element[$first][$second]['#wrapper_attributes'])) {
                $column += $element[$first][$second]['#wrapper_attributes'];
            }
            $row['data'][] = $column;
        }
        $element['#rows'][] = $row;
    }
    // Take over $element['#id'] as HTML ID attribute, if not already set.
    Element::setAttributes($element, [
        'id',
    ]);
    // Add sticky headers, if applicable.
    if (count($element['#header']) && $element['#sticky']) {
        $element['#attached']['library'][] = 'core/drupal.tableheader';
        $element['#attributes']['class'][] = 'sticky-header';
    }
    // If the table has headers and it should react responsively to columns hidden
    // with the classes represented by the constants RESPONSIVE_PRIORITY_MEDIUM
    // and RESPONSIVE_PRIORITY_LOW, add the tableresponsive behaviors.
    if (count($element['#header']) && $element['#responsive']) {
        $element['#attached']['library'][] = 'core/drupal.tableresponsive';
        // Add 'responsive-enabled' class to the table to identify it for JS.
        // This is needed to target tables constructed by this function.
        $element['#attributes']['class'][] = 'responsive-enabled';
    }
    // If the custom #tabledrag is set and there is an HTML ID, add the table's
    // HTML ID to the options and attach the behavior.
    if (!empty($element['#tabledrag']) && isset($element['#attributes']['id'])) {
        foreach ($element['#tabledrag'] as $options) {
            $options['table_id'] = $element['#attributes']['id'];
            drupal_attach_tabledrag($element, $options);
        }
    }
    return $element;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.