begin process at 2012 05 30 13:08:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Débutant(e)

 > 

création menu


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

création menu

lundi 26 juillet 2010 à 11:20:14 | création menu

agparchitecture

Bonjour à tous, je me tourne une nouvelle fois vers vous car vos conseil et avis sont judicieux...

Je souhaite faire réaliser un menu dynamique avec possibilité de sous menu "infini" depuis une base de données Mysql.

La base de données contient :
Id-> identifiant du menu
Position -> La position dans le menu
texte -> Texte à afficher pour le menu
.... -> d'autre élément inutile à mon avis pour le problème

La valeur position se compose d'un chiffre, un point, un chiffre, un point et ainsi de suite.... ce qui me permet de les classer par ordre croissant
exemple:

1 (Menu 1)
1.1 (sous-menu de 1 point 1)
1.1.1 (sous-menu de 1.1 point1)
1.1.2 (sous-menu de 1.1 point2)
1.2 (sous-menu de 1 point 2)
2 (Menu 2)
2.1 (sous-menu de 2 point 1)
2.1.1 (sous-menu de 2.1 point 1)
2.1.1.1 (sous-menu de 2.1.1 point 1)
etc...

sur base de ces valeurs, je souhaiterais pouvoir construire le menu avec de <ul> et des <li>

Malheureusement je ne vois pas comment réaliser la structure de mon algorithme de traitement pour que celle-ci soit récursives.

Je suis donc ouvert à toutes suggestion de votre part et merci de votre aide.

lundi 26 juillet 2010 à 12:51:05 | Re : création menu

RaftY



Bonjour,

Premièrement tu pars d'une basse de données donc par définition un tableau 2D en sortie! Mais il y a plusieurs façon de voir la base de données et pas uniquement 2D.

Pour résoudre ton problème, je vois Trois axes possibles et je suis persuadé qu'il y en aura autant que de personnes qui souhaitent répondre.


1- 2 étapes:
On peut voir la sortie de la base de données par requete , comme un tableau 2D. Une fonction va traiter le tableau 2D pour en faire un Arbre PHP. Un arbre PHP n'est rien d'autre qu'un tableau multidimmension.

Ex d'arbre PHP:
Code PHP :
 $arbre["racine"]=array();
 $arbre["racine"]["noeud1"]=array("feuille"=>1);
 $arbre["racine"]["noeud2"]=array("noeud 2.1"=>array("feuille"=>1), "noeud 2.2"=>array("feuille"=>1), "noeud 2.3"=>array("noeud2.3.1"=>array("feuille"=>1)));


En bref, découper en fonction de l'indice pour créer un tableau multidimensionnel, on entre avec $lst (tableau issu de la requete) et $sep le séparateur, si on souhaite en changer juste ce param est à changer:

Code PHP :
function 2DtoTree($lst, $sep)
{
 $out=array();
 foreach ($lst as $k=>$v)
  {
   $indices= explode($sep, $k);
   $treeTxt="$out";
   foreach($indices as $ind)
    {
     $treeTxt.="[".$ind."]";
    }
   $treeTxt.="=".$v;
   eval($treeTxt);
  }

return $out;
}

{Code non testé}

Method pas super Elegante mais très efficace qui cree les node du tableau en mode text le tableau et qu'il le fait évaluer. Ensuite on a un arbre, qui marche en récursif avec le test d'arret "is_array($out)"

2- BDD récursive
Le concept est différent, il partir du principe que l'on interrogera la base de données par niveau en mode récursif. On entre dans la fonction avec les indices de premier niveau (SELECT * FROM TABLE WHERE IND NOT LIKE '%.%'), ensuite à chaque passage récursif, on teste la condition d'arret:
SELECT * FROM TABLE WHERE IND LIKE '$indCur.%', si des enregistrements sont renvoyé on entre récursion, sinon on s'arrête.

3- Itératives
L'idée en itératif sera de savoir quand on ferme les UL, LI et savoir quand on les ouvres.

Je propose de passer en revue la liste avec un foreach par exemple (un while marchera aussi) et en fait on va compte le nombre de séparateur (ici '.'). Si le nombres de séparateur courant ($nbSepCur) soustrait du nombre de séparateur précédent ($nbSepOld) => ($nbUL=$nbSepCur-$nbSepOld, normalement si la base est bien triées) est positive alors j'ajoute autant de UL que cette différence ($nbUL), si elle est négative j'ajoute autant de /UL que cette différence, sinon on en ajoute pas.
Puis à chaque passage de boucle <li>$val</li>

Bon courage!

______oOOO________OOOo________

RaftY, du code C commode!
lundi 26 juillet 2010 à 14:06:23 | Re : création menu

agparchitecture

Merci pour le conseil cependant, je me pose quelques questions:

1. C'est ce que j'essaye d'implémenter actuellement, mais je ne vois pas comment faire pour fermer les <ul> si je ne suis plus dans un sous menu avec le noeud précédent

