Menu DHTML multi-niveaux

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Ce menu provient de DHTMLCentral. Il vous permet de rendre constamment accessible toutes les rubriques de votre site. Son utilisation est gratuite à condition de laisser le copyright. Les boucles mélangeant PHP et SPIP sont d’Arnaud et les costumes de Donald Kardwell. ;)
demo

Tester le menu

Avantages
- Afficher le menu avec une arborescence jusqu’à 3 niveaux de profondeur dans cette version. Les adaptations PHP et SPIP à faire sont minimes pour rajouter des niveaux le cas échéant.
- Afficher facilement d’autres éléments de menu en dehors des boucles et y associer des styles ou des évènements différents.

Inconvénients
- Si vous avez de nombreuses rubriques évitez de l’installer sur Free, Lycos et Cie. Quand la page n’est pas en cache, ces boucles sont (à mon goût) trop violentes pour leurs serveurs surchargés.
- Beaucoup d’options DHTML choisies ou de jeux sur les CSS, c’est risquer de flinguer l’affichage sur certains navigateurs. A manier donc avec parcimonie et tester le plus souvent possible la compatibilité avec les butineurs.

Mise en place

Téléchargez le pack et décompressez le à la racine de votre site.

Normalement, la seule modification obligatoire est la suivante :
menu.html - ligne 110 : « offlineroot » réclame le chemin de votre site sur le disque dur de votre site (utilisez le fichier real.php inclus pour le trouver rapidement)

le pack se compose de 6 fichiers :
fonctions/coolmenu4.js :
le script

fonctions/fill2.gif :
une image de fond exemple pour les calques du menu (inversez le commentaire dans les CSS de menu.html pour la supprimer)

fonctions/fleche_menu.gif :
flèche affichée dans le calque si une sous-rubrique est présente

menu.php3 :
page spip d’appel du squelette

menu.html :
fichier squelette avec les styles et les boucles... le seul à tripoter a priori

real.php :
placé à la racine du FTP, il affichera le chemin physique de votre site (ex : /home/sites/site111/web)

Pour des détails concernant les modifications de styles et les éventuels bugs du script, reportez vous à l’aide en ligne et au forum dédié au CoolMenu 4 sur DHTMLCentral mais aussi au thread d’origine sur la liste de diffusion SPIP.

Compatibilité

Le script du pack fonctionne avec les navigateurs suivants.

  Windows Mac Linux
Internet Explorer 6 Oui  ? ---
Internet Explorer 5.x Oui Oui ---
Mozilla 1.x Oui Oui  ?
Phoenix 0.5 Non ---  ?
Netscape 6 >7 Oui Oui  ?
Netscape 4.7 Oui*  ?  ?
Opera 7 Oui --- ---
Opera 6 Oui Non  ?
Opera 5  ?  ?  ?
Konqueror --- ---  ?
Apple safari (beta 2) --- Non ---

* enlever l’image de fond du style level0

Boucles

<?php $top=-1; $sub=-1; $subsub=-1; ?> 
<BOUCLE_menutop(RUBRIQUES){id_parent=0}{par titre}>
<?php $top++; ?>
<script>
oCMenu.makeMenu('top<?php echo $top; ?>', '', '&nbsp;#TITRE', '#URL_RUBRIQUE', '', '', '', '', '', '', '', '', '', '', '', '', '')</script>
  <BOUCLE_menusubrub(RUBRIQUES) {id_parent} {par titre}><?php $sub++; ?>
   <script>oCMenu.makeMenu('sub<?php echo $sub; ?>', 'top<?php echo $top; ?>', '&nbsp;#TITRE', '#URL_RUBRIQUE')</script>
   	<BOUCLE_menusubsub(RUBRIQUES){id_parent}><?php $subsub++; ?>
	<script>oCMenu.makeMenu('subsub<?php echo $subsub; ?>', 'sub<?php echo $sub; ?>', '&nbsp;#TITRE', '#URL_RUBRIQUE', '', 150, 0)</script>
	</BOUCLE_menusubsub>
</BOUCLE_menusubrub>
</BOUCLE_menutop>

La même pour gérer 4 sous-niveaux

On déclare « $subsubsub » en haut et on rajoute la boucle subsubsub à l’intérieur de la boucle subsub. Vous pouvez tout aussi bien appeler des ARTICLES à la place des RUBRIQUES.

