web-dev-qa-db-fra.com

Comment invalider le cache d'une vue intégrée?

J'ai un type de nœud "Article" qui contient un champ répétitif Paragraphs . L'un des types de paragraphe permet à l'utilisateur d'incorporer une vue à l'aide d'un champ de référence d'entité. Lors du rendu d'un nœud Article contenant une référence de vues, j'incorpore la vue sélectionnée dans hook_preprocess_paragraph comme ça:

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

Cela fonctionne bien sauf lorsque j'active la mise en cache. Par exemple, une de mes vues répertorie les nœuds de type "Evénement". Lorsque j'ajoute un nouvel événement, il n'apparaît pas dans la liste tant que je n'ai pas nettoyé le cache. Je pourrais forcer le nettoyage du cache lors de l'insertion/la mise à jour/la suppression d'un "événement", mais je préfère de loin utiliser le système de balises de cache Drupal 8 et invalider uniquement le contenu mis en cache qui contient des listes d'événements. Le problème est Je ne peux pas le faire fonctionner.

Jusqu'à présent, j'ai essayé d'ajouter des balises de cache au nœud, à la vue et au paragraphe dans hook_preprocess_paragraph et hook_preprocess_node comme ça:

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

Selon cette pagenode_list peut être utilisé pour les listes de nœuds pour invalider le cache chaque fois qu'un nœud est mis à jour. Mais cela n'a aucun effet. Peut-être que les crochets de prétraitement sont trop tard pour ajouter des balises de cache?

Qu'est-ce que je rate?

Modifier:

Après quelques tests supplémentaires, j'ai constaté que si je modifiais un événement, les changements pouvaient être vus dans la liste et si je supprimais un événement, il disparaissait de la liste. Le problème se produit uniquement lors de l'ajout de nouveaux événements.

7
reekris

Essayez d'utiliser buildRenderable(), qui devrait garantir que les métadonnées de mise en cache nécessaires sont ajoutées automatiquement.

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

Astuce: Vous pourriez être intéressé par mon projet Views Custom Cache Tag . La balise de cache node_list est invalidée chaque fois qu'un type de nœud est enregistré, même si votre vue ne change que lorsqu'un événement change. En utilisant ce module et un peu de code personnalisé comme indiqué sur la page du projet, vous avez moins d'invalidités de cache et de meilleures performances.

9
Berdir

Ajoutez la balise de cache au tableau de rendu, pas à l'objet:

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

En prétraitement, vous travaillez avec des tableaux de rendu, pas avec des objets. Regardez cette page de la documentation: https://www.drupal.org/developing/api/8/render/arrays/cacheability

3
4k4

J'ai résolu un problème similaire en utilisant le module Vues Tag de cache personnalisé :

Dans l'éditeur de vue, sous Avancé, cliquez sur Cache, puis sélectionnez "Basé sur une balise personnalisée". Pour que la vue soit rendue de nouveau chaque fois qu'un nœud est modifié, saisissez "liste_noeuds" dans les paramètres de balise personnalisée.

0
Hendrik