Menu hierarchique, rubriques/articles classés

créer des menus hiérarchisés sans limite de profondeur, en entrelaçant les rubriques et les articles dans les sous-menus, et en les classant selon l’ordre que l’on a défini.

l’intérêt principal, en dehors de l’absence de limite de profondeur, est de ne pas se limiter à lister d’abord les rubriques et ensuite les articles dans les sous-menus, mais de les sortir entrelacées, dans l’ordre que l’on aura choisi.


exemple

le site se compose de

  • rubrique fruits
    • article poires
    • article pommes
  • rubrique légumes
    • article poireaux
    • rubrique pomme de terre
      • article bintje
      • article belle de fontenay
    • article chou-fleur
    • article navet
    • article tomates
    • article poivrons
    • article concombre

ce menu permet de placer la rubrique pomme de terre entre les articles poireaux et chou-fleur : on ne mélange pas les légumes d’hiver avec ceux d’été...

voir ici un exemple en ligne sur un spip 1.7.2 non modifié en ayant juste uploadé tous les fichiers.


contenu

menu.html/menu.php3 : squelette du menu à appeler dans les pages.

menu.css/menu.js : feuille de style et javascript pour l’affichage du menu.

plus.gif/moins.gif : images « + » et « - » pour développer et condenser les sous menus.

mes_fonctions.php3 : deux filtres, pour jouer avec les numéros d’ordre dans les titres des articles et des rubriques.

article.html/article.php3 : squelette d’article rudimentaire contenant l’appel du menu.

rubrique.html/rubrique.php3 : squelette de rubrique rudimentaire contenant l’appel du menu.

sommaire.html/sommaire.php3 : squelette de sommaire rudimentaire contenant l’appel du menu, en dehors d’un contexte d’article ou de rubrique.


mise en oeuvre

-  numérotez les titres des articles et des rubriques pour les classer avec un numéro de la forme « nn. » (numéro d’ordre point espace) ; pour l’exemple ci-dessus, on aurait : « 1. fruits » « 1. poires » « 2. pommes » « 2. légumes » « 1. poireaux » « 2. pommes de terre » « 3. navets » ...

