Menu multiniveau


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

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.