web-dev-qa-db-ja.com

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

特定のノードにビューを埋め込もうとしています。 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の方法でこれを行う方法のヒント/解決策はありますか?

13
TiMESPLiNTER

Twig Views Embed

このモジュールでは、twig関数を使用してビューを埋め込むことができます。

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

上記のモジュールは減価償却された

小枝の微調整

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

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

あなたは_view_machine_name_ここにを見つけることができます

19
No Sssweat

これは、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 %}
5
George

あなたが戦っている最初の問題は、ノードのようなレンダリングされたエンティティがデフォルトでキャッシュされるようになったため、hook_node_view()は、そのノードのキャッシュのクリア/保存後に一度だけ呼び出されます。

ただし、これはかなり簡単に無効にできます。settings.local.phpを参照してください。

次に、ビューの出力を$ buildに配置するのはかなり簡単で、7.xとほぼ同じように機能します。 embed関数を使用する代わりに、 $ views = Views :: getView() を使用して、次に $ views-> buildRenderable() を使用することを検討してください

2つのヒント:

  • $ -buildに使用するキーを hook_entity_extra_field_info() の追加フィールドとして使用できるようにしてから、コンポーネントが有効になっているかどうかを確認します( ser_user_view() がどのように実行されるかを参照してください)。これにより、UIでビューのウェイト/配置を構成し、特定のビューモードで非表示にすることができます。
  • ビューにページがある場合、ノード出力がキャッシュされるため、ページは少し複雑になります。キャッシュキーにページャーを認識させる必要があります。例(ビューではありませんが、コアに最も近い例です)は comment_entity_build_defaults_alter() を参照してください。
4
Berdir

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 }}
2
ummdorian

ビュー内で、関連データを含むブロックを作成できます。

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

乾杯!

0
Luke Rehmann

twigテンプレートを使用することをお勧めしますが、テンプレートで探索する必要がないように Views Reference Field モジュールを使用できます。また、利点コンテンツエディターがビュー/出力を構成できるように、フィールド化可能なエンティティにそれを追加できること。

0
joekers