Sur mon site Web, les utilisateurs peuvent collecter des «points» au fil du temps. J'ai un menu dans la barre supérieure avec quelques liens (par exemple "home", "profile", "logout"). Je souhaite modifier l'élément de menu "profil" et ajouter le nombre de points appartenant à l'utilisateur actuellement connecté.
J'ai essayé plusieurs hameçons et j'ai presque réussi à obtenir ce que je voulais hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
J'ai effacé le cache (avec drush cr
) et l'élément de menu affiche la valeur que je veux. Mais, si la valeur change pour une raison quelconque, elle affiche l'ancienne valeur. Je dois vider le cache tout le temps pour mettre à jour sa valeur.
Comment éviter de nettoyer le cache pour mettre à jour le titre du menu à chaque fois que les points gagnés par l'utilisateur changent?
la source
Réponses:
Je suggère d'implémenter un plugin de lien de menu personnalisé. Le code ci-dessous suppose que le nom de votre module est un exemple .
Si vous ne voulez pas injecter le service de base de données, la classe deviendrait beaucoup plus simple.
Ensuite, vous devez mettre la définition du lien dans le fichier example.links.menu.yml .
Le problème de mise en cache
Chaque fois que le nombre de points est modifié, le cache des liens de menu doit être invalidé comme suit.
Vous devez trouver le bon endroit pour cela. Si les points gérés par le module contribué vérifient l'API du module et prennent un hook approprié ( hook_points_insert () , hook_points_delete () et ainsi de suite).
Étant donné que le nombre de points est calculé pour chaque compte d'utilisateur individuellement, vous pouvez envisager d'utiliser des balises de cache par compte (quelque chose comme
['example.points_count.' . $uid]
). Par conséquent, le cache sera conservé pour les utilisateurs avec des points inchangés.Pour générer du code pour le plugin de lien Menu, j'ai utilisé Drupal Code Generator .
la source
J'ai fait face au même problème. Les éléments de menu sont mis en cache, il affiche donc toujours l'ancienne valeur jusqu'à ce que vous effaciez le cache. Une autre méthode consiste à utiliser
hook_page_attachments()
, à attacher des points à drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE, à y accéder en JavaScript et à effectuer un rendu dans le navigateur.La manière normale est de désactiver le cache pour les pages chaque fois que le menu "profil" s'affiche lors des performances du site.
la source
Désactivez le cache pour ce menu en
hook_preprocess_menu()
définissant$variables['#cache']['max-age']
sur 0.la source