Answers:
该模块允许使用细枝功能嵌入视图。
{{ views_embed_view('view_name', 'view_id') }}
上述模块已贬值,有利于
Twig Tweak模块提供了Twig扩展,其中包含一些有用的功能和过滤器,可以改善开发人员的体验。
例如: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>
你可以在这里找到view_machine_name
这就是它在Classy的Drupal 8 beta 12子主题中为我工作的方式。
在your_theme.info.theme文件中
function stjameskidsclub_preprocess_node(&$variables){
$stuff = views_embed_view('policy_documents', 'embed_1', 28);
$variables["my_view"] = \Drupal::service('renderer')->renderRoot($stuff);
}
我复制了node.html.twig,并用twig块包围了商品标签(或您要替换的区域)。我将其放置在/ template / content文件夹中。
{% block replace_area %}
<article{{ attributes.addClass(classes) }}>
...
</article>
{% endblock replace_area %}
然后,使用以下代码在/ template / content文件夹中创建一个node--2.html.twig(将2替换为所需的节点)。
{% extends "node.html.twig" %}
{% block replace_page %}
{{ my_view }}
{% endblock %}
您要解决的第一个问题是,默认情况下现在将默认缓存诸如节点之类的渲染实体,因此hook_node_view()在缓存清除/保存该节点后仅被调用一次。
但是,这很容易禁用,请参阅settings.local.php。
然后,将视图的输出放入$ build很简单,并且或多或少的工作就像在7.x中一样。代替使用embed函数,可以考虑使用$ views = Views :: getView(),然后使用$ views-> buildRenderable()
两个提示:
settings.local.php
并清除了所有缓存。但我的钩themename_node_view()
中themename.theme
仍然得到不叫。您知道为什么会这样吗?
正如Berdir 所指的是View-> buildRenderable是您要寻找的,但是要在模块中提供更多上下文,您需要执行以下操作。
//use core libraries
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
//use views class
use \Drupal\views\Views;
function hook_node_view(&$build, $node, $display, $view_mode){
$thisView = Views::getView('view_name');
$build['arbitrary_render_array_key_here'] = $thisView->buildRenderable('block_1',array($your_arguments));
}
然后,您可以在页面模板中使用
{{ page.content.theme_name_content }}
在视图中,您可以使用相关数据创建一个块。
创建块后,您可以分配块以显示在所需的内容区域(页脚/页眉/内容/等)中。分配它,然后单击“配置”。您应该能够“在特定页面上显示阻止”。选择“仅列出的页面”并将“ / node / your-node-number”添加到页面规范应将该视图/块限制为仅与所需的节点一起显示。
干杯!
views_embed_view()
我猜这种方法更容易,更清洁。