Des menus à la carte

Version imprimableEnvoyer à un ami

La réaction de Thierry à mon billet sur la structuration d'un site Drupal m'avait conduite à préparer une nouvelle réflexion orientée "modélisation sous Drupal" entièrement dédiée au problème des menus ; je trouve enfin le temps de la finir et de la poster.

Un menu dans Drupal est une liste de liens.

Et rien d'autre.

Le problème quand on découvre Drupal, c'est qu'en général la première fois qu'on crée un contenu, on est connecté comme utilisateur 1, celui qui a tous les droits. On voit donc les paramètres du menu dans le formulaire de création. Si l'on vient d'un autre CMS, la confusion avec la rubrique au sens SPIP est à peu près garantie. Sauf que ça paraît vachement compliqué, parce qu'on voit là tous les items de tous les menus, et qu'en plus il faut créer un "item" pour que le contenu apparaisse dans le menu ("kesako?" se demande le débutant perdu, "il ne peut pas récupérer le titre, simplement ?") .

Il est essentiel de bien comprendre une chose : dans Drupal, la structure et la façade du site sont découplées. Vous pouvez organiser l'une indépendamment de l'autre. Des moyens vous permettent de calquer la façade sur la structure et de créer des menus dynamiques, c'est-à-dire des menus qui intégreront automatiquement les futurs contenus. Mais c'est à vous de les construire, contrepartie du fait que vous pouvez les construire librement. Pour des menus qui intègrent automatiquement les futures catégories de votre site, il faudra passer par un module additionnel.

Les menus sont une composante essentielle de votre site, puisqu'ils sont les portes d'entrées par lesquelles vos visiteurs accèderont au contenu. Une façade mal conçue risque donc d'anéantir votre travail de construction de la structure. Cela ne signifie pas nécessairement qu'elle doit la refléter telle quelle.

Anatomie d'un menu

Un menu Drupal est constitué d'items. Un item est constitué d'un titre, qui est le texte qui apparaitra (sur lequel il faudra cliquer), et d'un chemin, qui est la destination du lien proprement dit. Le chemin est obligatoire puisque, comme vous l'avez maintenant compris (sinon, sortez !), un menu est une liste de liens. Un item peut être configuré pour ne pas apparaître (case "activé") ou au contraire pour que tous ses enfants apparaissent par défaut (case "déplié"). Car, et c'est un point important, un item de menu peut avoir des enfants ; en clair un menu est une entité hiérarchisable.

Enfin, à chaque menu est associé un bloc ; quand vous créez un menu, Drupal crée automatiquement le bloc. Pour voir votre menu apparaître sur votre site, rendez-vous dans la page d'administration des blocs et placez-le dans une région de votre thème.

Un item peut pointer vers n'importe quelle page web :

  • un contenu de votre site
  • une liste de contenus de votre site
  • un site externe.

Un même menu peut présenter (et présente en général) un mélange de ces différents types d'items. Drupal embarque quelques menus par défaut, je vais y revenir, mais je vous conseille de commencer votre découverte des menus Drupal par créer ex-nihilo un menu de type "Blogroll", avec quelques items pointant vers vos sites préférés, par exemple :

Allez activer le bloc et admirez-le le temps qu'il faudra (soyez modeste tout de même, ce n'est pas grand'chose).

Les menus par défaut de Drupal

A l'installation, Drupal 6 crée 3 menus. Si vous vous organisez bien, ils suffiront pour construire la navigation interne à votre site.

