En mi sitio web, los usuarios pueden acumular algunos 'puntos' con el tiempo. Tengo un menú en la barra superior con algunos enlaces (por ejemplo, "inicio", "perfil", "cerrar sesión"). Quiero modificar el elemento de menú "perfil" y agregar los puntos de número que posee el usuario conectado actual.
Intenté varios ganchos, y casi logré obtener lo que quería hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
Limpié el caché (con drush cr
), y el elemento del menú muestra el valor que quiero. Pero, si el valor cambia por alguna razón, muestra el valor anterior. Debo borrar el caché todas las veces para actualizar su valor.
¿Cómo puedo evitar limpiar el caché para actualizar el título del menú todas las veces que cambian los puntos obtenidos del usuario?
navigation
matthieu lopez
fuente
fuente
Respuestas:
Sugiero implementar un complemento de enlace de menú personalizado. El siguiente código supone que el nombre de su módulo es un ejemplo .
Si no desea inyectar el servicio de base de datos, la clase sería mucho más simple.
A continuación, debe colocar la definición del enlace en el archivo example.links.menu.yml .
El problema de almacenamiento en caché
Cada vez que se cambia el número de puntos, la caché de enlaces del menú debe invalidarse de la siguiente manera.
Necesitas encontrar el lugar correcto para esto. Si los puntos gestionados por el módulo contribuido verifique la API del módulo y seleccione un gancho apropiado ( hook_points_insert () , hook_points_delete () y así sucesivamente).
Dado que la cantidad de puntos se calcula para cada cuenta de usuario individualmente, puede considerar usar etiquetas de caché por cuenta (algo así como
['example.points_count.' . $uid]
). Por lo tanto, la memoria caché se conservará para los usuarios con puntos sin cambios.Para generar código para el complemento de enlace de menú, utilicé Drupal Code Generator .
fuente
Me enfrenté al mismo problema. Los elementos del menú se almacenan en caché, por lo que siempre muestra el valor anterior hasta que borra la memoria caché. Una forma alternativa es usar
hook_page_attachments()
, adjuntar puntos a drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE, acceder a ellos en JavaScript y renderizar en el navegador.La forma normal es deshabilitar el caché para las páginas cada vez que se muestra el menú "perfil" en el rendimiento del sitio.
fuente
Inhabilite el caché para ese menú
hook_preprocess_menu()
estableciendo$variables['#cache']['max-age']
en 0.fuente