2. Base de données récursives: Est-ce que ce n'est pas un peu lourd de faire plusieurs requête afin de les traiter...

3- Itératives : Alors la je ne comprend pas du tout... Est-ce qu'il serait possible d'avoir un peu plus d'explication s'il vous plait?

Merci pour le coup de main
lundi 26 juillet 2010 à 14:17:57 | Re : création menu
lundi 26 juillet 2010 à 15:25:09 | Re : création menu

RaftY



1- Pour refermer on utilise la post récursivité, c'est à dire les traitemnt par dépilement

Ex:

Code PHP :
function recu($lst)
{
$ret="";
 foreach($lst as $k=> $v)
  {
    if(is_array($v))
     {
      $ret.="<ul>"; //s'execute avant recurs
      $ret.=recu($v);
      $ret.="</ul>"; //s'execute après recurs, une fois tout le traitement descendant fait donc bien placer pour fermer le UL
     }
   else
     {
      $ret.="<li>".$v."</li>";
     }
  }
 return $ret;
}

{Code non testé}

2. Cela dépend des objectifs, faire des requete à chaque est lourd par rapport à un traitement classique en une fois. En revanche, dans l'objectif de le migrer vers de l'utilisation Ajax avec appel du prog pour chaque niveau, ce n'est pas dénuer de bon sens.

3. Le principe est voir ex:
Code PHP :

/* $lst considérer de la forme suivante:
    [IND][LIB]
     1    Menu 1
     1.1  Sous Menu 1.1
     2    Menu 2 ....
*/

//init
$sep=".";
$nbSepOld=0;
$out="";

//bouclage sur la list
foreach($lst as $k=>$v)
{
 $nbSepCur=count(explode($sep, $v["IND"])); //compte le nombre d'élement du tableau séparer par $sep
  $nbUL=$nbSepCur-$nbSepOld; //récupère la différence de niveau
  if($nbUL>0)
   {
    for($i=0; $i<$nbUl; $i++)
     {
      $out.="<UL>\n"; //applique les UL entrants
     }
   }

if($nbUL<0)
   {
    for($i=0; $i<-$nbUl; $i++)
     {
      $out.="</UL>\n"; //applique les UL sortants
     }
   }

$nbSepOld=$nbSepCUr;
$out.="<LI>".$v."</LI>";
}

echo $out;


{Code non testé}

______oOOO________OOOo________

RaftY, du code C commode!
lundi 26 juillet 2010 à 15:26:03 | Re : création menu

RaftY

$nbSepOld=$nbSepCUr;
$out.="<LI>".$v."</LI>";



il faut lire

$nbSepOld=$nbSepCUr;
$out.="<LI>".$v["lib"]."</LI>";


______oOOO________OOOo________

RaftY, du code C commode!


Cette discussion est classée dans : menu, base, création, position, avis


Répondre à ce message

Sujets en rapport avec ce message

Menu déroulant automatique ... [ par oki972 ] Bonjour je suis débutant et j'ai un gros soucis.J'ai une base de donnée qui recense des titres de livres et pour supprimer le champ correspondant a un Création d'un moteur de recherche [ par silvia12 ] Bonjours,JE cherche a créer un moteur de recherche.J'ai trouvé plein de truc intéréssant, mais le probléme, c'est que mon site n'as aucune base de don Création d'une base de contenus en ligne [ par cudipate ] Bonjour,je ne suis pas développeur ni débutant en php ou en quelque code que ce soit. Je suis juste très intéressé par le php et par ses fonctionnalit Création d'une Base de donnée mysql [ par Hammer18 ] Salut,Je suis sur la création d'un site et je voudrais y mettre un livre d'or. Je débute en php et mysql... Comment crée-t-on une base de donnée mysql Menu dynamique PHP [ par zorax69 ] Hello,Je voudrais faire un menu vertical du type :gamme1___sous-gamme11______produit1______produit2___sous-gamme12______produit5______produit7gamme2__ compter et analyser des '<select>' [ par kishkaya ] Voila je recupere depuis ma bdd des noms de menu auquel est assigné une position (cela me permet de creer le menu totale de ma page , la position indi Menu java multi-niveaux et base de données [ par noisetier ] Bonjour, je dispose d'un menu vertical chargé à partir d'une base de données ODBC. Pouvez-vous m'indiquer comment le transformer en multi-niveaux touj Formulaire menu déroulant [ par fredo35m ] Bonjour, j'ai cherché sur différents sites mais je n'arrive pas à trouver ce que je veux exactement ou du moins ç ne marche pas.!!!Alors voilà, j'ai u Probleme avec menu déroulant :-( [ par Tribute2U ] Bonjour, j'ai un probleme pour faire un menu déroulant contenant le contenu d'une table de ma base de données. Pour faire vite, voila se que j'ai fait menu multi recherche [ par maousse2 ] Bonsoir la communauté :) mon profil : graphiste plutot webdesigner qui adapte des script tout fait ... je suis actuellement couché sur le livre de jea


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales