You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 11自定义视图代码添加字段后显示为空的解决求助

Drupal 11 自定义视图数据源显示为空的解决思路

1. 先核对hook_views_data的字段配置

你在custom_simple_data.module里写的hook_views_data(),得确保这几点:

  • base数组里的query_id必须和你的CustomSimpleDataQuery插件ID完全一致,不然视图找不到对应的查询逻辑
  • 每个字段的field.id要匹配字段类型:文本字段用basic,数字用numeric,别瞎填
  • 字段的键名(比如'id'、'name')要和你查询插件返回的行对象属性名完全对应

举个正确的配置例子:

function custom_simple_data_views_data() {
  $data['custom_simple_data']['table']['group'] = t('自定义简单数据');
  $data['custom_simple_data']['table']['base'] = [
    'title' => t('自定义简单数据'),
    'query_id' => 'custom_simple_data_query', // 和你的查询插件ID对齐
  ];

  $data['custom_simple_data']['id'] = [
    'title' => t('ID'),
    'field' => [
      'id' => 'numeric',
    ],
  ];

  $data['custom_simple_data']['name'] = [
    'title' => t('名称'),
    'field' => [
      'id' => 'basic',
    ],
  ];
  return $data;
}

2. 检查自定义查询插件的返回格式

你的CustomSimpleDataQuery的execute()方法,返回的$view->result得满足两个要求:

  • 每一行是对象,不是数组(Views默认只认对象属性)
  • 一定要设置$view->total_rows,还要调用$view->pager->updatePageInfo(),不然视图分页逻辑会判定没有数据,直接显示空

示例代码:

class CustomSimpleDataQuery extends ViewsQueryPluginBase {
  public function execute(ViewExecutable $view) {
    // 模拟生成数据
    $rows = [
      (object) ['id' => 1, 'name' => '测试项1'],
      (object) ['id' => 2, 'name' => '测试项2'],
    ];
    $view->result = $rows;
    // 这两行不能少!
    $view->total_rows = count($rows);
    $view->pager->updatePageInfo();
  }
}

3. 确认视图字段的别名设置

进视图编辑页面,点开你添加的字段的设置弹窗,检查「字段别名」(Field alias)是不是和你查询插件返回的行对象属性名一模一样。比如你返回的是$row->name,那别名就得是name,不能写错。

4. 清缓存!清缓存!清缓存!

Drupal的Views缓存贼顽固,改了hook_views_data或者查询插件后,必须清全站缓存:

  • 用drush的话就跑drush cr
  • 后台操作的话去「配置」→「性能」→「清除所有缓存」
  • 清完缓存后,记得重新进视图编辑页面点一下「保存并应用」,让视图加载最新的配置

5. 排查视图的显示和过滤设置

  • 看看视图的「格式」(比如表格、列表)是不是把所有字段都设成隐藏了
  • 检查「筛选器」「排序」设置,别不小心加了个把所有数据都过滤掉的条件
  • 看看「分页」设置,如果total_rows设对了但还是显示空,可能是分页设成了每页0条,或者页码选到了不存在的页

6. 调试字段取值逻辑

如果上面都没问题,那就加日志调试:
在custom_simple_data.module里加个hook_views_pre_render,打印行数据看看:

function custom_simple_data_views_pre_render(ViewExecutable $view) {
  foreach ($view->result as $row) {
    \Drupal::logger('custom_simple_data')->debug('行数据:@data', ['@data' => print_r($row, TRUE)]);
  }
}

如果日志里能看到字段有值,但视图还是不显示,那大概率是字段的显示设置被隐藏了,或者格式模板有问题(比如表格模板没渲染这个字段)。


内容的提问来源于stack exchange,提问作者KisukeJav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:53:21