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
相关产品推荐
相关产品推荐

