Steuerelemente einbetten 8 #table element?

7

Ich verwende das Element Drupal 8 #table, um eine Tabelle in meinem Formular zu füllen, und es eignet sich hervorragend zum Anzeigen statischer Daten.

foreach ($entries = getData() as $entry) {
  $row = array_map('Drupal\Component\Utility\SafeMarkup::checkPlain', $entry);
  $rows[] = $row;
}
$form['table'] = array(
  '#type' => 'table',
  '#header' => $headers,
  '#rows' => $rows,
  '#attributes' => array('id' => 'my-module-list'),
  '#empty' => t('No entries available.'),
);

Ich möchte jedoch ein Steuerelement in jede Zeile der Tabelle einbetten, zum Beispiel:

foreach ($entries = getData() as $entry) {
  $row = array_map('Drupal\Component\Utility\SafeMarkup::checkPlain', $entry);
  $row["field_name"] = array(
    '#type' => 'textbox',
  );
  $rows[] = $row;
}
//dpm($rows);
$form['table'] = array(
  '#type' => 'table',
  '#header' => $headers,
  '#rows' => $rows,
  '#attributes' => array('id' => 'my-module-list'),
  '#empty' => t('No entries available.'),
);  

Das Feld #textbox wird derzeit jedoch ignoriert, und an seiner Stelle wird eine leere Zelle angezeigt.

Gibt es eine Möglichkeit, Felder in eine von Drupal generierte Tabelle einzubetten, oder muss ich meine eigene Tabelle von Grund auf neu erstellen?

James Shields
quelle
a) Verwenden Sie keine # Zeilen in Form. Jedes untergeordnete Element des # table-Elements ist eine Zeile und jedes untergeordnete Element dieser Zeile ist eine Tabellenzelle. b) #textbox existiert nicht im Drupal-Kern. Vielleicht meinst du #textfield?
Danke für die Kommentare. a) Die Funktion getData liest eine Datenbanktabelle und gibt ein Array von Objekten zurück. Die array_map konvertiert das Objekt in ein Array sicher markierter Daten, sodass $ rows ein Array von Arrays ist. b) Mein Fehler. Ich habe verschiedene Elementtypen ausprobiert, aber sie werden nur zu Attributen des td-Tags. Zum Beispiel "<td # type =" textfield "> </ td>". Mein Verdacht ist, dass das Einbetten von Formularsteuerelementen in die Tabelle nicht unterstützt wird.
James Shields
1
Ich verstehe, was du jetzt sagst. Das #rowsElement wird beim Rendern der Tabelle in eine Tabelle mit einfachen Textzellen konvertiert. Um Steuerelemente in die Tabelle einzufügen, fügen Sie die Zeilen als direkte Elemente des #tableArrays ein. Alles in der Tabelle wird dann als Steuerelement behandelt, sodass Klartextzellen einen #markupEintrag haben müssen .
James Shields

Antworten:

12

Es ist kein Problem, Formularelemente in eine Tabelle einzufügen. Siehe das Beispiel in core / lib / Drupal / Core / Render / Element / Table.php:

$form['contacts'] = array(
    '#type' => 'table',
    '#title' => 'Sample Table',
    '#header' => array('Name', 'Phone'),
  );

  for ($i=1; $i<=4; $i++) {
    $form['contacts'][$i]['name'] = array(
      '#type' => 'textfield',
      '#title' => t('Name'),
      '#title_display' => 'invisible',
    );

    $form['contacts'][$i]['phone'] = array(
      '#type' => 'tel',
      '#title' => t('Phone'),
      '#title_display' => 'invisible',
    );
  }

Vielleicht sollten Sie von hier aus beginnen und dann Schritt für Schritt Ihren Code in dieses Beispiel einfügen und sehen, wann er kaputt geht.

4k4
quelle
Genau das brauchte ich.
James Shields