<?php $top=-1; $sub=-1; $subsub=-1;$subsubsub=-1; ?> <BOUCLE_menutop(RUBRIQUES){id_parent=0}{par titre}>
<?php $top++; ?>
<script>
oCMenu.makeMenu('top<?php echo $top; ?>', '', '&nbsp;#TITRE', '#URL_RUBRIQUE', '', '', '', '', '', '', '', '', '', '', '', '', '')</script>
  <BOUCLE_menusubrub(RUBRIQUES) {id_parent} {par titre}><?php $sub++; ?>
   <script>oCMenu.makeMenu('sub<?php echo $sub; ?>', 'top<?php echo $top; ?>', '&nbsp;#TITRE', '#URL_RUBRIQUE')</script>
   	<BOUCLE_menusubsub(RUBRIQUES){id_parent}><?php $subsub++; ?>
	<script>oCMenu.makeMenu('subsub<?php echo $subsub; ?>', 'sub<?php echo $sub; ?>', '&nbsp;#TITRE', '#URL_RUBRIQUE', '', 150, 0)</script>
		
		<BOUCLE_menusubsubsub(RUBRIQUES) {id_parent}><?php $subsubsub++; ?>
		<script>oCMenu.makeMenu('subsubsub<?php echo $subsubsub; ?>', 'subsub<?php echo $subsub; ?>', '&nbsp;#TITRE', '#URL_RUBRIQUE', '', 150, 0)</script>
		</BOUCLE_menusubsubsub>
	
	</BOUCLE_menusubsub>
</BOUCLE_menusubrub>
</BOUCLE_menutop>
Memento des fonctions disponibles dans
l’appel d’un niveau de menu


(name, parent, txt, lnk, targ, w, h, img1, img2, cl, cl2, align, rows, nolink, onclick, onmouseover, onmouseout)

name = nom du calque
parent = nom du calque parent s’il s’agit d’une sous-rubrique
txt = affichage d’un texte à la place du lien dans la barre d’état
lnk = le lien vers la rubrique
targ = _self, _blank, _parent, _top
w = largeur du calque
h = hauteur
img1 = si vous n’utilisez que des images, c’est le chemin vers celle qui s’affichera OnMouseOut
img2 = chemin de l’image à afficher OnMouseOver
cl = nom du style OnMouseOut
cl2 = nom du style OnMouseOver
align = alignement du nom de rubrique dans le calque (left, right, center)
rows = pour décaler une sous-rubrique vers sa colonne parente (1 ou ’’)
nolink = 1 ou ’’ supprime le curseur de lien et son lien
onclick = action javascript supplémentaire « OnClick »
onMouseOver = évènement javascript supplémentaire « OnMouseOver »
onMouseOut = évènement javascript supplémentaire « OnMouseOut »

Bon courage, le jeu en vaut la chandelle.

Discussion