-  filtrez vos appels de titre par (#TITRE ;

-  copier les deux filtres de mes_fonctions.php3 dans le vôtre ;

-  placer les fichiers menu.html, menu.php3, menu.js, menu.css, plus.gif et moins.gif à la racine de votre spip ;

-  copier l’appel du menu :

<INCLURE(menu.php3){id_rubrique}{id_article}>

à l’endroit opportun dans les fichiers où vous en avez besoin ;

-  jouez avec menu.css pour adapter le menu à votre mise en page ;


précautions d’emploi

-  si vous n’utilisez pas article.html/article.php3 et rubrique.html/rubrique.php3 comme squelette d’affichage des articles et des rubriques, il faut modifier menu.html : ligne 29 colone 111 pour rubrique et ligne 41 colone 118 pour article.

-  si les titres des articles et des rubriques ne contiennent pas de numéro, elle seront classées par ordre alphabétique.

Discussion

31 discussions

  • Je cherche exactement ce type de menu sauf que je souhaite afficher seulement pour la rubrique en cours :

    + rubrique (en cours)
    - article1
    - article2
    + sous rubrique
    - article 1
    - article 2
    etc....

    donc je ne veut pas que le menu boucle sur toutes les rubriques mais je ne vois pas comment modifier le menu

    si quelqu’un a un idée merci d’avance

    Répondre à ce message

  • 1

    Bonjour,
    J’ai une structure
    root
    .site_a (rub1)
    ..allmand (rub11)
    ..englais
    .site_b (rub16)
    ..

    Le menu marche bien (avec le correction pour SPIP 1.8x :-).
    C’est possible de me positioner sur racine, ou un rubrique premier niveau comme (rub1 ou rub16).
    Mais si je me positionne sur la lang (rub11) le menu reste tout vide.

    site :
    [Protec Sardinia->http://protecsardinia.com.jovinus-meta.net/spip1.82d/article.php3?id_article=1] root
    [Protec Mexico->http://protecsardinia.com.jovinus-meta.net/spip1.82d/article.php3?id_article=16] rub 16

    Changement dans menu.html :
    <code>
    <BOUCLE_menu(RUBRIQUES) id_rubrique=16 par titre> ;
    (au lieu de racine)
    </code>

    • Après la correction pour SPIP 1.82 l’ include marchait correcte.

      Mais ce n’est pas possible de generer un sub-tree au niveau « lang » 2. niveau). Mais c’est possible de genere un sub-tree ou niveau d’un secteur (1. niveau).

      Pour affice le sub-tree « lang », il fallait chercher le rubrique correct dans le premier boucle.
      L’ affichange après c’est possible avec des paramètres correct, comme :
      ecrire_menu($level,$root) ; /* example : (2,11) */

      P.S.
      Subtree selectioné d’après la lanque.

      $lang="#LANG";
      /* alt:racine neu:wird auf "Site" aufgesetzt */
      <BOUCLE_menu(RUBRIQUES) {id_rubrique=1} {par titre}>
              <BOUCLE_menu_n(RUBRIQUES) {id_rubrique} {par titre}>
                      $menu[$i]["[(#TITRE|kenum)] - #ID_RUBRIQUE"]=array("parent"=>"#ID_PARENT","titre"=>"[(#TITRE|denum)]","idrub"=>"#ID_RUBRIQUE","idart"=>"");
                      $i++;
      
                      /* pog */
                      /* if ('#TITRE' == 'Deutsch'){ pog*/
                      /* echo("akt-spr:$lang"); */
                      if (!$lang) $lang='de';
                      if (    $i==2  /* check: correct lang-Sub-Tree */
                           && $lang==#LANG) {
                       /* echo("<br>#TITRE/#ID_RUBRIQUE/#LANG/$i"); */
                       $level=$i; $root='#ID_RUBRIQUE';
                      }
                      /* pog */
                      <BOUCLE_menu_a(ARTICLES) {id_rubrique} {par titre}>
                              $menu[$i]["[(#TITRE|kenum)] - #ID_ARTICLE"]=array("parent"=>"#ID_RUBRIQUE","titre"=>"[(#TITRE|denum)]","idrub"=>"","idart"=>"#ID_ARTICLE");
                      </BOUCLE_menu_a>
                      <BOUCLE_menu_r(RUBRIQUES) {id_parent} {par titre}>
                              <BOUCLE_sous_menu(boucle_menu_n)></BOUCLE_sous_menu>
                      </BOUCLE_menu_r>
                      $i--;
              </BOUCLE_menu_n>
      </BOUCLE_menu>
      
      ..
      
      ecrire_menu($level,$root);
        

    Répondre à ce message

  • Ce menu fait exactement ce que je veux. Bravo et merci pour la contrib.

    Aujourd’hui j’ai un nouveau besoin : j’ai une barre d’onglets qui permet de choisir un des secteurs du site, avec mise en valeur du secteur en cours. Donc, pour la cohérence, il vaudrait mieux que le menu hiérachique n’affiche plus que les seules rubriques et les articles du secteur en cours de consultation.

    Précision : la page d’accueil n’affichera pas le menu hiérarchique. La barre d’onglet suffirait. Il n’y aurait donc plus de situation ou il faudrait afficher l’ensemble des secteurs...

    La modif serait-elle compliquée ? J’ai bien essayé de modifier les boucles, mais je tombe sur des problèmes de Javascript, et là je suis largué !

    D’avance merci à celui qui donnerait la soluce ;-)

    Répondre à ce message

  • Bonjour,

    Ce menu est tres sympa et facilement personnalisable sauf que... je souhaiterai qu’il m’affiche en rubrique tete non pas le secteur (j’ai fait une restricition par secteur en cours) mais les rubriques n-1 du secteur en cours...
    Ex : soient 4 secteurs (pommes, poires, bananes). Si je selectionne « pommes », je souhaite qu’il m’affiche :

    • golden,
    • granny,
    • ...

    sans qu’il soit fait mention de « pommes ».

    Quelqu’un a-t-il mis en oeuvre ce genre de boucle ?

    Merci.

    Répondre à ce message

  • Cette contrib m’interesse au plus haut point mais non pas pour les rubriques mais pour la liste d’auteurs. En effet mon site grandi en permanence et j’ ai environ 60 auteurs. A la fin de l’année j’en serai aux alentours de 200 !
    Comment peut-on faire un menu arborescent comme celui ci +A +B +C etc... pour retrouver tous mes auteurs sans être obligé de les aligner en deux ou trois colonnes et me retrouver avec des pages au kilomètres ?
    Sinon bravo pour toutes les fabuleuses contrib que je lis ici et notamment celle-ci.

    Répondre à ce message

  • 3

    Depuis que je suis passé en version 1.8.

    Si je met dans la page article.html

    	<INCLURE(menu.php3){id_rubrique}>

    Le menu n’affiche pas l’article active en rouge dans le menu.

    Pour les modifs du fichier menu.html ... J’ai du mal a comprendre où faut-il ajouter et quoi.

    Bon y en a qui y sont arrivé ... je ne sais pas comment ...
    Merci de votre aide.

    Je tourne en rond.

    • Brigitte

      Bonjour,
      en fait, j’ai le même problème sauf que l’article affiché est bien coloré en rouge dans le menu mais il n’apparait pas car l’arborescence n’est pas totalement dépliée. Le niveau le plus fin manque. Je cherche ce qu’il faut modifier pour afficher plus loin dans l’arbo. Je suis également sous Spip 1.8

    • jfcarre

      Si tu fait la modif ci-dessus ... l’arboressence reste ouverte.

      Mais c’est le titre de la rubrique qui est en rouge.

      (Solution de dépanage.)

    • Ne pas tenir conte des messages ci-dessu !
      Suivre les conseils de l’instal prévus pour spip 1.7 normal.

      Et dans le fichier menu.html changer UNIQUEMENT la ligne 54

      Elle resemble a :

      	<BOUCLE_menu_voir_article(HIERARCHIE)>

      Ajouter : id_article, c’est a dire, on aura le code :

      	<BOUCLE_menu_voir_article(HIERARCHIE){id_article}>

      Merci a yorgot ... pour la piste ...

       :-)))))

    Répondre à ce message

  • 2
    Caroline

    Bonjour,
    je viens d’installer cette contrib sur mon site en local (Spip 1.8).
    Le message que j’obtiens est : « Parse error : parse error, unexpected T_STRING, expecting ’)’ in c :\program files\easyphp1-7\www\intranetl\spip-v1-8\inc-public.php3(20) : eval()’d code on line 22 ».

    Après avoir lu les autres messages, j’ai donc suivi leurs recommandations :
    -  pour appeler le menu, j’ai mis
    -  dans « menu.html »,
    (ligne 58)j’ai mis
    (ligne 65)j’ai mis

    et ça ne fonctionne tjrs pas.
    Est-ce que vous pouvez m’aider ? Merci !

    Caroline

    • Caroline

      Désolée, c’est encore Caroline...
      Mon message ne s’est pas affiché convenablement...

      je viens d’installer cette contrib sur mon site en local (Spip 1.8).
      Le message que j’obtiens est : « Parse error : parse error, unexpected T_STRING, expecting ’)’ in c :\program files\easyphp1-7\www\intranetl\spip-v1-8\inc-public.php3(20) : eval()’d code on line 22 ».

      Après avoir lu les autres messages, j’ai donc suivi leurs recommandations :
      -  pour appeler le menu j’ai mis dans INCLURE uniquement id_rubrique
      -  dans « menu.html », pour la boucle hierarchie
      (ligne 58)j’ai rajouté id_article
      (ligne 65)j’ai rajouté id_rubrique

      et ça ne fonctionne tjrs pas.
      Est-ce que vous pouvez m’aider ? Merci !

      Caroline

    • Stéphane

      J’ai eu la même chose

      Vérifiez qu’il n’y ait pas de guillemets (« ») dans vos titres d’articles

    Répondre à ce message

  • 1
    Stéphane

    Après qq essais avec les v 1.7.2 et la 1.8.b6 j’ai constasté que l’utilisation des guillemets (") dans les noms de rubrique ou titres d’article provoquait un « Parse error... » comme signalé sur ce forum.

    ça le fait chez vous ?

    sinon merci pour la contrib.

    • Bonjour

      Je confirme avoir exactement le même problème (1.8 pR2)

      Alain

    Répondre à ce message

  • 4

    Bonsoir,
    super cette contrib, çà marche dans la 1-7 et la 1-7.2 sans problème,
    mais dans la 1-8 pr1 : plus rien ne s’affiche ....
    aurais-je fait une erreur quelques part ?
    je ne vois pas .
    merci jmarco

    • Barthélémy

      Apparemment sur la version 1-8B5 ça ne marche pas non plus, du moins chez moi.

      Pourtant, il semble que le choix de la version 1.7 pour la démonstration n’est été fait qu’à titre d’exemple, puisqu’il est précisé dans les mots clés que ce squelette est valable pour toutes les versions de SPIP ...

      Y a t-il un moyen de corriger le problème d’affichage ?
      Merci

    • Bonjour,
      en fait après un petit tour sur la liste,

      sur la 1-8pr1 il faut appliquer autrement

      id_rubrique et id_article, du coup j’ai fait :

      INCLURE(menu.php3)id_rubrique
      à la place de
      INCLURE(menu.php3)id_rubrique id_article
      et tout fonctionne normalement
      aussi bien sur les pages rubriques que sur les pages articles.

      + jmarco

      — -> réponse obtenue sur la liste :

      yorghos.remvikos> writes :

      >
      > Bonsoir,
      > Le menu dans son écriture initiale comporte une erreur de syntaxe de la
      > boucle hierarchie. Il manque à chaque fois le critère id_article et
      > id_rubrique. Sur les versions 1.8, il faut toujours penser à utiliser
      > la fonction debug. Elle s’avère souvent bien utile car les versions 1.7
      > étaient bien tolérantes.
      > +
      > Yorghos

    • Merci beaucoup pour cette réponse vraiment très rapide !

      Cependant je dois avouer que j’ai mal posé la question, ce qui évidemment impossible toute résolution du problème. En fait il ne s’agit pas d’un problème d’affichage qui touche l’appel du menu, mais un message d’erreur qui s’affiche à l’ouverture de menu.php3. Il s’agit de ce message :

      Warning : ksort() expects parameter 1 to be array, null given in /disque2/home/letrelu/www/inc-public-global.php3(107) : eval()’d code on line 59

      Warning : Invalid argument supplied for foreach() in /disque2/home/letrelu/www/inc-public-global.php3(107) : eval()’d code on line 60

      (/letrelu/ étant le nom du dossier racine)

      Ce qui me semble louche, c’est que tout semble marcher sur une version témoin qui utilise la version 1.7.2

      Je suis sceptique .... ;)

      Merci encore

      Barthélémy

    • ça marche très bien dans la version 1.8pr1
      félicitations

    Répondre à ce message

  • Ca marche très très bien.

    J’ai essayé d’appliquer les filtres (#EXPOSER aux différents niveaux de menu mais cela ne fonctionne pas.
    Suis-je la seule ??
    Merci

    Répondre à ce message

Ajouter un commentaire

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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom