Drupal 8の#table要素を使用してフォームのテーブルにデータを入力していますが、静的データを表示するのに最適です。
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.'),
);
ただし、次の例のように、テーブルの各行にコントロールを埋め込みます。
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.'),
);
ただし、#textboxフィールドは現在無視されており、その場所に空のセルが表示されます。
Drupalで生成されたテーブルにフィールドを埋め込む方法はありますか、または独自のテーブルを最初から作成する必要がありますか?
a)#rowsをフォームで使用しないでください。#table要素の各子要素は行であり、その行の各子要素はテーブルセルです。b)#textboxはDrupalコアには存在しません。たぶんあなたは#textfieldを意味しますか?
コメントをありがとう。a)関数getDataはデータベーステーブルを読み取り、オブジェクトの配列を返します。array_mapはオブジェクトを安全にマークアップされたデータの配列に変換するため、$ rowsは配列の配列です。b)私の間違い。いくつかの要素タイプを試しましたが、それらは単にtdタグの属性になります。たとえば、「<td#type = "textfield"> </ td>」です。テーブルへのフォームコントロールの埋め込みはサポートされていないのではないかと疑っています。
—
James Shields、2015
私はあなたが今言っていることを理解しています。
—
James Shields
#rows
テーブルがレンダリングされるときに要素が平文細胞のテーブルに変換されます。テーブルにコントロールを配置するには、行を#table
配列の直接要素として配置します。その後、テーブル内のすべてがコントロールとして扱われるため、プレーンテキストセルには#markup
エントリが必要です。