variable-titles on active link on buerger menu
This commit is contained in:
@@ -147,6 +147,74 @@ function parse_menu_item(&$items, $key){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_preprocess_HOOK() for menu.html.twig.
|
||||||
|
*
|
||||||
|
* Burger (block leshed_navigationprincipale, menu 'main') : le lien actif
|
||||||
|
* passe en typo « variable title ». La classe est posée côté serveur pour
|
||||||
|
* être présente au premier rendu — titles.js la cherche à ce moment-là, et
|
||||||
|
* le CSS masque .variable-title jusqu'au split (pas de flash de typo brute).
|
||||||
|
*
|
||||||
|
* Détection du lien actif : on compare le chemin système courant au chemin
|
||||||
|
* interne de chaque lien (même logique que active-link.js / ActiveLinkResponse
|
||||||
|
* Filter, dont la classe `is-active` n'est dans le HTML que pour les réponses
|
||||||
|
* anonymes en cache). On ne peut PAS utiliser `in_active_trail` : les liens
|
||||||
|
* de menu vers des pages de vues ne matchent jamais — la route courante
|
||||||
|
* expose des paramètres (view_id, display_id, arg_0) absents du lien, donc
|
||||||
|
* loadLinksByRoute() ne le retrouve pas et le trail reste vide (mesuré).
|
||||||
|
*/
|
||||||
|
function leshed_preprocess_menu(&$variables) {
|
||||||
|
if (($variables['menu_name'] ?? '') !== 'main') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// La détection dépend du chemin courant, mais le bloc ne varie par défaut
|
||||||
|
// que par route.menu_active_trails:main — vide sur ce site à cause des
|
||||||
|
// liens views (cf. ci-dessous). Sans ce contexte, le bloc mis en cache sur
|
||||||
|
// une page resservirait sur une autre avec le mauvais lien marqué.
|
||||||
|
$variables['#cache']['contexts'][] = 'url.path';
|
||||||
|
// isFrontPage() lit la config page.front : invalider si elle change.
|
||||||
|
$variables['#cache']['tags'][] = 'config:system.site';
|
||||||
|
$current = \Drupal::service('path.current')->getPath();
|
||||||
|
$is_front = \Drupal::service('path.matcher')->isFrontPage();
|
||||||
|
leshed_menu_variable_title($variables['items'], $current, $is_front);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pose la classe .variable-title sur l'item actif (chemin système courant).
|
||||||
|
*
|
||||||
|
* Chemin interne normalisé avec un « / » initial : la route <front> a un
|
||||||
|
* chemin interne vide. La page d'accueil est configurée sur un chemin
|
||||||
|
* système (page.front), donc sur la page d'accueil on marque l'item
|
||||||
|
* <front> via isFrontPage() plutôt que par le chemin.
|
||||||
|
*
|
||||||
|
* Marque au plus UN item (le premier trouvé) : un lien <front> et un lien
|
||||||
|
* pointant la page d'accueil configurée ne doivent pas être marqués ensemble.
|
||||||
|
*
|
||||||
|
* NB : $item est une copie du tableau, mais $item['url'] est un objet Url
|
||||||
|
* partagé — le setOptions() mute bien celui que rendra le template.
|
||||||
|
*
|
||||||
|
* @param string $current
|
||||||
|
* Chemin système courant (ex. « /projets », « / »).
|
||||||
|
* @param bool $is_front
|
||||||
|
* La page courante est la page d'accueil.
|
||||||
|
*/
|
||||||
|
function leshed_menu_variable_title(array $items, $current, $is_front) {
|
||||||
|
foreach ($items as $item) {
|
||||||
|
if (!empty($item['below']) && leshed_menu_variable_title($item['below'], $current, $is_front)) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
$url = $item['url'];
|
||||||
|
if ($url->isRouted()
|
||||||
|
&& (($is_front && $url->getRouteName() === '<front>') || '/' . $url->getInternalPath() === $current)) {
|
||||||
|
$options = $url->getOptions();
|
||||||
|
$options['attributes']['class'][] = 'variable-title';
|
||||||
|
$url->setOptions($options);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements hook_preprocess_HOOK() for node.html.twig.
|
* Implements hook_preprocess_HOOK() for node.html.twig.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user