['data']を含むDrupalテーブルセルにクラスを追加します


11

Drupal 8では、テーブルのレンダリングは依然としてDrupal 7によく似ています。PHPで行と列の多次元配列を構築し、Drupalがそれぞれa <tr><td>sに変換するようにします。この混乱するDrupalismはまだあります。これ'data'により、レンダー配列要素をセルデータとして追加できます(データ属性と混同しないでください)。

開発者が「データ」を使用してセルのコンテンツをレンダリングすることを選択したサイトを与えられましたが<td>、データの周囲にクラスを追加する方法がわかりません。

Table.phpのソースコードとドキュメントを読みましたが、新しいことは知っていますが、#wrapper_attributes これを解読することはできません。

私はクラスを追加するために少なくとも4つの方法を試しましたが、どれも機能しません。

$table['row-' . $row_id] = [

  // Option 1: Class appears on <tr> tag
  '#attributes' => [
    'class' => ['option-1-row-attributes'],
    'id' => 'row-' . $row_id,
    'no_striping' => TRUE,
  ],

  // Option 2: Class appears on <td> tag of first column. 
  'item' => [
    '#markup' => $row['my_item']->label(),
    '#wrapper_attributes' => [   
      'class' => ['option-2-markup-wrapper-attributes'],
    ],
  ],

  // In the following section, the only item that works is
  // the class on the <a> tag.
  'edit_operation' => [
    'data' => [
      '#type' => 'link',
      '#url' => Url::fromRoute('my_module.my_route', ['item' => $row_id]),
      '#title' => $this->t('Edit'),
      '#attributes' => [
        // Option 3: Class appears on the anchor tag
        'class' => ['use-ajax', 'option-3-link-attributes'],
        'data-dialog-type' => 'modal',
        'data-dialog-options' => Json::encode([
          'width' => 700,
        ]),
      ],
      // Option 4: Has no effect.
      '#wrapper_attributes' => [
        'class' => ['option-4-data-wrapper-attributes'],
      ],
    ],
    // Option 5: Update: This appears to be the correct solution! 
    // Class appears on the <td>.
    '#wrapper_attributes' => [
      'class' => ['option-5-wrapper-attributes'],
    ],
    // Option 6: Has no effect.
    '#attributes' => [
      'class' => ['option-6-attributes'],
    ],
    // Option 7: Has no effect.
    'class' => ['option-7-attributes'],
  ],
];

回答:


12

質問を一般的な用語で書き終えた後、もう一度テストに戻り、'#wrapper_attributes'同じレベルの'data'要素でOPのオプション5が機能することを確認しました。Drupal 8は積極的にテーブルをキャッシュしていたと思います。なぜなら、私の変更はの後でも表示されなかったからdrush crです。

バックエンドPHPを介してテーブルにクラスを追加するためのルールは次のとおりです。

  • テーブルクラスにはが必要#attributesです。
  • TBODY内のTR行クラスにはが必要#attributesです。
  • TBODY内のTDセルクラスにはが必要#wrapper_attributesです。
  • THEAD / TFOOT内のTR行クラスにはコンテナ'class''data'コンテナが必要です。
    どちら#attributes#wrapper_attributesここでは動作しません。
  • THEAD / TFOOT内のTH / TDセルクラスには'class''data'コンテナが必要です。
    どちら#attributes#wrapper_attributesここでは動作しません。
  • 小枝テンプレートを上書きせずに、<thead>または<tfoot>タグに直接クラスを追加する方法はありません。

次に、main内の<tr><td>タグと<tbody>メイン<table>タグ自体にクラスを追加する最も一般的な例を示します。

