特定のノードにビューを埋め込もうとしています。 Drupal 7とPHP-Templatesでこれを行うためのチュートリアルを見つけました:
_<?php print views_embed_view('view_name'); ?>
_
しかし、Drupal 8でtwig-Templatesを使用して方法を探します。views_embed_view()
でhook_node_view()
関数を呼び出し、それをノードを使用して、twig-Templateで出力できるようにしますが、このフックが呼び出されないようです。
Drupal 8の方法でこれを行う方法のヒント/解決策はありますか?
このモジュールでは、twig関数を使用してビューを埋め込むことができます。_{{ 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ベータ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() を使用することを検討してください
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 }}
ビュー内で、関連データを含むブロックを作成できます。
ブロックの作成後、目的のコンテンツ領域(フッター/ヘッダー/コンテンツ/その他)に表示されるようにブロックを割り当てることができます。それを割り当て、「構成」をクリックします。 「特定のページにブロックを表示する」ことができるはずです。 「リストされたページのみ」を選択し、ページ指定に/ node/your-node-numberを追加すると、そのビュー/ブロックが目的のノードでのみ表示されるように制限されます。
乾杯!
twigテンプレートを使用することをお勧めしますが、テンプレートで探索する必要がないように Views Reference Field モジュールを使用できます。また、利点コンテンツエディターがビュー/出力を構成できるように、フィールド化可能なエンティティにそれを追加できること。