web-dev-qa-db-fra.com

Comment définir un élément de menu actif?

J'ai un site qui a beaucoup de menus. L'un d'eux est le menu principal qui contient peu d'éléments. Ces éléments sont liés aux zones principales du site, et chacune de ces zones principales possède un menu spécifique. Lorsque je suis sur une page de destination de l'une de ces zones principales, l'élément de celui-ci dans le menu principal est actif, mais lorsque je suis sur une page interne de l'une de ces zones, l'élément du menu principal n'est pas actif .

Existe-t-il un moyen de le rendre actif automatiquement?

J'ai essayé d'utiliser menu_position mais cela ne semble pas fonctionner.

5
Luiz Guilherme

Context fournit cette fonctionnalité prête à l'emploi.

10
Capi Etheriel

Il y a beaucoup de façons. Je ne liste ici que des choses compatibles avec D7 et éventuellement D6.

Utilisez un module

Codez votre contenu

Il s'agit désormais d'une API native menu_tree_set_path pour définir le chemin que vous souhaitez utiliser pour calculer la trace active du menu.

Vous pouvez également travailler dans theme_links mais mais je recommande d'utiliser menu_tree_set_path pour que les autres modules sachent quel est votre lien actif. L'avantage est que vous pouvez utiliser cette fonction dans votre thème sans créer de module.

Gardez à l'esprit que menu_position possède une API pour créer vos règles personnalisées.

Alors, que dois-je utiliser ???

Cela dépend de vos besoins. si vous avez des règles simples comme: pour ce type de noeud/vues/taxonomie je veux ce menu actif, le contexte est bon.

Si vous avez une bonne structure d'URL (autopathe) que de suivre la structure de votre menu, menu_trail_by_path fonctionnera simplement sans aucun effort.

Je n'ai jamais utilisé menu_position ... donc je peux très bien le dire.

Si vous avez besoin d'une logique particulière, coder vos affaires est certainement plus rapide que de créer 40 contextes ou règles ...

13
gagarine

Le moyen le plus simple consiste simplement à faire des éléments de menu de vos pages "internes" (sous-pages appartenant à vos zones/pages de destination) des éléments de menu de pages de destination.

Quelque chose comme:

 menu des liens principaux 
 | 
 + - élément de menu de la page de destination 1 
 | | 
 | + - élément de menu de la page 1 interne 
 | + - élément de menu de la page 2 interne 
 | 
 + - élément de menu de la page 2 
 | 
 + - élément de menu de la page 3 interne 
 + - élément de menu interne de la page 4 

Si vous devez les conserver dans des menus séparés, vous devrez probablement jouer avec theme_links () pour conserver les classes "active-trail" et/ou "active" appropriées.

3
Maciej Zgadzaj

Peut-être que le module Bloc de men vous aiderait.

(Conjointement avec l'approche décrite ci-dessus par Maciej).

Depuis la page du projet Bloc de menu:

Il fournit des blocs configurables d'arborescences de menus commençant par n'importe quel niveau de n'importe quel menu. Et plus!

Donc, si vous utilisez uniquement la fonctionnalité de liens du menu principal de votre thème, vous pouvez ajouter et configurer un bloc "Menu principal (niveaux 2+)". Ce bloc apparaîtrait une fois que vous étiez sur l'une des pages du menu principal et afficherait l'arborescence du menu pour le 2e niveau (et plus profond) de votre menu principal et s'élargirait au fur et à mesure que vous parcourriez l'arborescence. Vous pouvez également limiter la profondeur de l'arborescence du menu (par exemple, "Menu principal (niveaux 2-3)") et/ou développer tous les sous-menus enfants (par exemple, "Menu principal (niveaux étendus 2+)").

1
iainp999

Vous pouvez également utiliser hook_translated_menu_link_alter(). Ce serait peu délicat.

/**
 * Implements hook_translated_menu_link_alter()
 */
function Module_translated_menu_link_alter(&$item, $map) {

    if ($item['menu_name'] == 'menu-name') {

        //check first two arg from url
        $path = arg(0)."/".arg(1);

        //add class active-trail if path match
        if (strpos($item['link_path'], $path) !== false) {
            $item['in_active_trail'] = true;

        }

    }
}
0
batMask