No meu site, os usuários podem coletar alguns 'pontos' ao longo do tempo. Eu tenho um menu da barra superior com alguns links (por exemplo, "home", "profile", "logout"). Desejo alterar o item de menu "perfil" e adicionar os pontos numéricos pertencentes ao usuário conectado atual.
Tentei vários ganchos e quase consegui o que queria hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
Limpei o cache (com drush cr
) e o item de menu mostra o valor que eu quero. Mas, se o valor mudar por algum motivo, ele mostra o valor antigo. Devo limpar o cache o tempo todo para atualizar seu valor.
Como evitar a limpeza do cache para atualizar o título do menu todas as vezes que os pontos ganhos do usuário são alterados?
navigation
matthieu lopez
fonte
fonte
Respostas:
Sugiro implementar um plug-in de link de menu personalizado. O código abaixo assume que o nome do seu módulo é um exemplo .
Se você não deseja injetar o serviço de banco de dados, a classe se tornaria muito mais simples.
Em seguida, você precisa colocar a definição do link no arquivo example.links.menu.yml .
O problema de armazenamento em cache
Sempre que o número de pontos é alterado, o cache do link do menu deve ser invalidado da seguinte maneira.
Você precisa descobrir o lugar certo para isso. Se os pontos gerenciados pelo módulo contribuído, verifique a API do módulo e escolha um gancho apropriado ( hook_points_insert () , hook_points_delete () e assim por diante).
Como o número de pontos é calculado para cada conta de usuário individualmente, você pode considerar o uso de tags de cache por conta (algo como
['example.points_count.' . $uid]
). Portanto, o cache será preservado para usuários com pontos inalterados.Para gerar código para o plug-in de link de menu, usei o Drupal Code Generator .
fonte
Eu enfrentei o mesmo problema. Os itens de menu são armazenados em cache, portanto, ele sempre mostra o valor antigo até você limpar o cache. A maneira alternativa é usar
hook_page_attachments()
, anexar pontos a drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE, acessá-los em JavaScript e renderizar no navegador.A maneira normal é desativar o cache de páginas sempre que o menu "perfil" for exibido no desempenho do site.
fonte
Desabilite o cache desse menu
hook_preprocess_menu()
configurando$variables['#cache']['max-age']
como 0.fonte