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

如何在Drupal 9中通过钩子获取带分页视图的所有结果?

在Drupal 9中获取视图所有分页的节点数据方案

要获取视图所有分页的节点特定值并存入数组,可通过hook_views_post_execute钩子实现,该钩子在视图完成当前页查询后触发,既能获取全量结果,又不会影响原视图的分页展示。

具体实现步骤

  1. 在自定义模块的.module文件中实现hook_views_post_execute
  2. 复制原视图查询对象,修改分页参数获取全量结果
  3. 提取需要的字段值存入数组,可按需传递到模板或其他逻辑中

代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:13:16