埋め込みコントロール8 #table要素?


7

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

1
私はあなたが今言っていることを理解しています。#rowsテーブルがレンダリングされるときに要素が平文細胞のテーブルに変換されます。テーブルにコントロールを配置するには、行を#table配列の直接要素として配置します。その後、テーブル内のすべてがコントロールとして扱われるため、プレーンテキストセルには#markupエントリが必要です。
James Shields

回答:


12

フォーム要素をテーブルに配置しても問題ありません。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',
    );
  }

たぶんここから始めて、この例のコードを1つずつ実行して、いつコードが壊れるかを確認してください。


それが私が必要としていたことです。
James Shields、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.