Auf meiner Website können Benutzer im Laufe der Zeit einige "Punkte" sammeln. Ich habe ein Menü in der oberen Leiste mit einigen Links (z. B. "home", "profile", "logout"). Ich möchte den Menüpunkt "Profil" ändern und die Anzahl der Punkte hinzufügen, die dem aktuell verbundenen Benutzer gehören.
Ich habe mehrere Haken ausprobiert und es ist mir fast gelungen, das zu bekommen, was ich wollte hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
Ich habe den Cache (mit drush cr
) geleert und der Menüpunkt zeigt den gewünschten Wert an. Wenn sich der Wert jedoch aus irgendeinem Grund ändert, wird der alte Wert angezeigt. Ich muss den Cache ständig leeren, um seinen Wert zu aktualisieren.
Wie kann ich vermeiden, den Cache zu bereinigen, um den Menütitel zu aktualisieren, wenn sich die vom Benutzer erzielten Punkte ändern?
quelle
Antworten:
Ich schlage vor, ein benutzerdefiniertes Menü-Link-Plugin zu implementieren. Der folgende Code setzt voraus, dass Ihr Modulname ein Beispiel ist .
Wenn Sie den Datenbankdienst nicht einfügen möchten, wird die Klasse viel einfacher.
Als nächstes müssen Sie die Linkdefinition in die Datei example.links.menu.yml einfügen.
Das Caching-Problem
Immer wenn die Anzahl der Punkte geändert wird, sollte der Menü-Link-Cache wie folgt ungültig gemacht werden.
Sie müssen den richtigen Ort dafür finden. Wenn die vom beitragenden Modul verwalteten Punkte die Modul-API überprüfen und einen geeigneten Hook ( hook_points_insert () , hook_points_delete () usw.) auswählen .
Da die Anzahl der Punkte für jedes Benutzerkonto einzeln berechnet wird, können Sie die Verwendung von Cache-Tags pro Konto in Betracht ziehen (etwa
['example.points_count.' . $uid]
). Daher bleibt der Cache für Benutzer mit unveränderten Punkten erhalten.Um Code für das Menü-Link-Plugin zu generieren, habe ich Drupal Code Generator verwendet .
quelle
Ich hatte das gleiche Problem. Die Menüelemente werden zwischengespeichert, sodass immer der alte Wert angezeigt wird, bis Sie den Cache leeren. Alternativ können Sie
hook_page_attachments()
Punkte an drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE anhängen, auf diese in JavaScript zugreifen und im Browser rendern.Normalerweise wird der Cache für Seiten deaktiviert, wenn das Menü "Profil" bei der Site-Leistung angezeigt wird.
quelle
Deaktivieren Sie den Cache für dieses Menü,
hook_preprocess_menu()
indem Sie$variables['#cache']['max-age']
auf 0 setzen.quelle