Wie mache ich den Cache einer eingebetteten Ansicht ungültig?

7

Ich habe einen Knotentyp "Artikel", der ein sich wiederholendes Absatzfeld enthält . Bei einem der Absatztypen kann der Benutzer eine Ansicht mithilfe eines Entitätsreferenzfelds einbetten. Beim Rendern eines Artikelknotens mit einer Ansichtsreferenz bettete ich die ausgewählte Ansicht folgendermaßen ein 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();

Dies funktioniert einwandfrei, außer wenn ich das Caching aktiviere. In einer meiner Ansichten sind beispielsweise Knoten vom Typ "Ereignis" aufgeführt. Wenn ich ein neues Ereignis hinzufüge, wird es erst in der Liste angezeigt, wenn ich den Cache bereinige. Ich könnte das Löschen des Caches beim Einfügen / Aktualisieren / Löschen eines "Ereignisses" erzwingen, aber ich würde viel lieber das Cache-Tag-System von Drupal 8 verwenden und nur den zwischengespeicherten Inhalt ungültig machen, der Ereignislisten enthält. Das Problem ist, dass ich es nicht zum Laufen bringen kann.

Bisher habe ich versucht , Cache - Tags an den Knoten hinzufügen, die Ansicht und den Absatz in hook_preprocess_paragraphund hook_preprocess_nodewie folgt aus :

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

Laut dieser Seite node_list kann für Knotenlisten verwendet werden, um den Cache bei jeder Aktualisierung eines Knotens ungültig zu machen. Aber es hat keine Wirkung. Vielleicht sind die Preprocess-Hooks zu spät, um Cache-Tags hinzuzufügen?

Was vermisse ich?

Bearbeiten:

Nach einigen weiteren Tests stellte ich fest, dass die Änderungen beim Bearbeiten eines Ereignisses in der Liste angezeigt werden und beim Entfernen eines Ereignisses aus der Liste verschwinden. Das Problem tritt nur beim Hinzufügen neuer Ereignisse auf.

reekris
quelle

Antworten:

9

Versuchen Sie zu verwenden buildRenderable(), um sicherzustellen, dass die erforderlichen Cacheability-Metadaten automatisch hinzugefügt werden.

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

Hinweis: Möglicherweise interessieren Sie sich für mein Views Custom Cache Tag- Projekt. Das Cache-Tag node_list wird jedes Mal ungültig, wenn ein Knotentyp gespeichert wird, obwohl sich Ihre Ansicht nur ändert, wenn sich ein Ereignis ändert. Wenn Sie dieses Modul und ein wenig benutzerdefinierten Code verwenden, wie auf der Projektseite gezeigt, haben Sie weniger Cache-Ungültigmachungen und eine bessere Leistung.

Berdir
quelle
Wie rendere ich die Ergebnisse $view-buildRenderable()in meiner Zweigdatei? Bei der Verwendung $view->preview()könnte ich nur {{ content }}in meiner Zweigvorlage tun, aber es funktioniert nicht.
reekris
1
Es gibt ein Render-Array zurück, das gut funktionieren sollte. Verwenden Sie ein eingebettetes Display? Wenn ja, habe ich dort kürzlich einen Kernfehler gefunden, siehe drupal.org/node/2711973 . Um dieses Problem zu umgehen, setzen Sie einfach #embed => TRUE in $ variables ['content'].
Berdir
Ja, ich verwende eingebettete Anzeigen und die manuelle Einstellung von #embed => true funktioniert hervorragend! Danke Berdir! Ich werde auf jeden Fall auch Ihr Modul überprüfen.
reekris
3

Fügen Sie das Cache-Tag zum Render-Array hinzu, nicht zum Objekt:

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

In der Vorverarbeitung arbeiten Sie mit Render-Arrays, nicht mit Objekten. Schauen Sie sich diese Seite der Dokumentation an: https://www.drupal.org/developing/api/8/render/arrays/cacheability

4k4
quelle
Danke, dass du das geklärt hast! Bei meinem Problem hat Berdirs Antwort mein Problem behoben, ohne dass Cache-Tags manuell hinzugefügt werden müssen.
reekris
Danke für die Rückmeldung. Ich stimme zu, das ist eine großartige Antwort von @Berdir. Ich habe es auch positiv bewertet.
4k4
0

Ich habe ein ähnliches Problem mit dem Modul Views Custom Cache Tag gelöst :

Klicken Sie im Ansichtseditor unter Erweitert auf Cache und wählen Sie dann "Benutzerdefiniertes Tag basierend" aus. Geben Sie in den benutzerdefinierten Tag-Einstellungen 'node_list' ein, damit die Ansicht bei jedem Knotenwechsel erneut gerendert wird.

Hendrik
quelle