如何在特定节点中嵌入视图?


13

我尝试在特定节点中嵌入视图。我找到了使用Drupal 7和PHP模板进行此操作的教程:

<?php print views_embed_view('view_name'); ?>

但是我在Drupal 8中使用树枝模板寻找一种方法。我尝试在中调用该views_embed_view()函数hook_node_view()并将其分配给节点,以便可以在树枝模板中将其打印出来。但是似乎这个钩子永远都不会被调用。

任何提示/解决方案如何以Drupal 8方式执行此操作?

Answers:


19

树枝视图嵌入

该模块允许使用细枝功能嵌入视图。

{{ views_embed_view('view_name', 'view_id') }}

上述模块已贬值,有利于

嫩枝调整

Twig Tweak模块提供了Twig扩展,其中包含一些有用的功能和过滤器,可以改善开发人员的体验。

例如: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

你可以在这里找到view_machine_name


@TiMESPLiNTER只是提醒您。
No Sssweat

从何时起?版?
维沙尔·库马尔·萨胡

1
自从我的答案发布后,@ VishalKumarSahu,16年3月18日。我认为该模块仍然有效,只是不再维护或进一步开发它。
没有Sssweat

完全完美。它效果很好,我对此有很好的经验。谢谢
Vishal Kumar Sahu

嫩枝调整!好的模块
Harish ST

5

这就是它在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 %}

4

您要解决的第一个问题是,默认情况下现在将默认缓存诸如节点之类的渲染实体,因此hook_node_view()在缓存清除/保存该节点后仅被调用一次。

但是,这很容易禁用,请参阅settings.local.php。

然后,将视图的输出放入$ build很简单,并且或多或少的工作就像在7.x中一样。代替使用embed函数,可以考虑使用$ views = Views :: getView(),然后使用$ views-> buildRenderable()

两个提示:

  • hook_entity_extra_field_info()中将用于$ build的键作为额外字段提供,然后检查显示是否启用了组件(请参阅user_user_view()如何做到这一点。这允许您在视图中配置视图的权重/位置)。用户界面,并在某些视图模式下将其隐藏。
  • 如果您的视图有一个页面,那么它会有点复杂,因为节点输出将被缓存。然后,您需要使高速缓存键知道寻呼机,请参见comment_entity_build_defaults_alter()作为示例(不是视图,但这是内核拥有的最接近的示例)。

首先感谢这个好答案。好吧,我“启用”了settings.local.php并清除了所有缓存。但我的钩themename_node_view()themename.theme仍然得到不叫。您知道为什么会这样吗?
TiMESPLiNTER 2014年

1
settings.php中有一个片段,您需要取消注释(最后)。要确保已加载settings.local.php,请添加无效的PHP,导致致命错误。如果您的网站没有失败,则不会加载该文件。
2014年

2

正如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 }}

1
所有这些都是Drupal 7中的单个衬板。有趣。
WM

0

在视图中,您可以使用相关数据创建一个块。

创建块后,您可以分配块以显示在所需的内容区域(页脚/页眉/内容/等)中。分配它,然后单击“配置”。您应该能够“在特定页面上显示阻止”。选择“仅列出的页面”并将“ / node / your-node-number”添加到页面规范应将该视图/块限制为仅与所需的节点一起显示。

干杯!


谢谢你的回答:-)。但是然后我必须为每种情况创建一个内容区域。因此,如果我喜欢第一个文本,请先查看,然后再输入文本。或者,如果我想先添加文字,然后再添加视图,或者先添加视图,再再添加文本。然后,我必须创建3个不同的内容区域,并在特定的节点temapltes中进行渲染。但是views_embed_view()我猜这种方法更容易,更清洁。
TiMESPLiNTER 2014年

0

我知道您提到您想使用树枝模板,但是可以使用“ 视图参考字段”模块来避免在模板中进行挖掘。还具有能够将其添加到任何可设置字段的实体的优点,以便内容编辑器可以配置视图/输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.