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 : 4 959

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

Comment faire une iclude dans l'include..... [ par SurfSilver ] Salut à tous.Voila mon problème est que je pars d'un fichier dans l'arborescence suivant :/sitemap.php&nbsp;|=&gt; include"_include/inc.php/sitemap.in Réactualisation d'une page tjrs en premier plan. Help :) [ par lechti62 ] Bonjour j'ai une pag dans uen frame qui s'actualise toutes les 2 secondes de cette façon&lt;head&gt;&lt;meta http-equiv="refresh" content="2"&gt;&lt;/ Php et excel ???? [ par Adagyo ] Salut @ tous,Je cherche un moyen de faire communiquer le contenu d'une base MySQL avec un tableau Excel.J'ai pensé à passer par du XML (je fait une re livre d'or avec flash et xml [ par bryc2 ] J'ai à faire un livre d'or avec flash et xml,y'a t'il quelqu'un qui pourrait me donner des informations à ce sujet?merci d'avance!!! Comment modifier des XML avec PHP??? [ par guiout ] Salut à tous,voilà mon pb, je voudrais traiter des XML existantes.Par traiter j'entends modifier le contenu textuel entre certaines balises.J'utilise PHP XML .... ? [ par Joez ] Voila comment faire pour mettre ce fichier www.cfp29.org/CDI2.XML dans une base de données Mysql ?je ne sais pas faire .... XML et PHP [ par tom ] Bonjour tout le monde!Est ce que quelqu'un sait comment récupérer des données XML dans une page PHP? $HTTP_POST_VARS ne marche pas...Merci pour votre xml et mysql [ par boin ] salut,je voudrais savoir s'il est possible d'importer un fichier xml vers une base mysql?merci d'avance.B2 Parser xml en php [ par tahbre ] Bonjour à tous, Je dois accéder à un fichier xml qui est sur un autre site ftp que le mien, et je veux réaliser un parser en php de façon à stocker l Est ce qu'on peut insérer du php dans une page XML [ par superpaolo ] Slt !Je voudrai insérer les données de ma base mysql dans un fichier xml.Je fais qq tests mais cela ne semble pas marcher.Voila ce que g fai&lt;?xml v


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,374 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é.