Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GÉNÉRATEUR DE MENU MULTILANGUE AVEC CONTROLE DU NIVEAU D'ACCÉS À PARTIR DE PLAN DE SITE XML


Information sur la source

Catégorie :Xml Classé sous : xml, plan, simplexml, recursive, sitemap Niveau : Débutant Date de création : 09/03/2007 Date de mise à jour : 09/03/2007 11:11:49 Vu : 5 813

Note :
Aucune note

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

Description

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

  • <?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>
<?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)
 

Historique

09 mars 2007 11:11:49 :
un peu d'orthographe

Commentaires et avis

signaler à un administrateur
Commentaire de lilippx le 09/03/2007 15:22:01

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?.....

signaler à un administrateur
Commentaire de jean84 le 10/03/2007 01:34:34

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 = '<ul>';
foreach($node->sitenode as $sitenode)
{
if($this->is_in(explode(',',$sitenode['level']),$this->_access_level)==true)
{
$Buffer . = '<li><a href=\'';
$Buffer .= $sitenode['url'];
$Buffer .= '\' ';

if(!empty($sitenode['id']))
$Buffer .= 'id=\''.$sitenode['id'].'\' ';
if(!empty($sitenode['class']))
$Buffer .= 'class=\''.$sitenode['class'].'\' ';

$Buffer .= '>';
$Buffer .= $sitenode[$this->_language];
$Buffer .= '</a>';

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

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

@++

signaler à un administrateur
Commentaire de lilippx le 10/03/2007 09:31:30

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

signaler à un administrateur
Commentaire de garfield90 le 12/03/2007 20:49:49

ta function is_in peut etre remplacer : regardes in_array => http://fr.php.net/in_array

signaler à un administrateur
Commentaire de lilippx le 13/03/2007 08:52:01

salut,
je me disais bien que ca devait deja exister...
j'aurrais du chercher.
merci

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lecture XML via simplexml_load_file() génère une erreur "Input is not proper UTF-8, indicate encoding !" [ par karpediem ] Bonjour @ toutezéatous,J'ai un petit pb lorsque j'essaie de lire un fichier XML qui m'est transmis par un prestataire. C'est ma première expérience de XML/PHP utilisation du nodeName [ par babou54 ] Bonjour, XML et moi on est pas très copain  J'ai un petit problème que je comprend pas et j'aurais besoin d'aide ------------------------------------- Melange PHP et JavaScript [ par khattary ] Error convertoring HTML to XHTML: System.ArgumentException: The empty string '' is not a valid name. at System.Xml.XmlTextWriter.ValidateName(Strin Melange PHP et JavaScript [ par khattary ] Error convertoring HTML to XHTML: System.ArgumentException: The empty string '' is not a valid name. at System.Xml.XmlTextWriter.ValidateName(Strin aide sur les problemes de xsl [ par jobnet ] j'ai suivi les étapes de configuration du xsl et quelque chose de sablot mais le problèmes est le même 'Call to undefined function xslt_create()voila probleme avec flash& xml, joomla et base de donné [ par la_flibuste ] bonjour a tousmon problème : j'ai un site sous joomla, pour un club sportif....je voudrais que mon flash galerie qui fonctionne avec un fichier xml ex EXTRAIRE XML de la base mysql [ par mastraze ] Bonjour tout le monde,J ai trouvé ce bout de code en php qui permet de générer un fichier xml à partir d'une table MySQL . *************************** Ecrire dans un fichier xml avant les 2 derniers balises [ par HF974 ] bonjour je voudrais générer un fichier kml (fichier xml de google pour afficher des point dans google earth) à partir de php cela fonctionne très bi SCRIPT [ par bayrem90 ] j'ai commencer de faire mon page XML pour me rewriting de mon site PHP. mais pour mettre tous les liens des produits de mon sites c'est énormément tro Web Service retournant de l'HTML au lieu du XML [ par japette ] Bonjour à tous,J'ai écrit un web service bidon en PHP pour tester la génération de WSDL via Symfony... le problème est que lorsque je l'invoque via un


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC Magic

Entre 429€ et 429€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.