$table = [
  '#type' => 'table',
  '#attributes' => [
    'class' => ['table-class'],
  ],
  'row1' => [
    '#attributes' => [
      'class' => ['tr-class'],
    ],
    // Table data cell using 'data' for renderable elements.
    'column1' => [
      'data' => [
        '#type' => 'link', // Or any other renderable thing.
        '#attributes' => [
          'class' => ['link-class'],
        ],
        // Other elements required to render the link go here...
      ],
      '#wrapper_attributes' => [ // Watch out!
        'class' => ['td-class'],
      ],
    ],
    // Table data cell using '#markup'.
    'column2' => [
      '#markup' => '<span>' . $this->t('text') . '</span>',
      '#wrapper_attributes' => [   
        'class' => ['td-class'],
      ],
    ],
  ],
];

ことに注意してください'class'コンテナは、文字列や配列のいずれかを受け入れますが、私は常に配列を使用することをお勧め。

ここから、話はより複雑になります。THEAD / TFOOT領域内のTRまたはTD / THタグにクラスを追加する必要がある場合、ルールは完全に変更されます。また、内部やセクション#attributes#wrapper_attributes作業したり、それらを使用しようとしたりしても、非常に奇妙な効果が生じることは#headerありません#footer

Drupal 8のヘッダー/フッターデータ列を持つテーブルの最低限の構造は次のとおりです。

$table = [
  '#type' => 'table',
  // Produces <thead> <tr> <th>
  '#header' => [
    'Header 1',
    'Header 2',
    'Header 3',
  ],
  // Produces <tbody> <tr> <td>
  'row1' => [
    'Body 1',
    'Body 2',
    'Body 3',
  ],
  // Produces <tfoot> <tr> <td>
  '#footer' => [
    'Footer 1',
    'Footer 2',
    'Footer 3',
  ],
];

データの実際の構造を変更し、追加の多次元配列を2レベル'class'導入する必要があり'data'ます。これには、配列インデックスを導入する必要がある配列インデックスを活用するためです。これは、次の例に示すように、行要素とデータセル要素の両方に適用されます。

$table = [
  '#type' => 'table',
  // This example works the same way for '#footer'.
  '#header' => [
    // First, introduce an extra level to the array to provide a
    // place to store the class attribute on the <tr> element inside
    // the <thead>.
    [
      'class' => 'thead-tr-class',
      // Next place the columns inside a 'data' container, so that
      // the 'class' can be used.  '#wrapper_attributes' will not
      // work here.
      'data' => [
        // The following line produces data inside a <th>
        // without any class.
        'Header 1',

        // The following lines produce data inside a <th>
        // with a class: th-class.
        [
           'class' => 'th-class',
           'data' => 'Header 2',
           'colspan' => 2
        ],
      ],
    ],
  ],
];

上記の例の#header例では、以下が生成されます。

<table>
  <thead>
    <tr class="thead-tr-class">
      <th>Header 1</th>
      <th class="th-class" colspan="2">Header 2</th>
    </tr>
  </thead>
</table>

私はこのエラーを取得するテーブルヘッダーではcolspanを使用しようとしているが、あなたの最後の例を使用しています:
エイドリアンシドAlmaguer

ユーザーエラー:「0」はDrupal \ Core \ Render \ Element :: children()の無効なレンダー配列キーです(core / lib / Drupal / Core / Render / Element.phpの97行目)。ユーザーエラー:「クラス」は、Drupal \ Core \ Render \ Element :: children()の無効なレンダー配列キーです(core / lib / Drupal / Core / Render / Element.phpの行97)。ユーザーエラー:「data」はDrupal \ Core \ Render \ Element :: children()の無効なレンダー配列キーです(core / lib / Drupal / Core / Render / Element.phpの97行目)。ユーザーエラー:「colspan」は、Drupal \ Core \ Render \ Element :: children()の無効なレンダー配列キーです(core / lib / Drupal / Core / Render / Element.phpの行97)。
Adrian Cid Almaguer 2017

私はcolspanの別の解決策を見つけました。ここを見てくださいdrupal.stackexchange.com/q/245710/28275
Adrian Cid Almaguer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.