Mise en place d'une navigation multi-audience pour un site institutionnel

Étude de cas : cadrer un besoin éditorial multi-audience en un système de navigation et classification unique, sans multiplier menus ni taxonomies.

Contexte

Les contenus du site sont structurés en trois espaces distincts par public cible :

Dans chacune de ces sections, les gabarits et comportements des types contenus sont partagés, il n’est donc ni pertinent ni requis de créer des types de contenus dédiés.

Les éléments de navigation du site (menu principal et breadcrumb) doivent refléter cette organisation, c’est-à-dire que l’élément “Accueil” du breadcrumb doit renvoyer vers la page d’accueil de la section.

Le besoin éditorial, formulé simplement : permettre au contributeur de rattacher chaque contenu à l’une des trois sections, pour que :

Les contraintes

L’approche la plus directe — une taxonomie dédiée en parallèle du menu, ou un menu par espace — revenait à maintenir deux structures pour une seule idée (l’appartenance à un espace), avec le risque classique de désynchronisation entre les deux au fil des évolutions.

Les choix écartés

Décisions techniques

Chaque contenu porte un champ optionnel qui référence l’un des trois éléments racine du menu principal (basé sur le plugin_id du MenuLinkTreeElement). Laissé vide, il prend pour valeur par défaut, par ordre de priorité :

  1. Son élément parent, s’il est présent dans le menu
  2. La page d’accueil générale

Cette valeur est calculée dans un ContextProvider, qui l’expose dans les blocks de menu. Deux blocks sont déclarés, tous deux basés sur le menu principal :

Le ContextProvider devient la source de vérité unique de la section active et permet de piloter l’affichage et le rendu des différents éléments via une couche d’abstraction rendant cette valeur accessible à l’ensemble du site, pas seulement les nodes.

À partir de cette valeur :

Le rendu dépend de cette valeur, pas de la route ni de l’utilisateur connecté — les contextes de cache natifs de Drupal (route, utilisateur, langue…) n’en savent rien. Deux conséquences concrètes sans contexte dédié :

Le cache context personnalisé rend l’espace explicite dans la clé de cache : le menu filtré n’est plus resservi au mauvais espace, et le changement d’espace d’un contenu ne provoque plus d’erreur de redirection de cache.

Le ContextProvider devient le point central de toute la mécanique, sans taxonomie parallèle à synchroniser ou de menu multiple à contribuer.

Résultat

En production, sans incident depuis la mise en ligne (septembre 2025), sur un site à fort trafic. La classification est prise en main par les équipes éditoriales sans formation particulière — un seul champ à renseigner, dont le sens (quel espace) leur est déjà familier puisqu’il reprend directement la structure du menu qu’elles connaissent.

Consulter la version Markdown