Générateur de menu multilangue avec controle du niveau d'accés à partir de plan de site xml

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 450 fois - Téléchargée 19 fois

Contenu du snippet

Cette classe permet à partir d'un plan de site en xml de generer automatiquement un menu en fonction de la langue et du niveau d'authentification.

Source / Exemple :


<?php
class menu
{
  private $_xml_source;
  private $_language;
  private $_access_level;
  //permet d'afficher le noeud de depart(accueil)
  var $_show_starting_node;
  //constructeur
  function menu($set_xml_source,$set_access_level,$set_language)
  {
    $this->_xml_source=$set_xml_source;
    $this->_access_level=$set_access_level;
    $this->_language=$set_language;    
  }
  //fonction recursive pour parcourir toutes les branches du xml
  private function check_node($node)
  {
    echo('<ul>');
    foreach($node->sitenode as $sitenode)
    {
      if($this->is_in(explode(',',$sitenode['level']),$this->_access_level)==true)
      {
        echo('<li><a href=\'');
        echo($sitenode['url']);
        echo('\' ');
        if(!empty($sitenode['id'])){echo('id=\''.$sitenode['id'].'\' ');}
        if(!empty($sitenode['class'])){echo('class=\''.$sitenode['class'].'\' ');}
        echo('>');
        echo($sitenode[$this->_language]);
        echo('</a>');
        if(!empty($sitenode->sitenode))
        {
          $this->check_node($sitenode);
        }        
        echo('</li>');
      }      
    }
    echo('</ul>');    
  }
  public function display()
  {
    $xml=simplexml_load_file($this->_xml_source);
    if ($this->_show_starting_node==true)
    {
      $this->check_node($xml);
    }
    else
    {
      $this->check_node($xml->sitenode);
    }    
  }   
  private function is_in($tab,$value)
  {
    $return_value=false;
    foreach($tab as $tab_value)
    {
      if($tab_value==$value)
      {
        $return_value=true;        
      }
    }
    return $return_value;
  }
}
?>

XML exemple :

<?xml version="1.0" encoding="utf-8"?>
<sitemap>
  <sitenode url='index.php' fr='Accueil' en='Index' level='0,1,2,3,4,5' >
     <sitenode url='page2.php' fr='Pagefr1' en='Pageen1' level='0,1,2,3,4,5' id='mnu_page2'>
        <sitenode url='page3.php' fr='Pagefr2' en='Pageen2' level='0,1,2,3,4' class='level2' />
        <sitenode url='page4.php' fr='Pagefr3' en='Pageen3' level='0,1,2,3,4' />
     </sitenode>     
     .....
  </sitenode>
</sitemap>

Conclusion :


pour créer le menu :

$menu=new menu('sitemap.xml',$level,$langue);
//affiche le premier noeud(index)
$menu->_show_starting_node=true;
$menu->display();

(on peut passer des classes css et des id dans les attributs du xml)

A voir également

Ajouter un commentaire

Commentaires

lilippx
Messages postés
149
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
15 septembre 2007

salut,
je me disais bien que ca devait deja exister...
j'aurrais du chercher.
merci
cs_garfield90
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

ta function is_in peut etre remplacer : regardes in_array => http://fr.php.net/in_array
lilippx
Messages postés
149
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
15 septembre 2007

salut, merci pour ce petit conseil.
Sinon, pour la structure du xml, y'a un exemple en bas de la source.
pour que ce soit plus propre, j'aurrais pu faire :
<sitenode id='....' class='....'>
<language id='fr' url='....' value=''/>
<language id='en' url='....' value=''/>
<sitenode>
<language id='fr' url='....' value='.....'/>
<language id='en' url='....' value='......'/>
</sitenode>
</sitenode>

ca permettrai de passer la langue par $_GET plus facilement.
voilà bonne journée
cs_jean84
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009

Avec DOM tout simplement ? Non je plaisante (quoi que ...) ^^
Je vois pas trop quoi dire sur ta classe, je ne connais pas du tout simpleXML, je suis un adepte de DOM.
Un petit truc quand meme : dans ta boucle foreach dans la fonction menu::check_node(), evite d'utiliser a repetition echo.
Dans un cas extreme, tu pourrais utiliser ob_start() & ob_flush() avant et apres pour eviter de solliciter autant de fois le navigateur. A chaque tour de boucle, tu executes une dizaines de fois cette fonction ce qui a pour effet d'envoyer une dizaine de fois au navigateur du texte.
Essaye de buffeurise (je sais pas trop si sa se dit :p) toute ta boucle avant de l'envoyer, tu y gagneras en perf.

private function check_node($node)
{
$Buffer = '';
foreach($node->sitenode as $sitenode)
{
if($this->is_in(explode(',',$sitenode['level']),$this->_access_level)==true)
{
$Buffer . = '<li>';
$Buffer .= $sitenode[$this->_language];
$Buffer .= '';

if(!empty($sitenode->sitenode))
{
$this->check_node($sitenode);
}
$Buffer .= '</li>';
}
}
return $Buffer.'':
}

Sa sera plus rapide ! Et sinon, quelle doit etre la srtucture de ton document XML ?

@++
lilippx
Messages postés
149
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
15 septembre 2007

Petite contrainte, simpleXML n'accepte que de l'utf-8 en entrée et génère du utf-8 en sortie.
Si vous voulez espérer du iso-8859-1 en sortie, modifier la ligne 30 pour :
echo(utf8_decode($sitenode[$this->_language]));

à quand un monde sans utf-8?.....

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.