Tabel: selecteer regels

Drupal 8

Sinds Drupal 8 bestaat een formulier element type table. Hiermee kan ook tabledrag en tableselect worden ingeschakeld in een zelf te maken formulier. Hieronder wordt tableselect uitgelegd.
Tableselect maakt een tabel waarin regels kunnen worden geselecteerd.

Het resultaat van onderstaande code is:

Het inputformulier

Het vakje vóór ‘Label’ kan gebruikt worden om alle regels in een keer te selecteren of juist te deselecteren.
Er zijn als voorbeeld twee regels geselecteerd.

De code

use Drupal\Component\Utility\String;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
 
 
/**
 * Form constructor for the administrative listing/overview form.
 */
function mymodule_admin_overview_form($form, FormStateInterface $form_state) {
  $options = [
    'field_rood' => ['label' => 'Rood'],
    'field_groen' => ['label' => 'Groen'],
    'field_wit' => ['label' => 'Wit'],
    'field_zwart' => ['label' => 'Zwart'],
  ];
 
  $form['mytable'] = [
    '#type' => 'table',
    '#header' => [$this->t('Label'), $this->t('Machine name')],
    '#tableselect' => TRUE,
    '#empty' => $this->t('There are no items yet. <a href="@add-url">Add an item.</a>', [
      '@add-url' => Url::fromRoute('mymodule.manage_add'),
    ]),
  // Vul de tabel rijen en kolommen.
  foreach ($options as $id => $option) {
    $form['mytable'][$id]['label'] = [
      '#plain_text' => $option['label'],
    ];
    $form['mytable'][$id]['name'] = [
      '#plain_text' => $id,
    ];
 
  $form['actions'] = ['#type' => 'actions'];
  $form['actions']['submit'] = [
    '#type' => 'submit',
    '#value' => $this->t('Save changes'),
  ];
  return $form;
}

Uitbreiding

Er kunnen ook meervoudige elementen in een tabel cel worden geplaatst. Gebruik de extra code fragmenten als voorbeeld.

Wijzig de #header in:

'#header' => [$this->t('Label'), $this->t('Machine name'), $this->t('Operations')],

Zet boven: ‘$form[‘actions’] …’ de volgende code:

    // Operations (dropbutton) kolom.
    $form['mytable'][$id]['operations'] = [
      '#type' => 'operations',
      '#links' => [],
    ];
    $form['mytable'][$id]['operations']['#links']['edit'] = [
      'title' => $this->t('Edit'),
      'url' => Url::fromRoute('mymodule.manage_edit', ['id' => $id]),
    ];
    $form['mytable'][$id]['operations']['#links']['delete'] = [
      'title' => $this->t('Delete'),
      'url' => Url::fromRoute('mymodule.manage_delete', ['id' => $id]),
    ];
  }

Handig

Een tabel kent geen ‘#title’ en geen ‘#description’ onderdelen. Deze zijn toch aan te maken met behulp van ‘#prefix’ en ‘#suffix’, ofwel tekst vóór het aangemaakte element en erna. Gebruik het onderstaande als idee.

    '#prefix' => '<legend><strong>' . $this->t($title) . '</strong></legend><br>',
    '#suffix' => '<div class="description">' . $this->t($description)</div>',