如何在Drupal 9中通过钩子获取带分页视图的所有结果?
在Drupal 9中获取视图所有分页的节点数据方案
要获取视图所有分页的节点特定值并存入数组,可通过hook_views_post_execute钩子实现,该钩子在视图完成当前页查询后触发,既能获取全量结果,又不会影响原视图的分页展示。
具体实现步骤
- 在自定义模块的
.module文件中实现hook_views_post_execute - 复制原视图查询对象,修改分页参数获取全量结果
- 提取需要的字段值存入数组,可按需传递到模板或其他逻辑中
代码示例
function custom_module_views_post_execute(&$view) { // 仅针对目标视图和显示执行,替换为你的视图ID和显示ID if ($view->id() !== 'your_view_name' || $view->current_display !== 'page_1') { return; } // 复制查询对象,避免修改原视图的分页设置 $query = clone $view->query; // 设置获取所有结果,取消分页限制 $query->setItemsPerPage(0); $result = $query->execute(); // 提取目标字段值到数组(示例提取节点ID和标题) $all_nodes_data = []; foreach ($result as $row) { $node = $row->_entity; $all_nodes_data[] = [ 'nid' => $node->id(), 'title' => $node->getTitle(), // 自定义字段示例:$node->get('field_custom_field')->value ]; } // 将数组存储到视图对象,供后续逻辑调用 $view->all_nodes_data = $all_nodes_data; }
传递到模板(可选)
如果需要在视图模板中使用该数组,可配合hook_preprocess_views_view实现:
function custom_module_preprocess_views_view(&$variables) { $view = $variables['view']; if (isset($view->all_nodes_data)) { $variables['all_nodes_data'] = $view->all_nodes_data; } }
之后即可在视图模板(如views-view.html.twig)中通过{{ all_nodes_data }}访问该数组。
性能注意事项
- 若视图结果量极大(万级以上),全量查询可能引发性能问题,建议结合Drupal缓存API缓存结果:
// 在获取$result前添加缓存逻辑 $cache_id = 'custom_module:all_nodes:' . $view->id() . ':' . $view->current_display; if ($cache = \Drupal::cache()->get($cache_id)) { $all_nodes_data = $cache->data; } else { // 执行查询并提取数据的逻辑... // 缓存1小时 \Drupal::cache()->set($cache_id, $all_nodes_data, time() + 3600); }
内容的提问来源于stack exchange,提问作者Dimitris Petrogiannis
相关产品推荐
相关产品推荐

