将类添加到包含['data']的Drupal表单元中


11

在Drupal 8中,渲染Tables仍然很像Drupal7。您在PHP中构建了行和列的多维数组,然后将Drupal 分别转换为a <tr><td>s。仍然存在令人困惑的Drupalism,'data'它使您可以将渲染数组元素添加为单元格数据(不要与数据属性相混淆)。

我得到了一个站点,开发人员选择使用“数据”来渲染单元格的内容,但是我无法弄清楚如何<td>在数据周围添加类。

我已经阅读了Table.php的源代码和文档,并且知道新版本,#wrapper_attributes 但是我无法破解。

我尝试了至少四种添加类的方法,但均无效果。

$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'],
  ],
];

Answers:


12

在笼统地写出问题之后,我又重新进行测试,并确定OP中具有'#wrapper_attributes'相同'data'元素级别的Option 5 确实可以工作。我相信Drupal 8会积极地缓存表格,因为即使经过,我的更改也没有显示出来drush cr

通过后端PHP向表中添加类的规则是:

  • 表类要求#attributes
  • TBODY内的TR行类需要#attributes
  • TBODY内的TD单元类需要#wrapper_attributes
  • THEAD / TFOOT中的TR行类require 'class''data'容器。
    既不在这里#attributes也不#wrapper_attributes工作。
  • THEAD / TFOOT中的TH / TD单元类需要'class''data'容器。
    既不在这里#attributes也不#wrapper_attributes工作。
  • 如果不覆盖树枝模板,则无法直接向<thead><tfoot>标签添加类。

这是将类添加到main内的<tr><td>标记<tbody>以及main <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',
  ],
];

您必须更改数据的实际结构,并引入两个级别的附加多维数组,以便利用'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,但使用您的上一个示例时,出现以下错误:
Adrian Cid 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行)中的无效渲染数组键。用户错误:“数据”是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

我刚刚找到了针对colspan的另一种解决方案,请在此处查看drupal.stackexchange.com/q/245710/28275
Adrian Cid Almaguer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.