Contrôler l'affichage de la navigation d'un site en rubriques/sous-rubriques

NB. J'utilise Drupal 4.7.5 pour ce tutoriel mais il devrait fonctionner avec Drupal 5.x.

Partons du principe que votre site utilise une navigation à 2 niveaux telle que :

  ACCUEIL
  RUBRIQUE1
    - SousRubriqueA
    - SousRubriqueB
    - SousRubriqueC
  RUBRIQUE2
    - SousRubriqueD
    - SousRubriqueE
    - SousRubriqueF
  CONTACT

Tout d'abord, il est fréquent de vouloir afficher les rubriques (ACCUEIL, RUBRIQUE1, RUBRIQUE2...) à un endroit, et les sous-rubriques à un autre. Dans mon cas, je voudrais afficher les rubriques en haut de l'écran et les sous-rubriques dans la colonne de gauche (vous pourriez aussi bien choisir d'autres emplacements).

Par ailleurs, les sous-rubriques ne doivent être affichées que lorsque la rubrique correspondante est activée.

Enfin, les sous-rubriques pourront soit être entrées manuellement par le webmaster, soit fournies par la taxonomie. Cette deuxième option est bien pratique, car si j'utilise des termes de la taxonomie comme sous-rubriques, je pourrai rattacher à ces termes les contenus du site qui doivent apparaître dans ces sous-rubriques.

Utiliser un module Drupal existant ?

Mon premier réflexe est de chercher un module Drupal qui réponde à mes besoins. Je tombe assez rapidement sur le module Taxonomy Menu qui permet de faire apparaître dans le menu Drupal des liens pointant vers les termes d'une taxonomie.

C'est pas mal, mais ça manque de souplesse, notamment :

  • Dans l'affichage du menu. N'oubliez pas qu'on veut afficher notre navigation en 2 endroits : les rubriques en haut de l'écran, et les sous-rubriques sur le côté gauche. Avec Taxonomy Menu, tout doit être affiché au même endroit, dans le menu "Navigation".
  • Dans l'affichage du contenu de chaque rubrique/sous-rubrique : en effet, si vous avez déjà utilisé la taxonomie, vous savez que filtrer l'affichage par un terme de taxonomie renvoie la liste de tous les nodes rattachés à ce terme, du plus récent au plus ancien. Dans notre cas, on préférera peut-être un affichage plus subtil (n'afficher que les nodes d'un type particulier, classer les nodes par ordre alphabétique plutôt qu'antéchronologique, etc.) que nous créerons nous-mêmes.

Bref, nous allons devoir développer notre solution maison.

Avant de poursuivre, précisons que Drupal n'est pas tout à fait au point sur ce sujet : la tâche à accomplir est en effet un grand classique, et la solution proposée est un peu bidouillée. Néanmoins, elle fonctionne parfaitement.

Créez les rubriques sous formes de liens primaires

Rendez vous dans administrer » menus, et ajoutez les rubriques de votre site sous le menu Liens primaires. Dans mon cas, ça donne (syntaxe "titre => chemin") :

  • ACCUEIL => <front>
  • RUBRIQUE1 => node/38
  • RUBRIQUE2 => node/39
  • CONTACT => contact

Bien entendu, vous adapterez cet exemple à votre situation. Notez juste que les chemins ou les nodes vers lesquels vos rubriques pointent doivent exister (c'est à vous de les créer).

A ce stade, les rubriques de votre site sont en place et doivent apparaître en haut à droite de l'écran si vous utilisez le thème Drupal par défaut (bluemarine).

Créez les sous-rubriques

A ce stade, 2 options s'offrent à vous : créer les sous-rubriques en les entrant manuellement dans les liens primaires, ou utiliser la taxonomie.

Option 1 - Entrez manuellement les sous-rubriques dans le menu Liens primaires

Cette solution convient bien si vous avez peu de sous-rubriques, et que ces sous-rubriques pointent essentiellement vers des pages statiques.

Allez dans administrer » menus, et ajoutez les sous-rubriques de votre site sous le menu Liens primaires. Vous veillerez à bien attacher chaque sous-rubrique à une rubrique créée à l'étape précédente.

A vous de voir vers quoi vous faîtes pointer chaque sous-rubrique. Quelques suggestions :

  • Une page statique : SousRubriqueA => node/38
  • Un terme de taxonomie : SousRubriqueA => taxonomy/term/7
  • Une vue ("View") de votre création : SousRubriqueA => mavue

Option 2 - Créez une taxonomie correspondant aux sous-rubriques

Une autre option consiste à utiliser la taxonomie pour générer vos sous-rubriques. C'est bien pratique si vous avez déjà créé une taxonomie pour classer le contenu de votre site ; l'idée, c'est que chaque sous-rubrique affichera le contenu lié à un terme de la taxonomie. L'autre avantage, c'est que vos sous-rubriques seront mises à jour automatiquement si vous changez la taxonomie.

Si cette taxonomie n'existe pas, il faut d'abord la créer. Pour cela, allez dans administrer » catégories, et ajoutez un vocabulaire intitulé "Rubriques", rattaché aux nodes de type "article", obligatoire, avec hiérarchie simple. Cochez également "Choix multiples" si un même article peut appartenir à différentes sous-rubriques.

Ensuite, ajoutez des termes à ce vocabulaire de façon à ce qu'ils reflétent la navigation de votre site, par exemple :

  RUBRIQUE1
    - SousRubriqueA
    - SousRubriqueB
    - SousRubriqueC
  RUBRIQUE2
    - SousRubriqueD
    - SousRubriqueE
    - SousRubriqueF

Notez qu'il n'est pas utile d'inclure dans ce vocabulaire les rubriques qui n'ont pas de sous-rubriques (dans mon cas, ACCUEIL et CONTACT).

Quand vous avez terminé, listez les termes du vocabulaire "Rubriques", et prenez note de l'id des termes correspondant à chaque rubrique (uniquement les rubriques, pas les sous-rubriques !), c'est important pour la suite.

Pour trouver l'id d'un terme, cliquez sur ce terme dans la liste des termes, et observez l'adresse qui s'affiche alors dans votre navigateur. Elle devrait ressembler à http://exemple.com/taxonomy/term/56, où 56 est l'id du terme. Utilisez ensuite le bouton Précédent de votre navigateur pour revenir à la liste des termes.

Dans mon cas, j'obtiens :

  • RUBRIQUE1 = 56
  • RUBRIQUE2 = 60

Affichez les sous-rubriques à l'emplacement de votre choix

Rappel : je souhaite afficher les sous-rubriques à l'emplacement de mon choix. Dans mon exemple, j'ai choisi de les afficher dans la colonne de gauche, mais vous êtes libre de choisir un autre emplacement. Par ailleurs, les sous-rubriques ne doivent être affichées que lorsque la rubrique correspondante est activée.

Pour afficher les sous-rubriques, je vais utiliser un bloc que je ferai apparaître dans la colonne de gauche ("bloc" est un module par défaut de Drupal).

Pour créer un bloc, allez dans administrer » blocs, et ajoutez un bloc avec ces paramètres :

  • Description = "Sous-rubriques"
  • Titre = "Sous-rubriques" (ou laissez vide si vous ne voulez pas afficher de titre au-dessus de vos sous-rubriques)
  • Corps = passer le format d'entrée sur PHP Code et copiez/collez le code PHP ci-dessous. Attention ! Le code PHP à utiliser est différent selon l'option utilisée pour créer vos sous-rubriques à l'étape précédente.

Option 1 - Si vous avez entré les sous-rubriques dans le menu Liens primaires

Créez un bloc selon la méthode indiquée plus haut, et entrez-y le code PHP suivant :
<?php
$trail = _menu_get_active_trail_in_submenu(variable_get('menu_primary_menu', 0));
if (is_array($trail) && count($trail) >= 2) {
$pid = $trail[1]; // id de la rubrique active
$menu = menu_get_menu();
if ($menu['visible'][$pid]['children']) {
print theme('menu_tree', $pid);
}
}
?>
Ce code détecte la rubrique actuellement sélectionnée dans le menus Liens primaires, et affiche ses sous-rubriques si elles existent.

Ce code ne renvoie rien si aucune rubrique n'est sélectionnée, ou si la rubrique sélectionnée n'a pas de sous-rubrique(s). Le bloc ne s'affichera donc que sur les pages appropriées !

Option 2 - Si vous récupérez les sous-rubriques dans la taxonomie

Ce cas de figure est un peu plus complexe, car il faut créer un bloc par rubrique. Chaque bloc sera chargé d'afficher les sous-rubriques de cette rubrique en particulier. Commençons par le bloc qui affichera les sous-rubriques de RUBRIQUE1 (soit SousRubriqueA, SousRubriqueB...).

Attention ! N'oubliez pas de remplacer les 2 valeurs au début de ce code par vos propres valeurs.

<?php
$rub_path = 'node/38'; // Remplacer 'node/38' par le chemin de votre
// première rubrique (définie à l'étape 1)
$tid = 56; // Remplacer 56 par l'id de taxonomie
// correspondant à votre première rubrique.

// Si on n'est pas sur la rubrique en cours ni une sous-rub,
// on n'affiche rien.
if ($_GET['q'] != $rub_path && arg(0) != 'taxonomy') return;

// Si on est sur une sous-rubrique :
if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {
// et qu'elle ne dépend pas de la rubrique en cours, on n'affiche rien.
$parent = db_result(db_query('SELECT h.parent
FROM {term_hierarchy} h WHERE h.tid = %d', arg(2)));
if ($parent != $tid) return;
}

// Si on est arrivé à ce stade, on est sur la rubrique
// en cours ou une de ses sous-rubriques : on affiche !
$items = array();
$result = db_query('SELECT t.tid, t.*, parent FROM {term_data} t
INNER JOIN {term_hierarchy} h ON t.tid = h.tid
WHERE parent = %d ORDER BY weight, name', $tid);
while ($term = db_fetch_object($result)) {
$items[] = l($term->name, 'taxonomy/term/'.$term->tid);
}
print theme('item_list', $items);
?>

Ce code dit : "Si je suis sur la RUBRIQUE1 ou l'une de ses sous-rubriques, affiche les sous-rubriques de la RUBRIQUE1 que tu récupères dans la taxonomie." Ainsi, si je ne suis pas sur la RUBRIQUE1 ou l'une de ses sous-rubriques, ce bloc n'affichera rien. Vous n'avez donc pas à vous soucier de la visibilité de ce bloc : il apparaît automatiquement sur les pages appropriées.

Repétez l'opération (création de bloc) pour chaque rubrique de votre site qui possède des sous-rubriques, en utilisant les valeurs appropriées à chaque fois. Au final, vous devez avoir autant de blocs que de rubriques (dans mon cas, j'ai donc 2 blocs : "Sous-rubriques de RUBRIQUE1" et "Sous-rubriques de RUBRIQUE2").

Activez les blocs et testez

Avant de pouvoir tester vos sous-rubriques, il reste à activer les blocs créés. Pour cela, revenez sur la liste des blocs et cochez activé devant chaque bloc "Sous-rubriques" (NB : vous n'aurez qu'un bloc si vous avez choisi l'option 1, et plusieurs blocs si vous avez choisi l'option 2).

Vous veillerez également à placer ces blocs dans la zone où vous voulez qu'ils apparaissent (barre de gauche dans notre exemple).

A présent, si vous cliquez l'une de vos rubriques dans la navigation en haut de l'écran, les sous-rubriques correspondantes doivent s'afficher dans un bloc à gauche de l'écran.

Conclusion

J'espère que ce tutoriel vous a été utile. Il y aurait plusieurs façons de l'améliorer :

Avec l'option 2, les sous-rubriques sont issues de la taxonomie. Chaque sous-rubrique pointe donc vers une adresse du style http://www.exemple.com/taxonomy/term/7 qui affiche tous les nodes rattachés au terme d'id 7.

Le problème, évoqué en début de tutoriel, c'est que cet affichage ne nous convient pas forcément. Heureusement, le module Views fournit une vue personnalisable pour toutes les adresses de type http://www.exemple.com/taxonomy/term/XX. Comme ce n'est pas le propos de ce tutoriel, je n'entrerai pas dans le détail, mais il vous suffirait d'installer et d'activer cette vue pour pouvoir facilement personnaliser le format du contenu affiché : sous forme de tableau, de liste... dans l'ordre que vous voulez, avec les critères qui vous conviennent...

Un autre amélioration possible pour l'option 2 serait de créer un seul bloc pour afficher toutes les sous-rubriques. En effet, le seul paramètre qui change d'un bloc à l'autre est l'id de taxonomie correspondant à la rubrique. Si le bloc était capable de récupérer automatiquement cet id, le même bloc pourrait afficher toutes les sous-rubriques du site (comme dans l'option 1).

N'hésitez pas à me dire si ce tutoriel répond à vos attentes, s'il vous paraît clair ou pas, trop compliqué ou pas assez...

Salut, Est ce que dans

Salut,

Est ce que dans cette méthode tu rediriges les termes dans $links vers ton custom view?? Sinon, tu es mieux d'utiliser la view taxonomy/term fournie par views module afin de t'assurer que l'usager va tomber sur ton custom view quand il clique sur un des termes assignés à un node dans le teaser ou le node view.

[EDIT DE VINCENT : Pour des raisons de clarté, la contribution de cet utilisateur a été déplacée sur une autre page.]

A+

--
patchak
http://www.notreactualite.com/

Merci beaucoup pour ces

Merci beaucoup pour ces explications, c'est exactement les éléments dont j'avais besoin pour bien partir sur la création de mon site :)

Je vais m'atteler à essayer d'utiliser tout ça. C'est vraiment très intéressant de voir de quelle manière on peut associer les modules à des scripts pour arriver à son but. Je trouve que c'est ça qui manque cruellement dans l'approche drupal...

Comme tu l'as souligné vincent, les infos se perdent vite dans les threads, et ne sont pas forcément toujours très explicites. Tu as rédigés 2 très bons articles (avec celui des designs public/admin différenciés), bien compréhensible ;) Un grand merci !

Et merci patchak pour le complément avec l'utilisation des onglets et de l'url taxonomy/term

Hello vincent, Voici ma

Hello vincent,

Voici ma petite contribution à ce thread ;)

[EDIT DE VINCENT : Pour des raisons de clarté, la contribution de cet utilisateur a été déplacée sur une autre page.]

Merci à patchak et

Merci à patchak et titouille pour vos contributions. Apparemment, je ne suis pas le seul à avoir un besoin pressant de rédiger des tutoriels Drupal. :)

Comme vos réponses sont des tutoriels à part entière, je les ai déplacées sur leurs propres pages en indiquant clairement qu'elles sont de vous (contactez-moi si ça vous pose un problème).

Ca devrait permettre aux gens de trouver les infos un peu plus facilement que dans les commentaires.

Super ces tutos ! <mode

Super ces tutos !


et pourquoi pas un wiki pour mettre tout ça en forme ?

;-)

--
Claire
www.oliska.com

Re, oui vincent, je trouve

Re,

oui vincent, je trouve qu'il y a un manque crucial de documentations et tutoriaux sur drupal en français.
Je n'ai pas particulièrement de problèmes avec la langue anglaise, mais je dois admettre que le mode "forum" pour avoir des réponses à des questions de ce gabarit n'est pas approprié, je n'aime pas beaucoup le forum drupal.org.
Des explications sous forme de tuto sont bien plus compréhensibles et fournies pour aller de l'avant ;)

Quant à faire un wiki comme le suggère claire, l'idée est bonne, oui, mais alors sur des sujets ciblés tels que intégration de design et codage. Un enième contenu pour expliquer les fonctionnements basiques de drupal (configuration, ajout de contenu et autres banalités) ne serait pas d'un grand intérêt à mon humble avis.

Je pense avoir trouvé la

Je pense avoir trouvé la manière de faire qui convienne à mes besoins pour mon site.

[EDIT DE VINCENT : Pour des raisons de clarté, la contribution de cet utilisateur a été déplacée sur une autre page.]

Le wiki, sur le principe,

Le wiki, sur le principe, c'est une bonne idée. La question se pose d'ailleurs également pour la doc de drupalfr.

Le problème, c'est que Drupal n'est pas un wiki et n'est pas tout à fait au point sur le sujet : il propose plusieurs modules qui mis ensemble peuvent émuler le comportement d'un wiki, mais ça n'est pas aussi fluide qu'un vrai wiki. Or, on ne va pas utiliser autre chose que Drupal pour documenter Drupal, si ? ;-)

Un grand merci ! Merci pour

Un grand merci !

Merci pour vos contributions, cela m'est vraiment utile ! :))
je suis tombé sur les posts de titouille et je suis presque dans le même cas que lui.

Sinon, en effet, je suis complêtement d'accord, ça manque de tutos design / code.
Je suis un nouveau venu sous drupal et je roule en v5 après avoir tester moulte autres CMS.
je le trouve très bien mais il faut capté la philosophie drupal.

Il manque des explications sur les concepts. il y a déjà un article sur ça mais qui n'apporte rien car pas explicatif du tout. http://drupalfr.org/document/les_concepts_de_drupal

Je cherche aussi des docs et tutos sur les classes/variables des objets sous drupal, parce que je programme en PHP et je fais un peu de design, mais sans les variables, je suis largué pour adapter ou créer des thèmes ... (:

A encore une chose, y-a-t-il des grosses différences entre les versions 4.7 et 5 ?

Merci encore.

Coucou Bravo et merci.

Coucou
Bravo et merci. Quelle limpidité.

Sinon les URLs des deux contributions de ce fil ont été déplacées ?
Nœuds : http://drupalfrance.com/node/113 et http://drupalfrance.com/node/114

Bonjour, Bien que ce ne soit

Bonjour,

Bien que ce ne soit pas spécialement le propos, je tenais à vous gratifier pour ce site Web. Comme vous le dites dans la présentation de votre formation, la documentation francophone dédiée à Drupal est assez rare.

Vis à vis de cet article, j'aurais deux questions.

Premièrement, comme le remarque floown, les deux remarques que vous avez déplacées ne semblent plus accessibles (erreur d'accès). Est-ce normal ? Elles avaient l'air intéressantes !

Secundo, vous dites : ...amélioration possible pour l'option 2 serait de créer un seul bloc pour afficher toutes les sous-rubriques..
C'est précisément ce que je cherche à faire. Seulement, n'ayant aucune connaissance en PHP... je patauge un peu.
L'avez-vous déjà fait ? Ou bien connaissez-vous un lien qui explique les possibilités envisageables pour parvenir à un résultat équivalent ?

Merci !

Bravo pour cette

Bravo pour cette article!
Pour l'idée du wiki... j'y adhère complètement. C'est clair drupal peut faire beaucoup de chose mais un wiki est vraiment fait pour la création d'une doc de manière communautaire... pourquoi se compliquer la vie si il existe des solutions simples et efficaces.
Je pense pas que mettre les aspects basique soit totalement inutile, il n'existe pas de doc complète en Français ce serrait l'occasion de la créer et sur le principe du wiki chacun crée les pages qu'il veux (avec une ligne commune si possible ;) ). Ca pourrait donner un coup de fouet à la communauté francophone qui bien que très sympathique reste encore relativement petite.
On pourrait commencer par créer la première page avec les différentes catégorie afin que le wiki soit bien organisé dés le départ.
A titre d'exemple, je trouve que celui de fedora fr est assez bien dans sa forme bien que les catégories ne soit pas assez mis en valeur a mon goût par apport à "en vrac".
Personnellement je conseillerai docuwiki qui est vraiment simple, performant et bien documenté, facile à mettre à jour.
Un lien qui peut aider à son intégration: http://wiki.splitbrain.org/wiki:discussion:dokuwikiintegration

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement.
Syndiquer le contenu