Menu multiniveau

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 467 fois - Téléchargée 28 fois


Contenu du snippet

Ce code génère du code XHTML pour un menu. Le structure de menu est passée en argument, la fonction retourne le code qui peut alors être envoyé via l'instruction echo.

Principe d'utilisation :

- $titres est un tableau dont les éléments sont les titres de items du menu. Chaque celulle est de la forme "Menu>SousMenu>Item", où ">" est le spérateur de niveaux qui peut être modifié.

- $URIs est un tableau dont les éléments sont les URIs correspondants aux items du menu. Il doit avoir la même taille que $titres

- $dernierindex est une variable interne à la fonction

- $mouseonfct est le nom de la fonction Javascript devant gérer l'évènement MouseOn (n'est utile que dans le mode d'affichage 2)

- $mouseoutfct correspond au précédent pour l'évènement MouseOut

- $menuselect est le titre de l'item de menu actuellement sélectionné. Il doit être la chaîne vide ou un élément de $titres

- $niveau est une variable interne sui doit être initialisée à 0 ou 1 (voir plus bas)

- $prefixe est un préfixe qui sert à identifier le menu. Le contenu de cette variable apparaît dans le nom des ID et des CLASS des éléments (X)HTML générés

- $baseURI peut être utilisé si tous les URIs des pages auxquelles on accède par le menu commencent de la même façon : le contenu de cette variable est ajouté devant les éléments de $URIs

- $separateur est le séparateur de niveaux

- $modeaff vaut 0, 1 ou 2. 0 est le mode d'affichage compact, 1 tout visible et 2 est un mode expérimental utilisant le JavaScript

En outre la fonction utilise une variable globale (le tableau $CreeMenuCount)

Source / Exemple :


function CreeMenu($titres,$URIs,&$dernierindex,$mouseonfct,$mouseoutfct,$menuselect,$niveau,$prefixe,$baseURI,$separateur,$modeaff){
    global $CreeMenuCount;
    
    if ($niveau==0){
	  $CreeMenuCount[$prefixe]=0;
	  return CreeMenu($titres,$URIs,$dernierindex,$mouseonfct,$mouseoutfct,$menuselect,1,$prefixe,$baseURI,$separateur,$modeaff);
	}
	
    $i=0;$result='';
    $imax=count($titres);
    if (count($URIs)!=$imax) return 'Erreur dans le menu (niveau '.$niveau.') : dimension.';
    while($i<$imax){
        $titredecomp=explode($separateur,$titres[$i],$niveau);
        if(count($titredecomp)<$niveau){$dernierindex=$i-1; return $result;}
        ++$CreeMenuCount[$prefixe];
        if($i==$imax-1)
            $titredecompsuiv=array();
        else
            $titredecompsuiv=explode($separateur,$titres[$i+1],$niveau+1);
        if(count($titredecompsuiv)<=$niveau){
            if(substr($menuselect,0,strlen($titres[$i]))==$titres[$i])
                $result.='<p class="'.$prefixe.$niveau.'" id="id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'">'.htmlentities($titredecomp[$niveau-1])."</p>\n";
            else
                $result.='<p><a class="'.$prefixe.$niveau.'" href="'.$baseURI.$URIs[$i].'" id="id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'">'.htmlentities($titredecomp[$niveau-1])."</a></p>\n";
            ++$i;
        }else{
            if(substr($menuselect,0,strlen($titres[$i]))==$titres[$i]){
                if($titres[$i]==$menuselect)
                    $result.='<p class="'.$prefixe.$niveau.'" id="id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'">'.htmlentities($titredecomp[$niveau-1])."</p>\n";
                else{
                    $result.='<p><a class="sel'.$prefixe.$niveau.'" href="'.$baseURI.$URIs[$i].'" id="id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'"';
                $result.='>'.htmlentities($titredecomp[$niveau-1])."</a></p>\n";}
                $result.="<div";
                $result.=" id=\"id".$prefixe.'-'.$CreeMenuCount[$prefixe]."-div\"><blockquote class=\"bq".$prefixe.($niveau+1)."\">\n";
                $result.=CreeMenu(array_slice($titres,$i+1),array_slice($URIs,$i+1),$retdernierindex,$mouseonfct,$mouseoutfct,$menuselect,$niveau+1,$prefixe,$baseURI,$separateur,$modeaff);
                $result.="</blockquote></div>\n";
            }else{
                $result.='<p><a class="'.$prefixe.$niveau.'" href="'.$baseURI.$URIs[$i].'" id="id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'"';
                switch($modeaff){
                  case 2:
                    $result.=' onmouseover="javascript:'.$mouseonfct.'(\'id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'-div\');" onmouseout="javascript:'.$mouseoutfct.'(\'id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'-div\');"';
                }
                $result.='>'.htmlentities($titredecomp[$niveau-1])."</a></p>\n";
                $result.="<div";
                switch($modeaff){
                  case 2:
                    $result.=' onmouseover="javascript:'.$mouseonfct.'(\'id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'-div\');" onmouseout="javascript:'.$mouseoutfct.'(\'id'.$prefixe.'-'.$CreeMenuCount[$prefixe].'-div\');"';
                  case 0: 
                    $result.=" style=\"display:none;\"";
                    break;
                }
                $result.=" id=\"id".$prefixe.'-'.$CreeMenuCount[$prefixe]."-div\"><blockquote class=\"bq".$prefixe.($niveau+1)."\">\n";
                $result.=CreeMenu(array_slice($titres,$i+1),array_slice($URIs,$i+1),$retdernierindex,$mouseonfct,$mouseoutfct,$menuselect,$niveau+1,$prefixe,$baseURI,$separateur,$modeaff);
                $result.="</blockquote></div>\n";
            }
            $i=$i+$retdernierindex+2;
        }
    }
    $dernierindex=$imax-1;
    return $result;
}

