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

如何在Drupal模板中使用drupal_view多次输出相同内容?

问题原因

Drupal自带的drupal_view() Twig函数调用视图时,page类型的视图显示默认带全局执行状态标记:第一次渲染完成后,视图实例的执行状态、分页静态缓存、参数匹配标记不会自动重置,同请求内第二次用相同参数调用同个page显示时,会直接返回空渲染数组。这是视图page显示的设计逻辑——它本身就是为单页面单次输出设计的,没有考虑同请求多次调用的场景。

可行调整方案
  • 最简便方案:复用渲染结果
    如果两处展示的内容完全一致、不需要做差异化渲染,直接把第一次调用的结果存为Twig变量复用即可,还能避免重复查库提升性能:
    {# 提前渲染视图存入变量 #}
    {% set product_list = drupal_view('product_content', 'page_1', node.id) %}
    {# 第一个展示位置 #}
    {{ product_list }}
    {# 第二个展示位置 #}
    {{ product_list }}
    
  • 最稳定方案:更换视图显示类型
    不要用page_1这个页面显示,在视图编辑页新建一个**块(Block)**类型的显示,复制原page_1的字段、过滤、排序配置,得到新的显示ID(一般是block_1),块显示没有page显示的全局状态限制,支持同请求多次调用:
    {{ drupal_view('product_content', 'block_1', node.id) }}
    
    两处调用都替换为块显示ID即可正常输出。
  • 强制复用page显示方案:手动重置视图状态
    如果必须保留现有page_1显示不想新建,不要直接重复调用drupal_view(),在主题或模块的预处理函数中手动重置视图状态后分别渲染,示例代码:
    /**
     * Implements hook_preprocess_node()
     */
    function 你的主题名_preprocess_node(&$variables) {
      $node = $variables['node'];
      // 渲染第一份视图内容
      $view_first = \Drupal\views\Views::getView('product_content');
      $view_first->setDisplay('page_1');
      $view_first->setArguments([$node->id()]);
      $view_first->execute();
      $variables['product_list_first'] = $view_first->buildRenderArray();
    
      // 渲染第二份视图内容,必须重新初始化视图实例
      $view_second = \Drupal\views\Views::getView('product_content');
      $view_second->setDisplay('page_1');
      $view_second->setArguments([$node->id()]);
      $view_second->preExecute(); // 重置执行状态,清空静态缓存
      $view_second->execute();
      $variables['product_list_second'] = $view_second->buildRenderArray();
    }
    
    预处理完成后,在Twig模板中直接输出{{ product_list_first }}和{{ product_list_second }}即可。

注意:如果视图开启了AJAX分页、无刷新筛选功能,同页重复渲染时需要给两个视图实例设置不同的DOM ID,否则前端JS逻辑会冲突,导致交互功能失效。

内容的提问来源于stack exchange,提问作者Mr. Kabir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:15:45