web-dev-qa-db-fra.com

Comment effacez-vous le cache sur un bloc lorsque le nœud de certains bundles est ajouté ou mis à jour?

Si vous souhaitez vider le cache sur un tableau de rendu lorsqu'un nœud est mis à jour, vous pouvez ajouter en tant que cache_tag, "node_list":

  '#cache' => [
    'tags' => ['node_list']
  ],

Mais il n'y a aucun moyen de le faire lorsque seuls les nœuds d'un certain ensemble sont ajoutés ou mis à jour.

Si vous avez un bloc, par exemple, et que vous souhaitez vider le cache dessus quand un nœud avec un "article" de bundle est ajouté ou mis à jour, comment feriez-vous cela?

6
oknate

Vous pouvez facilement créer une balise de cache personnalisée liée aux propriétés sur les nœuds en l'invalidant vous-même.

Basé sur cet article: https://www.drupal.org/project/views_custom_cache_tag

J'ai créé une balise personnalisée pour chaque type de nœud, qui est invalidée lors de la mise à jour du nœud:

/**
 * Implements hook_ENTITY_TYPE_presave().
 */
function mymodule_node_presave(Node $node) {
  // Allows for clearing of blocks based on node type.
  $tags = ['node_type:' . $node->getType()];
  Cache::invalidateTags($tags);
}

/**
 * Implements hook_ENTITY_TYPE_delete().
 */
function mymodule_node_delete(Node $node) {
  // Allows for clearing of blocks based on node type.
  $tags = ['node_type:' . $node->getType()];
  Cache::invalidateTags($tags);
}

Ensuite, dans mon tableau de build pour mon bloc, j'ai ajouté:

$build['#cache'] = [
  'tags' => [
    'node_type:article',
    'node_type:video'
  ],
];

Cela signifie que ce bloc ne sera actualisé que lorsque des nœuds de type "article" ou "vidéo" seront créés ou mis à jour.

Vous pouvez faire le même processus pour n'importe quelle propriété sur une entité, pas seulement un ensemble. Par exemple, si vous souhaitez qu'une liste de nœuds reste en cache à moins que les nœuds qu'elle contient ne modifient leur alias d'URL, vous pouvez ajouter du code qui vérifie si les alias d'URL changent, puis invalider votre nœud de balise: 123: url_alias ".

13
oknate

Pour d'autres ayant cette même question d'avoir des balises de cache basées sur un bundle, il existe un module "pratique" Handy Cache Tags qui fonctionne très bien. https://www.drupal.org/project/handy_cache_tags

1
Joshua Boltz