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.

Dernière modification de cette page le 6 décembre 2006

Discussion

31 discussions

  • Bonsoir a tous,

    voici la solution que Fred m’a donnée sur la liste de spip :

    dans le fichier « menu.html »
    il faut rajouter :

    global $menu;

    entre

    <?php

    et

    $i=0;
    <BOUCLE_menu(RUBRIQUES)...

    au debut du fichier.

    Et tout fonctionne en Spip2.0.x

    Bonnes fêtes,

    Jmarco

    Répondre à ce message

  • Bonjour,
    je reviens sur ce menu qui ne veut toujours pas fonctionner sur spip 2.0 (dernier post du mois de septembre)
    pourtant je vois qu’en haut de cette page Spip 2.0 est bien là, donc que ce menu devrait fonctionner...
    si quelqu’un l’a fait, il serait bon de savoir comment,
    dans rubrique.html j’ai :

     <INCLURE{fond=inc/inc-menu}{id_rubrique} />

    et j’ai toujours ces warnings

    Warning: ksort() expects parameter 1 to be array, null given in /mnt/pingouin/00sites/10-03-2008-www/www/00le-clapotis/ecrire/public/assembler.php(534) : eval()'d code on line 347
    
    Warning: Invalid argument supplied for foreach() in /mnt/pingouin/00sites/10-03-2008-www/www/00le-clapotis/ecrire/public/assembler.php(534) : eval()'d code on line 348

    merci d’avance,
    j’ai 3 sites qui attendent pour passer en v2.0, et ce menu est bien.

    Cordialement,
    Jmarco

    Répondre à ce message

  • Bonsoir,
    je viens d’installer la spip v2.0 beta2 12774, et ce menu ne répond plus.
    A la place j’ai: :
    > Warning : ksort() expects parameter 1 to be array, null given in /mnt/pingouin/00sites/10-03-2008-www/www/spip2beta/ecrire/public/assembler.php(533) : eval()’d code on line 340

    > Warning : Invalid argument supplied for foreach() in /mnt/pingouin/00sites/10-03-2008-www/www/spip2beta/ecrire/public/assembler.php(533) : eval()’d code on line 341
    Est-ce que certain d’entre-vous ont ce probleme ?
    Mon test est en local, bien-sûr.

    je confirme que sur la 1.9.2e il fonctionne très bien.

    Merci de vos réponses,
    amicalement,
    Jmarco

    Répondre à ce message

  • j’ai en fait une question.
    On a
    une rubrique, une sous rubrique, puis disons un article.
    Comment puis je faire pour nommer l’article : title ; « nom de la rubrique - nom de la sous rubrique ». ?

    merci

    Répondre à ce message

  • Bonjour à tous,

    ce menu est une vraie petite merveille, je suis sous spip1.9.2a et je voudrais masquer un article, mais en dépit de mes efforts je n’arrive a rien,

    donc soit avec un mot clef : {titre_mot=Cacher}

    ou soit avec une restriction au niveau du titre, la 1re lettre :

    {titre!==^[xX]} rien n’y fait, (l’article s’appelle Xcalendrier dans la rubrique « AGENDA » )
    merci,
    a+ Jmarco

    Répondre à ce message

  • 4

    pas d’affichage des sous rubriques et leur contenu.

    Dommage :-(

    • Bonsoir a tous , pour moi ausi ce menu ne fonctionnait plus dans spip 1.9.1,
      donc je viens de trouver une soluce en local,(je n’ai pas encore fait la mise a jour en ligne, qqs petits détails de liens a regler...),
      en fait c’est dans le fichier menu.html qu’il faut rajouter une ligne :

      <BOUCLE_menu(RUBRIQUES) {racine} {par titre} {inverse}>
      	<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++;
      		<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}>
      
      <!--  ici, pour pouvoir faire apparaitre les sous rubriques et leurs articles  -->
      
      		$menu[$i]["[(#TITRE|kenum)] - #ID_ARTICLE"]=array("parent"=>"#ID_RUBRIQUE","titre"=>"[(#TITRE|denum)]",
      "idrub"=>"","idart"=>"#ID_ARTICLE");
      		
      <!--  / fin du rajout   -->
                      <BOUCLE_sous_menu(boucle_menu_n)></BOUCLE_sous_menu>
      		</BOUCLE_menu_r>
      		$i--;
      	</BOUCLE_menu_n>
      </BOUCLE_menu>

      en fait, j’ai fait un simple copier-coller, de l’expression superieure, je ne suis pas du tout un crac de php & Cie, mais c’est plutot en bricolant...
      Donc testez et dites moi si chez vous c’est bon.

      + jmarco

    • Salut, je suis avec spip 1.9 et je n’arrive pas a faire fonctionner le menu meme avec ta phrase de code magique (je suis en local)
      Pourrais tu m’envoyer ton squellette stp ?

    • Bonjour, je le poste ici , je n’ai pas ton mail :

      <script type="text/javascript" language="javascript" src="[(#CHEMIN{menu.js})]"></script>
      
      <?php
      
      $i=0;
      
      <BOUCLE_menu(RUBRIQUES) {racine} {par titre} {inverse}>
      
              <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++;
      
                      <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}>
      
                      $menu[$i]["[(#TITRE|kenum)] - #ID_ARTICLE"]=array("parent"=>"#ID_RUBRIQUE","titre"=>"[(#TITRE|denum)]","idrub"=>"","idart"=>"#ID_ARTICLE");
      
                      <BOUCLE_sous_menu(boucle_menu_n)></BOUCLE_sous_menu>
      
                      </BOUCLE_menu_r>
      
                      $i--;
      
              </BOUCLE_menu_n>
      
      </BOUCLE_menu>
      
      
      
      function ecrire_menu ($i,$parent) {
      
              global $menu;
      
              ksort($menu[$i],SORT_NUMERIC);
      
              foreach($menu[$i] as $menu_o ) {
      
                      $largeur=201-(($i-1)*16);
      
                      if ($menu_o["parent"]==$parent) {
      
                              if ($menu_o["idrub"]!="") {
      
                                      echo "
      
                                              <div class=\"lienr\">
      
                                                      <div class=\"plusmoins\" id=\"plusmoins".$menu_o["idrub"]."\"  onclick=\"change(".$menu_o["idrub"].");\" > </div>
      
                                                      <a id=\"tete_rub".$menu_o["idrub"]."\" class=\"alien\" href=\"#URL_PAGE{rubrique,id_rubrique}=".$menu_o["idrub"]." \">".$menu_o["titre"]."</a>
      
                                              </div>
      
                                              <div id=\"rub".$menu_o["idrub"]."\" class=\"niv\" >
      
                                      ";
      
                                      $prochain_parent=$menu_o["idrub"];
      
                                      $k=1+$i;
      
                                      ecrire_menu ($k,$prochain_parent);
      
                                      echo "
      
                                              </div>
      
                                      ";
      
                              } else {
      
                                      echo "
      
                                              <div class=\"lien\"><a id=\"art".$menu_o["idart"]."\" class=\"alien\" href=\"#URL_PAGE{article,id_article}=".$menu_o["idart"]."\"><img src='squelettes/sculpteurs3/file.gif' width='16' height='16' border='0' alt='file'>".$menu_o["titre"]."</a></div>
      
                                      ";
      
                              }
      
                      }
      
              }
      
      }
      
      ecrire_menu(0,0);
      
      
      
      ?>
      
      
      
      <B_menu_ouvre_article>
      
      <BOUCLE_menu_ouvre_article(ARTICLES){id_article}>
      
              <script type="Text/JavaScript">
      
              <BOUCLE_menu_voir_article(HIERARCHIE){id_article}>
      
                      change('#ID_RUBRIQUE');
      
              </BOUCLE_menu_voir_article>
      
              document.getElementById('art#ID_ARTICLE');
      
              </script>
      
      </BOUCLE_menu_ouvre_article>
      
      </B_menu_ouvre_article>
      
      
      
              <BOUCLE_menu_ouvre_rubrique(RUBRIQUES){id_rubrique}>
      
                      <script type="Text/JavaScript">
      
                      <BOUCLE_menu_voir_rubrique(HIERARCHIE)>
      
                              change('#ID_RUBRIQUE');
      
                      </BOUCLE_menu_voir_rubrique>
      
                      change('#ID_RUBRIQUE');
      
                      document.getElementById('tete_rub#ID_RUBRIQUE');
      
                      </script>
      
              </BOUCLE_menu_ouvre_rubrique>
      
      <//B_menu_ouvre_article>

      a+ jmarco

    • Bonsoir,

      je viens de migrer (le-clapotis.net) vers Spip 1.9.2 en local bien-sur, et ce menu marche très bien avec les modifs ci-dessus decrites.

      + Jmarco

    Répondre à ce message

  • Bonjour

    Suite à des modifications sur le fichiers nous l’avons fait fonctionner avec une version 1.9.1 une petite modification des CSS, ains que la suppression des fichiers .php3 et un include directement dans le squelette MGS

    j’aurais bien voulu joindre le .zip mais je ne peux pas uploader içi :’(

    scoubidoo

    Répondre à ce message

  • Bonjour,
    ce menu me plaid enormément mais j’aimerais qu’il affiche toute mes sous rubriques d’une seule.
    Je me doute qu’il faut mettre le id_parent quelques part mais ou ?

    Le menu afficherait toutes mes sous rubriques de « patrimoine » ainsi que les articles qui les conserne on fonction d’ou est l’internaute :

    * patrimoine(rubrique)
    *langeac(rubrique)
    - monsatère (article)
    - collègiale (article)
    *chanteuges(rubrique)

    Répondre à ce message

  • 1

    Merci pour ce menu déroulant facile à implémenter.

    J’utilise SPIP v1-8b2 et FireFox 1.0 ainsi que Safari. J’emploie un menu à deux niveaux. Tout marche bien, sauf la dernière rubrique qui se déplie mal.

    cf. Livre d’Or : site.

    • Je n’ai pas pu régler le problème de la dernière rubrique : aussi je suis passé au menu spipien des contrib.

      Bien cordialement.

      Serge

    Répondre à ce message

  • Ce menu, et c’est dommage, génère un parse error si le titre d’une rubrique ou d’un article contient un ou des guillements ("). On obtient alors l’affichage suivant :
    Parse error: parse error, expecting `')'' in inc-public.php3(20) : eval()'d code on line 16. testé avec Spip 1.8.3.

    Une piste pour régler de petit problème ?

    ci-dessous le code proposé par la contrib à ajouter dans mes_fonctions.php3

    <?
    
    function denum($texte)
    {
            $toto=ereg_replace("^[0-9]*\. ","",$texte);
            return $toto;
    }
    
    function kenum($texte)
    {
      if (ereg ("^([0-9]*)\. ", $texte, $regs))
            return $regs[1];
    }
    
    ?>

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

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