如何在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显示的全局状态限制,支持同请求多次调用:
两处调用都替换为块显示ID即可正常输出。{{ drupal_view('product_content', 'block_1', node.id) }} - 强制复用page显示方案:手动重置视图状态
如果必须保留现有page_1显示不想新建,不要直接重复调用drupal_view(),在主题或模块的预处理函数中手动重置视图状态后分别渲染,示例代码:
预处理完成后,在Twig模板中直接输出/** * 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(); }{{ product_list_first }}和{{ product_list_second }}即可。
注意:如果视图开启了AJAX分页、无刷新筛选功能,同页重复渲染时需要给两个视图实例设置不同的DOM ID,否则前端JS逻辑会冲突,导致交互功能失效。
内容的提问来源于stack exchange,提问作者Mr. Kabir
相关产品推荐
相关产品推荐

