am de exemplu Nodul A cu alias nodul-a și Nodul B cu alias nodul-a/nodul-b asa pe al meu Nodul B Am acest pesmet Acasă > Nodul A > Nodul B
Rezultat GraphQl:
„pesmet”: [
{
"text": "Acasă",
„url”: {
"cale": "/",
„dirutat”: adevărat
}
},
{
"text": "Nodul A",
„url”: {
"cale": "http://example.com/node-a",
„dirutat”: adevărat
}
},
{
"text": "Nodul B",
„url”: {
"cale": "",
„dirutat”: adevărat
}
}
]
Dar când mă schimb Nodul A titlu obțin întotdeauna același rezultat (pesmetul nu s-a schimbat), dar când re-salvam nodul A sau ștergeți memoria cache pentru modificarea rezultatului graphQl.
Iată ce am încercat:
- Ștergeți memoria cache graphQl (rezultate și definiții) la actualizarea nodului:
/**
* Implementează hook_ENTITY_TYPE_update().
*/
funcția MYMODULE_node_update(EntityInterface $entity) {
// Ștergeți memoria cache graphql.
/** @var \Drupal\Core\Cache\CacheBackendInterface $graphql_results_cache */
$graphql_results_cache = \Drupal::service('cache.graphql.results');
$graphql_results_cache->invalidateAll();
/** @var \Drupal\Core\Cache\CacheBackendInterface $graphql_definitions_cache */
$graphql_definitions_cache = \Drupal::service('cache.graphql.definitions');
$graphql_definitions_cache->invalidateAll();
}
nu merge!
- Ștergeți memoria cache a tuturor nodurilor copil pe actualizarea nodului astfel:
/**
* Implementează hook_ENTITY_TYPE_update().
*/
funcția MYMODULE_node_update(EntityInterface $entity) {
$baza de date = \Drupal::baza de date();
// Obține alias-ul curent al căii nodului.
$alias = \Drupal::service('path_alias.manager')
->getAliasByPath('/node/' . $entity->id());
// Obține toate nodurile fii ale nodului curent.
$child_nodes_alias = $database->select('path_alias', 'pa')->fields('pa', [
'cale',
'alias',
])->condition('cale', '/node/%', 'LIKE')
->condition('alias', $alias . '%', 'LIKE')
->execute()
->fetchAll();
// Invalidează memoria cache pentru fiecare nod copil al nodului curent.
foreach ($child_nodes_alias ca $alias_data) {
$nid = explode('/', $alias_data->cale)[2] ?? NUL;
if ($nid && $nid != $entity->id()) {
$tags = ['nod:' . $nid];
Cache::invalidateTags($tags);
\Drupal::entityTypeManager()->getStorage('node')->resetCache([$nid]);
}
}
}
nici nu merge
- Am combinat cele două moduri anterioare, nici nu funcționează.
Când șterg toate cache-urile de pe actualizarea nodului, funcționează, dar nu este cel mai bun mod în care afectează memoria cache a site-ului.
/**
* Implementează hook_ENTITY_TYPE_update().
*/
funcția MYMODULE_node_update(EntityInterface $entity) {
drupal_flush_all_caches();
}
Care este cel mai bun mod de a șterge cache-ul breadcrumbs sau nodurile secundare fără a șterge tot cache-ul site-ului?
Editați | ×:
Mulțumesc @4K4 pentru comentariul tău, am încercat să adaug prea pe CacheTags, dar nici nu am funcționat!
/**
* Implementează hook_system_breadcrumb_alter().
*/
function MYMODULE_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMatchInterface $route_match, array $context) {
// Adăugați titlul paginii curente la breadcrumb pentru rutele non-admin.
if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {
$linkuri = $breadcrumb->getLinks();
foreach ($linkuri ca $link) {
$parametri = $link->getUrl()->getRouteParameters();
if ($parametri) {
// Asigurați-vă că breadcrumb este actualizat când titlul nodului se schimbă.
$breadcrumb->addCacheTags(['nod:' . $parameters['node']]);
$breadcrumb->addCacheContexts(['url']);
}
}
}
}
Notă: Pesmet ușor modul instalat.