特定のノードにビューを埋め込む方法は?


13

特定のノードにビューを埋め込みます。Drupal 7およびPHPテンプレートでこれを行うためのチュートリアルを見つけました。

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

しかし、私はDrupal 8で小枝テンプレートを使用した方法を探しています。でviews_embed_view()関数を呼び出してhook_node_view()ノードに割り当て、twig-Templateで印刷できるようにしました。しかし、このフックは呼び出されないようです。

Drupal 8の方法でこれを行う方法のヒント/解決策はありますか?

回答:


19

小枝ビューの埋め込み

このモジュールにより、ビューを小枝関数で埋め込むことができます。

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

上記のモジュールは、

小枝の微調整

Twig Tweakモジュールは、開発者のエクスペリエンスを改善できるいくつかの便利な機能とフィルターを備えたTwig拡張機能を提供します。

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

ここで見つけることができますview_machine_name


@TiMESPLiNTERはあなたに頭を上げています。
いいえSssweat

いつから?バージョン?
ヴィシャールクマールサフ

1
@VishalKumarSahu、私の答えが投稿されて以来、16年3月18日。モジュールはまだ機能していると思いますが、それはもはやメンテナンスされていないか、それ以上開発されていないということです。
いいえSssweat

完全に完璧。それはうまく機能し、私はそれで良い経験をしている。ありがとう
ヴィシャール・クマール・サフ

Twig Tweak!良いモジュール
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をコピーし、articleタグ(または置換したい領域)を小枝ブロックで囲みました。これを/ 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のように多少なりとも動作します。代わりに、埋め込み機能を使用するのではなく、使用することを検討して$ビュー=ビュー:: getViewメソッド() 、次に$ビュー- > buildRenderable()

2つのヒント:

  • $ buildに使用するキーをhook_entity_extra_field_info()の追加フィールドとして利用可能にし、コンポーネントが有効になっている場合は表示を確認します(user_user_view()がそれを行う方法を参照してください。 UIと特定の表示モードで非表示にします。
  • ビューにページがある場合、ノードの出力がキャッシュされるため、少し複雑になります。キャッシュキーにページャーを認識させる必要があります。例についてはcomment_entity_build_defaults_alter()を参照してくださいビューではありませんが、コアが持っている最も近い例です)。

まず、このすばらしい答えのthx。さて、settings.local.phpすべてのキャッシュを「有効」にしてクリアしました。しかし、私のフックthemename_node_view()themename.themeまだ呼び出されません。なぜこれが当てはまるのか、ご存知ですか?
TiMESPLiNTER 14

1
settings.phpには、コメントを外す必要があるスニペットがあります(最後に)。settings.local.phpがロードされていることを確認するには、致命的なエラーを引き起こす無効なPHPを追加します。サイトが失敗しない場合、ファイルはロードされません。
ベルディール14

2

Berdirが示唆したように表示- > 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では1つのライナーでした。興味深いことです。
WM

0

ビュー内で、関連データを使用してブロックを作成できます。

ブロックの作成後、目的のコンテンツ領域(フッター/ヘッダー/コンテンツ/など)に表示するブロックを割り当てることができます。それを割り当て、「設定」をクリックします。「特定のページにブロックを表示する」ことができるはずです。「リストされたページのみ」を選択し、ページ仕様に/ node / your-node-numberを追加すると、そのビュー/ブロックが目的のノードでのみ表示されるように制限されます。

乾杯!


あなたの答えのためのTHX :-)。しかし、その後、私はそれぞれの場合にコンテンツ領域を作成する必要があります。したがって、最初のテキストが必要な場合は、ビューを表示し、次にテキストを表示します。または、最初にテキスト、次にビュー、または最初にビュー、次にテキストが必要な場合。次に、特定のノードtemapltesでレンダリングする3つの異なるコンテンツ領域を作成する必要があります。しかし、このviews_embed_view()アプローチははるかに簡単でわかりやすいと思います。
TiMESPLiNTER

0

小枝テンプレートを使用したいということは知っていますが、Views Reference Fieldモジュールを使用すると、テンプレートを掘り下げる必要がなくなります。また、コンテンツエディターがビュー/出力を構成できるように、フィールド化可能なエンティティに追加できるという利点もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.