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_paragraph
und hook_preprocess_node
wie 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.
$view-buildRenderable()
in meiner Zweigdatei? Bei der Verwendung$view->preview()
könnte ich nur{{ content }}
in meiner Zweigvorlage tun, aber es funktioniert nicht.