у меня например Узел А с псевдонимом узел-а и Узел Б с псевдонимом узел-а/узел-б так что на моем Узел Б у меня есть эта хлебная крошка Главная > Узел А > Узел Б
Результат GraphQl:
"хлебные крошки": [
{
"текст": "Дом",
"адрес": {
"дорожка": "/",
"маршрутизирован": правда
}
},
{
"текст": "Узел А",
"адрес": {
"путь": "http://example.com/node-a",
"маршрутизирован": правда
}
},
{
"текст": "Узел B",
"адрес": {
"дорожка": "",
"маршрутизирован": правда
}
}
]
Но когда я меняю Узел А title я всегда получаю один и тот же результат (хлебные крошки не изменились), но когда я повторно сохраняю узел А или очистить кэш изменения результата graphQl.
Вот что я пробовал:
- Очистите кэш graphQl (результаты и определения) при обновлении узла:
/**
* Реализует hook_ENTITY_TYPE_update().
*/
функция MYMODULE_node_update (EntityInterface $ сущность) {
// Очистить кэш 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();
}
это не работает!
- Очистите кеш всех дочерних узлов при обновлении узла следующим образом:
/**
* Реализует hook_ENTITY_TYPE_update().
*/
функция MYMODULE_node_update (EntityInterface $ сущность) {
$database = \Drupal::database();
// Получить текущий псевдоним пути к узлу.
$alias = \Drupal::service('path_alias.manager')
->getAliasByPath('/node/' . $entity->id());
// Получить все дочерние узлы текущего узла.
$child_nodes_alias = $database->select('path_alias', 'pa')->fields('pa', [
'дорожка',
'псевдоним',
])->условие('путь', '/узел/%', 'НРАВИТСЯ')
->условие('псевдоним', $псевдоним . '%', 'НРАВИТСЯ')
->выполнить()
->выбрать все();
// Недействительный кеш для каждого дочернего узла текущего узла.
foreach ($child_nodes_alias как $alias_data) {
$nid = взорвать('/', $alias_data->path)[2] ?? НОЛЬ;
если ($nid && $nid != $entity->id()) {
$теги = ['узел:' . $нид];
Кэш::invalidateTags($tags);
\Drupal::entityTypeManager()->getStorage('node')->resetCache([$nid]);
}
}
}
это тоже не работает
- Я объединил два предыдущих способа, это тоже не работает.
Когда я очищаю все кеши при обновлении узла, это работает, но это не лучший способ повлиять на кеш сайта.
/**
* Реализует hook_ENTITY_TYPE_update().
*/
функция MYMODULE_node_update (EntityInterface $ сущность) {
drupal_flush_all_caches();
}
Каков наилучший способ очистить кэш хлебных крошек или дочерние узлы без очистки всего кеша сайта?
Редактировать:
Спасибо @4K4 за ваш комментарий, я пытался добавить CacheTags в хлебные крошки, но у меня тоже не получилось!
/**
* Реализует hook_system_breadcrumb_alter().
*/
function MYMODULE_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMatchInterface $route_match, массив $context) {
// Добавляем заголовок текущей страницы в навигационную цепочку для маршрутов без прав администратора.
if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {
$links = $breadcrumb->getLinks();
foreach ($ ссылки как $ ссылка) {
$parameters = $link->getUrl()->getRouteParameters();
если ($ параметры) {
// Убедитесь, что навигационная цепочка обновляется при изменении заголовка узла.
$breadcrumb->addCacheTags(['узел:' . $parameters['узел']]);
$breadcrumb->addCacheContexts(['url']);
}
}
}
}
Примечание: Легкая хлебная крошка модуль установлен.