Drupal 8同一路由下渲染两个表格问题:合并后仅显示最后一个
解决Drupal 8同一路由下渲染两个表格仅显示最后一个的问题
我之前做Drupal开发时也踩过这个坑!你用array_merge合并两个表格渲染数组后只显示最后一个表格,核心原因是Drupal生成的表格渲染数组,其顶级键(比如#type、#header、#rows)都是相同的,而array_merge会直接覆盖键名重复的元素,前面的表格配置就被后面的完全覆盖了,所以最终只渲染第二个表格。
正确的做法:给每个表格分配独立的键名
你不需要用array_merge,而是把两个表格作为独立的子元素放到返回的渲染数组里,给它们设置不同的键名,这样Drupal的渲染系统会依次处理每个子元素,不会出现覆盖问题。修改你的控制器代码如下:
class AdminController extends ControllerBase { public function List() { // 注意:原代码里的DeafultList拼写错误,应该是DefaultList $DefaultList = $this->DefaultList(); $CustomList = $this->CustomList(); // 返回包含两个表格的数组,每个表格用唯一键名标识 return [ // 第一个表格:默认列表 'default_table' => $DefaultList, // 可以添加分隔元素,让两个表格更清晰 'table_separator' => [ '#markup' => '<div style="margin: 20px 0;"><hr></div>', ], // 第二个表格:自定义列表 'custom_table' => $CustomList, ]; } public function DefaultList() { $header = [ 'id' => t('ID'), // 补充你的其他表头字段 ]; $rows = []; // 省略你的表格行构建逻辑 return [ '#type' => 'table', '#title' => t('默认数据列表'), // 给表格添加标题,增强可读性 '#header' => $header, '#rows' => $rows, ]; } // CustomList方法为自定义表格构建逻辑 public function CustomList() { $header = [ // 自定义表头 ]; $rows = []; // 省略行构建逻辑 return [ '#type' => 'table', '#title' => t('自定义数据列表'), '#header' => $header, '#rows' => $rows, ]; } }
额外说明
- 键名唯一性:只要给两个表格分配不同的键名(比如
default_table和custom_table),Drupal就会分别渲染它们,不会互相覆盖。 - 容器包裹(可选):如果需要给两个表格添加统一的样式或结构,可以用
#type => container把它们包起来,比如:return [ '#type' => 'container', '#attributes' => ['class' => ['table-container']], 'default_table' => $DefaultList, 'custom_table' => $CustomList, ]; - 拼写修正:原代码里的
DeafultList是拼写错误,应该改为DefaultList,虽然这不是导致表格不显示的直接原因,但可能引发其他错误,建议修正。
内容的提问来源于stack exchange,提问作者user2527847
相关产品推荐
相关产品推荐

