Menus

Créez enfin vos menus facilement !

Introduction

Lorsqu’on ne se sert pas du plugin ’Menus’, on est obligé de définir tous ses menus dans les squelettes, ce qui fait que les administrateurs du site n’ont pas directement la main dessus, que lorsqu’ils veulent y changer quelque chose, ils sont obligés d’en faire la demande à la personne en charge des squelettes.

De plus, lorsqu’on veut des liens statiques (un lien vers un article précis, ou vers une page précise, ou vers un site externe) il faut les écrire en dur dans le squelette du menu.

Le but du plugin ’Menus’ est donc de permettre de facilement élaborer des menus au moyen d’une interface conviviale, directement dans la partie privée.

Attention ! Ce plugin ne s’occupe pas de la manière dont seront affichés les menus. Il permet de les créer facilement et d’en générer le HTML.

Pour l’affichage, voyez avec votre thème ou des plugins spécifiques tels que Menu animé déroulant, Menu Déroulant 2, Menu Accordéon 2 ou Menu jQuery Superfish.

Installation

Menus (0.9.5)
Menus (1.7.25)

Télécharger le paquet ZIP du plugin et placer son contenu dans votre répertoire “plugins/”. Activez-le ensuite dans la page de gestion des plugins.

Vous devez aussi avoir le plugin SPIP Bonux déjà installé.

Création d’un menu

Le plugin ajoute un lien dans le bandeau de SPIP :

La page liste tous vos menus, et vous propose d’en créer un nouveau :

D’abord vous devez identifier votre menu. Il faut lui donner un titre, ainsi qu’un mot-clé qui vous permettra de l’appeler facilement. En effet, vous ne pouvez pas prévoir à l’avance dans vos squelettes le numéro du menu. Grâce à ce mot-clé identifiant, vous n’avez donc pas à modifier vos squelettes à chaque fois. Vous pouvez également saisir une classe qui sera ajoutée au premier élément ul du menu généré. Ceci peut permettre d’activer la gestion de l’affichage par un plugin tiers.

Vous pouvez alors commencer à construire le menu en ajoutant des entrées :

Les différents types d’entrées

Les Menus sont fournis pour l’instant avec plus de dix types d’entrées qui permettent déjà de construire la plupart des menus facilement.

N’hésitez pas à en proposer d’autres !

Voici la description de quelques uns des types d’entrées disponibles :

-  Lien arbitraire : vous pouvez créer des liens vers ce que vous voulez en donnant une adresse et un titre.

-  Objet de SPIP : crée un lien vers n’importe quel objet éditorial de SPIP. Ça peut être un article, une rubrique ou n’importe quoi venant d’un plugin.

-  Liste dynamique de rubriques et d’articles : vous pouvez afficher les rubriques de SPIP, y compris de manière arborescente. Pour cela, il suffit de définir la rubrique dans laquelle il faut commencer la liste, le niveau maximum de sous-rubriques, les exclusions éventuelles, le type de tri... Vous pouvez aussi inclure les articles dans l’arborescence, limiter leur nombre, en gérer le tri...

Modification des entrées

Lorsque vous avez déjà ajouté des choses, vous obtenez alors la liste des entrées sous cette forme :

Vous pouvez alors déplacer les entrées pour modifier leur ordre, les supprimer, changer leurs paramètres et créer des sous-menus en-dessous des entrées qui le permettent.

Utiliser les menus dans votre site

Pour afficher un menu dans votre site, il vous suffit d’inclure un petit squelette où vous le désirez :

#INCLURE{fond=inclure/menu, env, identifiant=<votre_menu>}

Vous pouvez aussi tester votre menu facilement en cliquant sur le bouton «Voir en ligne» ou en allant sur la page : spip.php?menu<numero>

Exporter les menus vers un autre site

Imaginons que sur une version de votre site en local vous réorganisez tous les menus. Pour reporter ces changements en prod, il faut exporter les menus dans un fichier et les réimporter en prod.

S’assurer tout d’abord que le plugin Yaml est activé .

Lorsqu’il est activé une icône apparaît : exporter ce menu

Le sauvegarder sur votre ordinateur

Sur le site de destination, il suffit de créer un nouveau menu avec le même identifiant ( penser à le supprimer avant s’il existe). Et à la création, si le plugin YAML est bien activé, la boite de choix de fichier est proposée.

Surcharge des fichiers menus/<type>.html

Si pour des besoins particuliers, on doit surcharger un fichier du répertoire menus/, il ne faut pas oublier de copier le fichier XML de description qui va avec.

En effet, le plugin cherche le fichier XML au même endroit que le fichier HTML.

Discussion