Conclusion :


Une façon typique d'utiliser cette fonction est :

$MesTitres = array (
'Menu1',
'Menu1>SousMenu11',
'Menu2',
'Menu2>SousMenu21',
'Menu2>SousMenu22',
'Menu2>SousMenu23>SousMenu231'
);

$MesURIs = array (
'truc.php',
'machin.htm',
'foo.html',
'dossier/gen.php',
'dossier/detail.php',
'dossier/details/section1.php'
);

echo CreeMenu ($MesTitres, $MesURIs, $dummy, 'MnuOn', 'MnuOut', 'Menu2>SousMenu21', 0, 'monmenu', 'http://perso.truc.fr/monsite/', '>', 0);

L'affichage du menu est régi par la feuille de style (CSS). Les classes des objets générés sont les suivantes (en supposant que le $prefixe est PREF) :

- Pour les menus non sélectionnés : PREF1, PREF2,..., PREFn selon le niveau de l'objet
- Pour les menus sélectionnés : selPREF1,..., selPREFn
- Pour les blocs d'indentation : bqPREF1,..., bqPREFn

La fonction donne également aux objets des ID de la forme idPREF-1,..., idPREF-k et idPREF-1-div,..., idPREF-k-div (numérotés sans considération de niveau, ainsi k est le nombre total d'éléments de $titres). Ces ID sont utiles aux fonctions Javascript MouseOn et MouseOut.

A voir également

Ajouter un commentaire Commentaires
Messages postés
12
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
4 janvier 2009

> en plus ton array m'embrouille plus qu'autre chose... avec ton '>'...
>> Je pense que l'exemple d'utilisation fourni est suffisament clair. Me trompé-je ?

Non mais c le genre de trucqui me rend malade...



> pas super si le gars qui doit modifier les menus t'oublie 1 '>' (par expérience de travailler avec des guignols..)
>> Si tel est le cas, on s'en rendra compte tout de suite ! Et puis celui qui se plante avec ce genre de détails peut tout aussi se planter en mettant à jour une base de données (décalage d'un champ, par exemple...

En travaillant avec une DB, tu peux faire un "form" pour modifier les records...ca évite que le gars se plante.

> Arriver sur une HOMEPAGE et voir 4 erreurs SQL, du texte sur le titre...teeeeribleeee
>> Mais de quoi parlez-vous ?

Bon si tu veux je t'envoie un screenshot de mon premeir passage sur ton site...ct vraiment super ;)
Messages postés
40
Date d'inscription
samedi 12 avril 2003
Statut
Membre
Dernière intervention
13 mai 2006

> Alors après testé la chose...y a clairement un bug...
> 2,3 reefresh... [et c preske free (sorry g'mé gare ;)]
Je ne comprends pas...

> T'as bien une DB derrière ton bazar...tu c? c magik...
> ca peut même contenir les titres d'1 menu...et sous-menu...et sous-menu...
C'est vrai. Mais cela est beaucoup plus lourd qu'un tableau.
Et puis, à l'époque où j'ai programmé ce script, je ne maitrisais pas l'usage des bases de données.
Enfin, lorsqu'on n'est pas son propre hébergeur, on n'a pas toujours une base de données à disposition.

> en plusieurs langues aussi...
C'est également possible avec ce script sans trop de difficultés : on peut par exemple définir plusieurs
tableaux pour les titres et utiliser le bon avec un switch(); sur la langue.

> en plus ton array m'embrouille plus qu'autre chose... avec ton '>'...
Je pense que l'exemple d'utilisation fourni est suffisament clair. Me trompé-je ?

> pas super si le gars qui doit modifier les menus t'oublie 1 '>' (par expérience de travailler avec des guignols..)
Si tel est le cas, on s'en rendra compte tout de suite ! Et puis celui qui se plante avec ce genre de détails peut
tout aussi se planter en mettant à jour une base de données (décalage d'un champ, par exemple...

> Arriver sur une HOMEPAGE et voir 4 erreurs SQL, du texte sur le titre...teeeeribleeee
Mais de quoi parlez-vous ?
Messages postés
12
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
4 janvier 2009

Alors après testé la chose...y a clairement un bug...
2,3 reefresh... [et c preske free (sorry g'mé gare ;)]

...Ca marche mais pourquoi faire simple quand on peut faire compliqué...

T'as bien une DB derrière ton bazar...tu c? c magik...ca peut même contenir les titres d'1 menu...et sous-menu...et sous-menu...en plusieurs langues aussi...

en plus ton array m'embrouille plus qu'autre chose... avec ton '>'...
pas super si le gars qui doit modifier les menus t'oublie 1 '>' (par expérience de travailler avec des guignols..)

Ca rendrait certainement le code plus clair aussi.
Arriver sur une HOMEPAGE et voir 4 erreurs SQL, du texte sur le titre...teeeeribleeee

Enfin je terminerai...je préfère une capture au moins je vois de quoi on parle sans pour autant atendre que l'hébergeur répare une éventuelle défaillance...hihi..

en résumé : TRY AGAIN...but well attempt
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
défaillance passagere de free.... lol, oui pourquoi pas... c'est pas moi qui l'ai dit...
Messages postés
40
Date d'inscription
samedi 12 avril 2003
Statut
Membre
Dernière intervention
13 mai 2006

Oui, cela se produit une fois sur deux. Je ne comprends pas d'où cela peut provenir. Peut-être une défaillance passagère du serveur ? Persistez et vous devriez obtenir quelquechose.
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.