На моем веб-сайте пользователи могут собирать «баллы» с течением времени. У меня есть меню верхней панели с некоторыми ссылками (например, «дом», «профиль», «выход»). Я хочу изменить пункт меню «профиль» и добавить количество точек, принадлежащих текущему подключенному пользователю.
Я попробовал несколько крючков, и мне почти удалось получить то, что я хотел с hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
Я очистил кеш (с drush cr
), и пункт меню показывает значение, которое я хочу. Но если значение изменяется по какой-либо причине, оно показывает старое значение. Я должен очистить кэш все время, чтобы обновить его значение.
Как я могу избежать очистки кеша, чтобы обновлять заголовок меню каждый раз, когда меняются баллы, полученные от пользователя?
navigation
Матье Лопес
источник
источник
Ответы:
Я предлагаю реализовать пользовательский плагин ссылки меню. Код ниже предполагает, что ваше имя модуля является примером .
Если вы не хотите внедрять службу базы данных, класс станет намного проще.
Далее вам нужно поместить определение ссылки в файл example.links.menu.yml .
Проблема кеширования
Всякий раз, когда количество пунктов изменяется, кэш ссылок меню должен быть аннулирован следующим образом.
Вам нужно найти правильное место для этого. Если точки, управляемые добавленным модулем, проверяют API модуля и выбирают соответствующий хук ( hook_points_insert () , hook_points_delete () и т. Д.).
Поскольку количество баллов рассчитывается для каждой учетной записи индивидуально, вы можете рассмотреть возможность использования тегов кэша для каждой учетной записи (что-то вроде
['example.points_count.' . $uid]
). Поэтому кеш будет сохранен для пользователей с неизменными баллами.Для генерации кода для плагина «Меню» я использовал Drupal Code Generator .
источник
Я столкнулся с той же проблемой. Элементы меню кэшируются, поэтому всегда отображается старое значение, пока вы не очистите кэш. Альтернативным способом является использование
hook_page_attachments()
, прикрепление точек к drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE, доступ к ним в JavaScript и рендеринг в браузере.Обычным способом является отключение кэша для страниц всякий раз, когда отображается меню «Профиль» при производительности сайта.
источник
Отключите кэш для этого меню
hook_preprocess_menu()
, установив$variables['#cache']['max-age']
в 0.источник