埋め込みビューのキャッシュを無効にするにはどうすればよいですか?


7

繰り返しの段落フィールドを含むノードタイプ「記事」があります。段落タイプの1つで、エンティティ参照フィールドを使用してビューを埋め込むことができます。ビュー参照を含むArticleノードをレンダリングするときに、選択したビューを次のhook_preprocess_paragraphように埋め込みます。

$view_id = $paragraph->field_view->target_id;
$view = \Drupal\views\Views::getView($view_id);
$view->setDisplay('embed_1');
$vars['content'] = $view->preview();

これは、キャッシュを有効にする場合を除いて、正常に機能しています。たとえば、私のビューの1つは、「イベント」タイプのノードをリストします。新しいイベントを追加すると、キャッシュを消去するまでリストに表示されません。「イベント」を挿入/更新/削除するときにキャッシュを強制的に消去できますが、Drupal 8のキャッシュタグシステムを使用して、イベントリストを含むキャッシュされたコンテンツのみを無効にしたいと思います。問題は、それを機能させることができないことです。

これまでのところ私は、ノード、ビュー、および段落にキャッシュタグを追加しようとしているhook_preprocess_paragraphhook_preprocess_node、このように:

$vars['paragraph']->addCacheTags(['node_list']);
...
$view->storage->addCacheTags(['node_list']);
...
$vars['node']->addCacheTags(['node_list']);

このページに よればnode_list、ノードが更新されるたびにキャッシュを無効にするノードリストに使用できます。しかし、効果はありません。多分、前処理フックはキャッシュタグを追加するのが遅いのでしょうか?

何が欠けていますか?

編集:

さらにテストを行ったところ、イベントを編集すると変更がリストに表示され、イベントを削除するとリストから消えることがわかりました。この問題は、新しいイベントを追加するときにのみ発生します。

回答:


9

を使用してみてください。これによりbuildRenderable()、必要なキャッシュ可能性メタデータが自動的に追加されます。

$vars['content'] = $view->buildRenderable();

ヒント:あなたは私のビューのカスタムキャッシュタグプロジェクトに興味があるかもしれません。イベントが変更されたときにのみビューが変更される場合でも、node_listキャッシュタグは、ノードのタイプが保存されるたびに無効になります。プロジェクトページに示すように、そのモジュールと少しのカスタムコードを使用すると、キャッシュの無効化が少なくなり、パフォーマンスが向上します。


$view-buildRenderable()twigファイルの結果をレンダリングするにはどうすればよいですか?使用するときは、twigテンプレートで$view->preview()実行できます{{ content }}が、機能しません。
reekris

1
それはレンダー配列を返します、それはうまくいくはずです。埋め込みディスプレイを使用していますか?もしそうなら、私は最近そこにコアバグを見つけました、drupal.org/node/2711973を参照してください。回避策として、$ variables ['content']に#embed => TRUEを設定するだけです。
Berdir

はい、埋め込みディスプレイを使用しています。手動で#embed => trueに設定するとうまくいきます。Berdir、ありがとう!間違いなくあなたのモジュールもチェックアウトします。
reekris

3

オブジェクトではなく、キャッシュタグをレンダー配列に追加します。

$vars['#cache']['tags'][] = 'node_list';

前処理では、オブジェクトではなくレンダー配列を操作します。ドキュメントのこのページを見てください:https : //www.drupal.org/developing/api/8/render/arrays/cacheability


それを片付けてくれてありがとう!私の問題については、Berdirs回答がキャッシュタグを手動で追加することなく問題を修正しました。
reekris

フィードバックをお寄せいただきありがとうございます。私は同意します、それは@Berdirからの素晴らしい答えです。私も賛成した。
4k4

0

モジュールViews Custom Cache Tagを使用して同様の問題を解決しました:

ビューエディターの[詳細設定]で、[キャッシュ]をクリックし、[カスタムタグベース]を選択します。ノードが変更されるたびにビューを再レンダリングするには、カスタムタグ設定に「node_list」と入力します。

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