Le menu de navigation prend le nom de l'utilisateur connecté. Il est prévu pour les liens "personnels", ceux qui dépendent des permissions globales données à l'utilisateur. Pour l'utilisateur 1, le menu de navigation présente tous les liens d'administration (puiqu'il a tous les droits). Pour les autres utilisateurs, les items qui apparaitront seront fonction des droits que vous leur donnerez. Rien ne vous empêche de les modifier et d'en ajouter d'autres. Par exemple vous pouvez remplacer le "créer un contenu" par un lien direct vers le formulaire de création du/des type/s de contenu que les utilisateurs peuvent créer : en d'autres termes, les renvoyer sur node/add/type plutôt que sur node/add. Ce peut être plus simple pour des utilisateurs peu familiers des CMS.

Je vous recommande d'utiliser ce menu de cette manière, en y mettant les liens relatifs à l'utilisateur, car les modules additionnels qui reposent sur des permissions l'utilisent en général comme ça. Par exemple Flag crée l'item my bookmarks dès que vous activez le flag bookmark du module. Ne créez pas vous-même un menu qui s'appelle "Navigation", vous allez perturber Drupal. Si vous tenez à avoir un bloc qui s'intitule "Navigation", il vaudra mieux créer un autre menu ("Mon menu navigation") et intervenir sur la configuration du titre du bloc correspondant (méthode pas testée donc donnée SGDG).

Les deux autres menus sont les liens primaires (dans D7 menu principal) et les liens secondaires. Ils ont un statut particulier car les développeurs de thèmes prévoient généralement une zone particulière pour les afficher. C'est avec le premier que vous devriez construire la navigation principale de votre site. Dans Drupalistic, le menu des liens primaires est ainsi composé :

  • Ressources Drupal : lien vers un contenu
  • Comparaisons : lien vers une vue groupant tous les contenus de type "comparaison"
  • Etudes de cas : lien vers une vue groupant tous les contenus de type "étude de cas"
  • Vous aussi contribuez : lien vers un contenu
  • Le blog : lien vers la page "/blog" créée par le module blog de Drupal (qui est une vue en fait)
  • Veille Twitter : lien vers un contenu.

Les liens secondaires sont tout en bas (contact et mentions légales).

Extending the system

Sur Drupalistic, les menus primaires et secondaires sont donc statiques ; chaque item est géré à la main depuis l'administration du menu. Mais il est aussi possible d'automatiser les items à l'aide d'un module additionnel. Par exemple, Taxonomy Menu permettra de faire un menu à partir d'un vocabulaire de taxonomie, en créant l'item associé à un terme. D'autres modules fignolent le comportement (ne générer le menu qu'avec une partie d'un vocabulaire, etc.).

Le module Views permet deux choses importantes pour la navigation. Quand vous créez un affichage "page", vous pouvez lui faire générer un item de menu. Par exemple sur Drupalistic l'item "études de cas" des liens primaires est piloté par Views. Le lien pointe sur la vue elle-même. Vous pouvez également créer un affichage bloc, qui vous fera un rendu "menu" : par exemple créez une liste de termes liés chacun à leur page taxonomy/term/x et vous présenterez à vos utilisateurs la liste de vos rubriques, conduisant aux posts de la rubrique (c'est ce que fait Taxonomy Menu mais la vue vous permettra d'affiner, avec la contrepartie de la complexité : combiner plusieurs vocabulaires dans un même bloc, exclure un terme, etc.). Views permet également des blocs contextuels, c'est-à-dire dont le contenu change en fonction de la page sur laquelle on se trouve (les derniers articles avec le même terme de taxonomie par exemple, ou les produits proposés par le même utilisateur, et ainsi de suite...)

Une dernière petite astuce

La page admin/build/menu/settings permet d'envoyer un autre menu comme source des liens primaires et des liens secondaires. Supposons par exemple que vous créiez un menu à l'aide de Taxonomy Menu sur un vocabulaire "Catégories", et que vous souhaitiez que vos catégories utilisent la zone "primary links" du thème que vous avez choisi. Il suffira d'activer les "primary links" comme zone de thème (admin/build/themes/settings/nomdutheme) et d'y envoyer comme source votre menu Catégories.

Des modules qui permettent d'améliorer le fonctionnement des menus. Si cette série de billets vous a aidé, ce serait sympa d'en présenter quelques uns.

(edit : j'ajoute une autre page de résultats avec quelques modules intéressants aussi)

(edit2 : en fait, allez ici http://drupal.org/project/modules?text=menu puis cliquez sur un des termes du bloc "Projets" pour restreindre l'affichage)...

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.