31 discussions

  • oxygene_carbone

    Je vous décris le menu que je suis en train de fabriquer :

    C’est un menu horizonal composé de 4 secteurs, chaque secteur a un nombre variable de rubriques.

    Grâce à Kangourou, je peux désormais afficher l’image correspondant à chaque secteur (rubrique de premier niveau) dans le menu. Chacune de ses images reprend le nom du secteur sur un fond de couleur différent.

    Jusqu’à là aucun problème dans l’esthètique de mes menus, ça marche super bien.

    Le hic maintenant.

    Je souhaite que chaque menu déroulant prenne la couleur de son secteur. Le problème c’est qu’avec les styles css on ne peut changer les couleurs que par niveau et non par ensemble de rubrique.

    COMMENT ON FAIT ? Merci d’avance.

    Répondre à ce message

  • 2

    J’ai développé le menu DHTML pour avoir un menu horizontal et je souhaite pour chaque rubrique faire afficher le logo de la rubrique correspondante.

    Ainsi j’ai écrit ceci dans le menu.html :
    Premier test :

    <script>oCMenu.makeMenu('top&lt;? echo $top; ?>','',' &nbsp;#TITRE',{{'#URL_RUBRIQUE','','','','#logo_rubrique','','','','','','','','','')}}</script>

    — > le menu fonctionne très bien mais le premier niveau ne s’affiche plus, c’est le deucième qui prend la place du premier niveau hierarchique.

    Deuxième test : (avec filtre aligner et adresse)

    <script>oCMenu.makeMenu(&#8217;top<pre><code style="color: #000000">&lt;? echo $top; ?&gt;</code></pre>
    <p><strong>&#8217;,&#8217;&#8217;,&#8217; #TITRE&#8217;,&#8217;#URL_RUBRIQUE&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;[(#LOGO_RUBRIQUE|RIGHT|#URL_DOCUMENT)]&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;&#8217;</strong>)&lt;/script</p>
    <p>--> le menu fonctionne très bien mais les logos ne peuvent s&#8217;afficher.</p>
    <p>QUE FAIRE POUR AFFICHER LES LOGOS<small class="fine d-inline"> </small>? SVP<small class="fine d-inline"> </small>!!!<br class='autobr' />
    Merci pour toutes tentatives d&#8217;explication....</p>
    • Salut,

      Essaye avec ceci :

      <script>
      oCMenu.makeMenu('top<? echo $top; ?>','','[(#TITRE|texte_script)]', '#URL_RUBRIQUE','','','','IMG/[(#LOGO_RUBRIQUE|fichier)]', '[IMG/(#LOGO_RUBRIQUE_SURVOL|fichier)]')
      </script>

      Il est par contre impossible d’afficher le titre sur le logo. Il n’est appelé ici que pour être indexé par les moteurs de recherche.

      @+

    • CA MARCHE............

      Merci beaucoup, c’est parfait.

      oxygene_carbone

    Répondre à ce message

  • Merci kango... ça marche !!

    Répondre à ce message

  • 1

    Il est vraiment fameux ce menu et ton site aussi

    J’ai malgré tout un problème, quand je modifie le nom d’une rubrique : celle-ci ne s’affiche plus !

    J’ai remarquer avec IE dans la barre d’état des erreurs sont signalées concernant je pense le script javascript

    il attend la fermeture d’une parenthèse.

    J’ai une parade qui est quand même très contraignante, que nous souhaiterions éviter :

    -  créer une nouvelle rubrique
    -  créer dans cette nouvelle rubrique, un nouvel article
    -  recopier le contenu de l’ancien article dans le nouveau.

    voir notre site pour constater le problème

    • Kangourous

      Salut,

      En fin de compte et pour corriger les boulettes postées plus bas, il suffit d’utiliser le filtre texte_script.

      Remplace tous les #TITRE par :
      (#TITRE

      Tu peux du coup rajouter autant de guillemets et d’apostrophe que tu souhaites.

      Merci pour le compliment. Y’a pas comme une légère redondance avec un post plus bas ? :D

      @+

    Répondre à ce message

  • 1

    Bonjour, et merci pour ce menu qui me plait beaucoup.
    J’ai malgré tout un problème, la position par rapport
    à la gauche de la page est fixe (oCMenu.fromLeft=0),
    hors sur mes pages tout est centré, donc lorsque je
    suis en plein écran j’ai mon menu qui se fixe sur la
    gauche de la page en dehors de la table principale
    (qui est centrée) contenant toutes mes données...
    comment faire en sorte que le menu se positionne bien
    à gauche de la table principale centrée ?
    Merci pour ton aide car j’essaie vainement plein de
    possibilités mais je ne vois vraiment pas...

    Répondre à ce message

  • 4
    François

    Super !
    Mais, malheureusement, mes liens ne fonctionnent pas. Le menu ne tient pas compte de l’emplacement réel des fichiers.
    Ainsi, en local, le site ou j’ai testé le menu est http://localhost/SPIP-v1-5-2/rubrique.php3 et, lui , cherche à ouvrir http://localhost/rubrique.php3?id_rubrique=1

    Au lancement, j’ai également des messages d’Erreur disant « ’oCMenu’ is undefined ». Ce qui disparait après avoir demandé de recalculer la page...

    Une idée du problème ?

    • Kangourou

      Salut,

      Hé oui, le pack est conçu pour la racine du site.

      Il te suffit de remplacer les #URL_RUBRIQUE dans les boucles de menu.html par :
      SPIP-v1-5-2/#URL_RUBRIQUE

      Pour le message d’erreur, il s’agit probablement d’une apostrophe dans un de tes titres de rubrique.
      Celà ne devrait causer aucun problème hormis d’ordre esthétique. N’ayant pas encore trouvé de parade efficace, tu peux utiliser cette portion de code que tu comprendras aisément.
      Place là à la fin de la balise

      de menu.html :
      function NoError()
      	{
      	return true;
      	}
      window.onerror=NoError;

      @+

    • Kangourou

      Plus précisement :

      <script language="JavaScript" type="text/JavaScript"
      function NoError()
      	{
      	return true;
      	}
      window.onerror=NoError;
      //-->
      </script>

      A placer donc entre les balises <head>.

    • Kangourou

      Oups désolé.

      En fait c’est encore plus simple que ça pour changer le chemin par défaut.

      Il suffit de rechercher l’argument « OnlineRoot » et d’y spécifier le nom de ton dossier.

      ex : oCMenu.onlineRoot=« /subfolder/ »

    • Il y a encore plus simple et automatique, c’est d’écrire dans les //Menu properties  :

      oCMenu.onlineRoot= "#URL_SITE_SPIP/"

      La racine sera ainsi toujours celle du site, que l’on travaille sur un site distant ou en local donc quelque soit le nom du chemin de la racine.

    Répondre à ce message

  • 4

    Bjr ...

    J’ai du mal avec la ligne 110.. Milles excuses mais :

    menu.html - ligne 110 : « offlineroot » réclame le chemin de votre site sur le disque dur de votre site (utilisez le fichier real.php inclus pour le trouver rapidement)

    Comprends pas ? mdr ... Je dois etre crevé

    • Oups, il y a effectivement plus clair comme formulation. Désolé.

      Il n’y a qu’à copier-coller sur cette ligne le résultat du fichier real.php

      ex : /home/sites/site111/web voire c :\Programme Files\EasyPHP\www

      C’est donc le chemin physique de ton site.

      @+

    • petitbiston

      Merci a toi ... Mais si je ne l’ai pas sur mon dur ? Parce que la ligne est à remplir si il est en local ... With Apache ... nan ?

    • ReSalut,

      -  charger le fichier real.php au même endroit que le menu.
      -  pointer vers http://www.monsite.org/real.php
      -  copier-coller l’adresse affichée par cette page sur la ligne 110 du fichier menu.html

      Bon courage.

    • petitbiston

       :-p Merci kango... Explications top ! pas plus limpides...

      Merci pour ta patience ...

      Take Care

    Répondre à ce message

  • 1

    Bonjour à tous,
    J’ai un problème de compatibilité du menu avec Nescape 7.0, il n’y a que le premier article qui s’affiche pour une rubrique et les couleurs associée au menu par un css ne fonctionne pas.
    Alors que sur IE 5.5 ; tout fonctionne ?!?!

    Si quelqu’un a une idée...

    • J’ai eu pas mal de problèmes aussi avec IE Mac. Tout parait bien fonctionner depuis que l’appel du menu se fait systématiquement en fin de page (avec un INCLURE qui renvoie au php3 du menu)
      Regarde si notre menu passe chez toi : http://www.mgbz-briey.net/

    Répondre à ce message

  • Pour info le menu de la démo fonctionne aussi sous Linux Mandrake 9.1 avec Mozilla 1.3 ou Konqueror

    Wil

    Répondre à ce message

  • 4
    karinico

    Bonjour,
    Je suis novice sur SPIP et piètre programmeur. Donc ce genre de contribution m’intéresse beaucoup. J’ai téléchargé et installé ce menu en local. Il marche très bien. C’est vraiment super ! En existe-t-il d’autres ? J’aurais notamment besoin d’un menu ou les niveaux fils se découvrent en dessous des niveaux parents. Est ce possible, en gardant bien sur les boucles SPIP ?

    • catherine

      Bonjour,

      De mon côté j’essaie depuis plusieurs jours sans succès...Bon d’accord je ne suis pas très douée... :-) mais je suis graphiste pas informaticienne , et j’essaie de créer des squelettes un peu plus attrayant sur spip
      Est-ce que tu m’enverrais ton squelette pour que je puisse avancer un peu...à cette adresse mel catherine.henry@tice.ac-caen.fr
      Merci beaucoup
      Catherine

    • Kangourou

      Salut,

      Pour aligner les rubriques filles vers le bas tu peux agir de 2 façon :

      1-Méthode simple (inspirée de level[0] quelques lignes au dessus des boucles du menu) :

      -  Dans la section oCMenu.level[1], mettre les offset X et Y à 0 et rajouter cette ligne :

      oCMenu.level[1].align="bottom"

      2-Méthode compliquée mais aux extrapolations interessantes :

      -  en modifiant la valeur de

      oCMenu.level[1].offsetX=-(oCMenu.level[1].width-2)/2+20
      oCMenu.level[1].offsetY=0

      vers

      oCMenu.level[1].offsetX=-oCMenu.level[1].width
      oCMenu.level[1].offsetY=oCMenu.level[1].height

      Tu trouveras sur SPIP Contrib cet autre menu hierarchique facile à implémenter et plus léger car uniquement basé sur des éléments déjà présents dans SPIP.

      Ces boucles PHP/SPIP de menu sont touffues mais finalement simples à comprendre et souvent faciles à transposer à d’autres scripts statiques.

      Bon courage

      @+

    • Kangourou

      Salut,

      Si le menu s’affiche avec les fichiers fournis dans l’article, c’est déjà bon signe. Je ne sais comment tu as procédé mais essaye peut-être de construire pas à pas à partir de ces pages.

      Pour faire selon tou goût, tu as les styles et pour le positionnement, il te faudra changer les valeurs suivantes :

      //Menu properties   
      oCMenu.pxBetween=7
      oCMenu.fromLeft=15
      oCMenu.fromTop=165  
      oCMenu.rows=0 
      oCMenu.menuPlacement="left"

      Si c’est vraiment la berezina, tu peux essayer d’intégrer le menu cité dans le message ci-dessous.

      Bon courage

      @+

    • Merci beaucoup....j’ai réussi ça marche !
      Catherine

    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