it-swarm.com.de

Wie löscht man den Cache eines Blocks, wenn ein Knoten eines bestimmten Bundles hinzugefügt oder aktualisiert wird?

Wenn Sie den Cache in einem Render-Array löschen möchten, wenn ein Knoten aktualisiert wird, können Sie als cache_tag "node_list" hinzufügen:

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

Es gibt jedoch keine Möglichkeit, dies zu tun, wenn nur Knoten eines bestimmten Bundles hinzugefügt oder aktualisiert werden.

Wenn Sie beispielsweise einen Block haben und den Cache darauf löschen möchten, wenn ein Knoten mit dem Paket "Artikel" hinzugefügt oder aktualisiert wird, wie würden Sie dies tun?

6
oknate

Sie können ganz einfach ein benutzerdefiniertes Cache-Tag erstellen, das sich auf Eigenschaften auf Knoten bezieht, indem Sie es selbst ungültig machen.

Basierend auf diesem Artikel: https://www.drupal.org/project/views_custom_cache_tag

Ich habe für jeden Knotentyp ein benutzerdefiniertes Tag erstellt, das bei der Knotenaktualisierung ungültig wird:

/**
 * 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);
}

Dann habe ich in meinem Build-Array für meinen Block hinzugefügt:

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

Dies bedeutet, dass dieser Block nur aktualisiert wird, wenn Knoten vom Typ "Artikel" oder "Video" erstellt oder aktualisiert werden.

Sie können den gleichen Vorgang für jede Eigenschaft einer Entität ausführen, nicht nur für ein Bündel. Wenn Sie beispielsweise möchten, dass eine Liste von Knoten zwischengespeichert bleibt, es sei denn, die darin enthaltenen Knoten ändern ihren URL-Alias, können Sie Code hinzufügen, der überprüft, ob sich die URL-Aliase ändern, und dann Ihren Tag-Knoten ungültig machen: 123: url_alias ".

13
oknate

Für andere mit derselben Frage, die Cache-Tags basierend auf dem Bundle haben möchten, gibt es ein "praktisches" Modul "Handy Cache Tags", das sehr gut funktioniert. https://www.drupal.org/project/handy_cache_tags

1
Joshua Boltz