341 discussions

  • 2

    Bonjour,
    L’import de menus à partir de fichier yaml ne semble plus fonctionner, l’export est ok.
    Apache 2.4
    PHP 7.4.9
    toutes versions à jour
    SPIP 3.2.11
    Sarka-SPIP 3.4.10
    Menus 1.7.28
    Saisies pour formulaires 3.54.7
    YAML 2.0.18
    Le fichier importé (UTF8 / unix), a juste été exporté et réutilisé tel quel sans modif.
    Dans les log spip & yaml -> ERREUR: Erreur d’analyse YAML : Unable to parse line 1 (-)

    Cordialement

    TG

    • C’est le plugin YAML qui plante en utilisant la librairie par défaut (sfYaml : symphony v1).
      En changeant la constante : define(’_LIB_YAML’, ’spyc’); dans mes_options, cela fonctionne à nouveau correctement.
      Les autres librairies (symfony (v4), libyaml) plantent aussi !

      Cordialement

      TG

    • Je n’ai pas constaté de pb en PHP 7.4 avec yaml pourtant (utilisé aussi dans saisies, formidable, noizetier). Il faudrait donc plutôt décrire le problème dans le plugin YAML, et dans les tickets en priorité https://git.spip.net/spip-contrib-extensions/yaml

    Reply to this message

  • bonjour,
    sur ce plugin 1.7.28 en Spip 4.0, et sur la version précédente en 3.2, je me demande comment passer le paramètre de langue dans les liens, quelle est la syntaxe svp ?
    merci d’avance.

    Reply to this message

  • 4

    Bonjour,
    existe-t-il une page décrivant l’utilisation de
    Surcharge des fichiers menus/<type>.html ?
    Je cherche à remplacer les styles menu-entree item menu-items__item par des classes de Bootstrap pour certains menus.
    Merci

    • Décrire quoi ? C’est un squelette, tu le surcharges comme n’importe quel autre squelette.

      Mais la surcharge doit toujours être le tout dernier recourt, puisqu’alors tu perds absolument toute mise à jour, correction de bugs etc ensuite.

      Il faut plutôt utiliser les extend et mixin SCSS de Bootstrap pour appliquer les styles prédéfinis que tu veux à une autre classe.

    • Décrire quoi ? C’est un squelette, tu le surcharges comme n’importe quel autre squelette.

      Eh bien décrire la syntaxe du xml par exemple. Le <rang> du xml, c’est le rang de quoi ?

      Mais la surcharge doit toujours être le tout dernier recourt, puisqu’alors tu perds absolument toute mise à jour, correction de bugs etc ensuite

      OK mais j’ai vu qu’on pouvait en créer de nouveaux dans le /menus de mon plugin, donc je peux créer les miens dérivés avec mes classes ?

      Il faut plutôt utiliser les extend et mixin SCSS de Bootstrap pour appliquer les styles prédéfinis que tu veux à une autre classe.

      Je ne connais pas cette subtilité. Est-ce que cette méthode répondrait à remplacer les classes de
      <li class="menu-entree item menu-items__item par les classes
      <li class="nav-item ... ?

      Merci

    • Et où/comment se définit la variable #VAL{_MENUS_EXTRA_CLASS} ?

    • Ah ben elle est là la doc...
      Ajouter des types d’entrées pour les menus

      Et j’ai trouvé la balise du xml <refuser_sous_menu /> qui me manquait...

    Reply to this message

  • 2

    Bonsoir,

    il me semblait qu’il était possible d’avoir un menu multilingue pour un site par secteur de langue, donc basculant, par exemple, entre un article et sa traduction.

    Si c’est bien le cas, je ne retrouve plus comment.

    Une idée.

    Merci d’avance,

    Cordialement,

    Hervé

    Reply to this message

  • Bonjour à tous,

    J’ai eu une difficulté pour installer le plugin MENUS sur un spip 3.2.11. Les tables SQL n’étaient pas créées et j’avais le diagnostic ; “table menus doesn’t exist”.

    Sur un site en local, j’avais pu recréer le problème. Le fait de désactiver alors tous les plugins et de les réactiver avait permis de créer les tables menus, mais cela n’a pas marché sur le site à distance.

    En m’inspirant de certaines discussions, je suis allé voir les tables de spip_meta : elles contenaient deux lignes : une appelée “menus” et l’autre “menus_base_version” (contenant 0,5,6) qui m’ont paru suspectes puisque j’avais complètement. desinstallé le plugin MENUS.

    En supprimant ces deux lignes dans la base, j’ai pu réinstaller le plugin et les tables ont bien été créées !

    Reply to this message

  • Bonjour, j’utilise avec plaisir ce plugin depuis un moment.
    Actuellement je l’utilise pour un site multilingue avec l’entrée secteur de langue. Tout fonctionne sans problème.
    Par contre je souhaite qu’une des rubriques ne s’affiche pas dans la barre de navigation or avec l’entrée secteur langue il n’est pas possible d’exclure des rubriques comme dans l’entrée “liste ou arborescence” du plugin.

    Comment contourner ce problème ?

    Merci d’avance pour votre aide !

    Reply to this message

  • 4

    Bonjour

    J’utilise ce plugin depuis très longtemps sans problème. Je viens de lui découvrir une bizarrerie sur certains de mes sites.

    Il ne me propose ni “Article, rubrique ou autre objet SPIP”, ni “Lien arbitraire”.

    C’est une installation mutualisée (donc même version du plugin 1.7.26 sur tous mes sites). Certains sites me proposent bien ces items, et d’autres non. Je dois avoir des plugins incompatibles, mais je ne vois pas par quel mécanisme un conflit entre plugin pourrait supprimer des entrées.

    Auriez-vous des pistes pour que j’investigue ?

    • La toute première piste est toujours la même : désactiver tous les plugins non nécessaires à ce qu’on veut tester, ne laisser que l’obligatoire. Pour déjà voir si ça vient pas d’un autre plugin, et donc réactiver ensuite un par un si c’est le cas.

    • Oui, bien sûr. j’aurais dû y penser avant de poster.

      J’avais en effet un plugin qui avait un répertoire menus/ avec dedans lien.html  objet.html  page_speciale.html.

      Moyennant de renommer ce répertoire en menus-old/, tout est revenu dans l’ordre. C’est un vieux plugin (en développement local) qui avait dû implémenter ces items du temps où ils n’existaient pas dans “Menus”.

    • Ils ont toujours existé, vu que ce sont justement les tous premiers types de base lors de la création du plugin. :)

      Tu as dû vouloir les surcharger sûrement

    • Dans la config du plugin, il est possible de masquer des types d’entrées (ex: deconnexion que j’ai cherché un bon moment).
      Peut-être sont-elles masquées.

    Reply to this message

  • 1

    Bonjour,
    J’utilise SPIP 3.2.3 avec le plugin MENUS 1.7.19
    Dans le modèle menus/ articles_rubrique.html, je souhaite utiliser la balise #EXPOSE.
    Malheureusement cette balise n’affiche rien car la variable d’environnement de l’article courant n’est pas connu par ce modèle (#ENVid_article n’affiche rien quand je suis sur un article).
    #ENVid_article affiche bien le n° de l’article jusqu’à l’inclusion de inclure/menu.html mais la balise #MENUS_AFFICHER_ENTREE n’a pas l’air de gérer les variables d’environnement.
    Avez vous remarqué ce problème ?
    Et trouvé une solution ?

    Cordialement
    Daniel

    • Tu vois pourtant que ça expose déjà bien des choses, et il y a un filtre dédié à Menus pour ça, c’est dans le code même du morceau dont tu parles (|menus_exposer), il suffit de réutiliser pareil.

    Reply to this message

  • 3

    Bonjour,

    Je suis très content d’avoir trouvé ce plugin, un grand merci. Mais, j’ai quelques petites questions. Quelle est la différence entre le masquage d’une entrée avec le mot-clé session vs le mot-clé connecte ?
    Pourquoi ce type de masquage n’est pas disponible sur un item de menu simple “Texte” ?

    Cordialement

    Thierry

    • Ce n’est pas dans les mêmes entrées ce dont tu parles il me semble. C’est juste que ça a été fait par plusieurs personnes différentes, et qu’il n’y a rien de cohérent (et si ça a été fait par la même personne c’est encore pire…). Un jour faudra uniformiser tout ça mais ça fait des années que je n’ai pas le temps de m’y remettre à ce plugin.

    • Ok, compris, c’est dommage parce qu’il y a vraiment du potentiel dans ce plugin. J’avais remarqué un certain manque de cohérence entre les différentes entrées mais je pensais qu’il y avait peut-être une raison. J’ai bien essayé de bidouiller le code, en prenant exemple sur page_speciale et en modifiant texte_libre.html et texte_libre.xml pour rajouter la fonctionnalité de restriction en fonction de la connexion, mais ça n’a donné aucun résultat. Comme j’ai du mal avec la syntaxe de spip, je n’ai pas cherché plus loin ... tant pis.

      Merci quand même

      Thierry

    • Correction ...
      ma bidouille fonctionne, je m’étais juste mélangé les crayons avec les onglets de l’éditeur entre les fichiers du plugin et les fichiers de ma surcharge dans /squelette/menus/. J’avais fait les modifs directement dans les fichiers du plugin alors que j’avais déjà copié ces fichiers dans squelette. Du coup à la compil ce sont les fichiers non modifiés dans squelette qui étaient pris en compte. :))) c’est ballot !
      Du coup s’il y en a que ça intéresse :
      modif fichier /menus/texte_libre.html

      #SET{contenu, #ENV*{contenu}|_T_ou_typo}
       
      [(#REM) Par défaut on affiche toujours l'entrée ]
      #SET{afficher_entree,oui}
      [(#REM) Si le champ est rempli on désactive l'entrée si ça ne correspond pas aux attentes ]
      [(#ENV{suivant_connexion}|oui)
      	[(#ENV{suivant_connexion}|=={connecte}|et{#SESSION{id_auteur}|non})
      		#SET{afficher_entree,''}
      	]
      	[(#ENV{suivant_connexion}|=={deconnecte}|et{#SESSION{id_auteur}|oui})
      		#SET{afficher_entree,''}
      	]
      	[(#ENV{suivant_connexion}|=={admin}|et{#SESSION{statut}|!={"0minirezo"}})
      		#SET{afficher_entree,''}
      	]
      ]
       
      [(#ENV{appel_formulaire}|oui)
      	<div class="titre">[(#GET{contenu}|expanser_liens)]</div>
      	<div class="infos">[((#ENV{suivant_connexion}|?{[(#VAL{menus:entree_suivant_connexion_}|concat{#ENV{suivant_connexion}}|_T)]}))]</div>
       
      ]
      [(#ENV{appel_menu}|et{#GET{afficher_entree}})
      	<li class="menu-entree item menu-items__item menu-items__item_texte-libre[ (#ENV{css})]">
      		<span class="texte_libre menu-items__texte">[(#GET{contenu}|expanser_liens)]</span>
      ]

      et
      modif fichier /menus/texte_libre.xml

      <entree>
      	<nom><:menus:nom_menu_texte_libre:></nom>
      	<rang>2</rang>
      	<description><:menus:description_menu_texte_libre:></description>
      	<icone>images/menus_texte_libre.png</icone>
      	<parametre nom="contenu" label="menus:entree_contenu" class="multilang" obligatoire="oui" />
      	<parametre nom="css" label="menus:entree_css" />
      	<parametre nom="suivant_connexion" label="menus:entree_suivant_connexion" />
      </entree>

      ... euh, pas terrible les couleurs du cadre xml !

    Reply to this message

  • 4

    Bonjour,
    J’utilise ce plugin pour la première fois. Il est vraiment pratique.
    J’ai deux questions pour un squelette multilingue et
    -  l’entrée du menu concernant un “Lien vers un squelette page”.
    Concrètement, la page contact : /spip.php?page=contact
    Si je souhaite que le lien soit lié à la langue de la page je rajoute &lang=fr (français) et &lang=en (anglais) mais dans la configuration de la liste des paramètres je ne vois pas comment mettre l’un ou l’autre.
    -  Liste ou arborescence de rubriques et d’articles (avec beaucoup d’options) —> Il n’y a pas la possibilité du champ “trad” comme sur un objet SPIP...il vaut donc mieux les rentrer objet/objet?

    Merci d’avance pour votre aide à la découverte de ce plugin.
    Jérôme

    • Bonjour JeromeD,

      Avec un site multilingue, je n’arrive pas non plus a transmettre la langue
      pour « Lien vers un squelette page ».
      Est-ce par les parametres que ca marche?
      As-tu trouve une solution ?

      Merci

    • Bonjour NestorB,
      Je suis désolé mais je n’ai pas poursuivi avec le plugin MENU sur ce site donc je n’ai pas trouvé la réponse à ma question... mais si quelqu’un qui passe par là donne la solution je serai également preneur.
      Faut-il faire 2 menus?

    • Suivant le type d’entrée ça peut être des comportements différents voulus pour le multilingue (parfois une autre page, parfois lang=truc dans l’URL ou autre)
      -  certains cas simples peuvent être intégrés directement dans le code des entrées, mais dans ces cas là il faudrait dire clairement lesquels et faire un ticket dédié pour chacun sur git.spip.net
      -  mais sinon, dans pas mal de cas, je trouve que le plus simple reste de faire un menu différent par langue (et possiblement un menu par défaut quand on ne trouve pas de menu dédié pour la langue en cours) : par ex si le site est français principal, un menu “firstnav” + un menu “firstnav_en” + un menu “firstnav_ru” etc et dans le code de ton squelette un test qui affiche le bon menu suivant la langue de l’environnement.

    • Merci JeromeD et Rastapopoulos pour vos réponses.

      Comme j’ai la langue dans l’environnement, je l’ai finalement ajoutée en paramètre URL au lien de page speciale.html (surcharge sous squelettes /menus).

      ...
              <a href="[(#URL_PAGE{#ENV{nom}, #ENV{parametres}}|parametre_url{lang,#ENV{lang}}|ancre_url{#ENV{ancre}})]" class="menu-items__lien[ (#ENV{css_lien})]">#GET{titre}</a>
      ...

      C’est une bidouille qui a l’air de marcher .

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite / PostgreSQL
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparait.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom