Problème de récursivité pour construire un menu

mickaelpfr Messages postés 197 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 29 avril 2009 - 16 juin 2006 à 16:39
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 - 16 juin 2006 à 17:32
salut a tous après 2 jours complet je me décide a poster
je chercher a créer un menu qui aurait cette arborescence :

     
        <li>[dropdown-menu-en.html Horizontal menu]</li>
        <li>
          [# Products]
         

            <li>
              [# Phones]
             
                <li>[# Samsung R225m]</li>
                <li>[# Nokia 3595]</li>
                <li>[# Samsung X105]</li>
                <li>[# Motorola V66]</li>

             
            </li>
            <li>[# Handhelds and PDAs]</li>
            <li>[# Internet Cards]</li>
            <li>[# Accessories]</li>
         
        </li>

        
     
   

qui permet donc d'avoir autant de sous menu ou menu ...

via une table php de type :

id ; idParent , titre , idPAge

id est l'id en autoincrément, idParent , id du parent , titre , titre du menu et idPage , corespond a l'id d'une autre table qui contient les info de la page ( url , contenu ... )

la je déprime j'arrive a afficher les menu et sous menu de façon illimité mais aps a construire mon menu en version html :(

code php  :

function rechercheEnfant($id,$monTableauParent,$niveau){
        //connexion a la bdd
include("config/config.php");
        require_once("classes/gestion_bdd.class.php");
        $gestionBdd = new gestion_bdd($serveur,$baseDeDonnee,$utilisateur,"");
        $gestionBdd->connexionBdd();
        //On va vérifier que le menu a des enfant        $requeteRechercheEnfant "SELECT * FROM menu WHERE `idParent` ".$id;
        $resultatRechercheEnfant = $gestionBdd->executeRequete($requeteRechercheEnfant);
        $niveau++;
        $nomtableau = "tableau[]";
        while($row=MYSQL_FETCH_ARRAY($resultatRechercheEnfant, MYSQL_ASSOC)){
            $html .= "<li>";
                $nomtableau .= "[]";
                echo $nbelement.$row[titre]." niveau : $niveau - $nomtableau
\n";
                
                $html .= "$row[titre]\n";
                $monTableauParent = $row[titre];
                rechercheEnfant($row[id],$monTableauParent,$niveau);
            $html .= "</li>";
            
        }
    }
table menu :

CREATE TABLE `menu` (
  `id` int(11) NOT NULL auto_increment,
  `idParent` int(11) NOT NULL,
  `titre` varchar(200) NOT NULL,
  `idPage` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
)
INSERT INTO `menu` VALUES (1, 0, 'père', 0);
INSERT INTO `menu` VALUES (2, 1, 'fils', 0);
INSERT INTO `menu` VALUES (3, 2, 'pti fils 1', 13);
INSERT INTO `menu` VALUES (4, 2, 'pti fils 2', 13);
si qq peut me venir en aide

1 réponse

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
16 juin 2006 à 17:32
Salut,

C'est un problème classique. Tu ne l'as pas attrapé par le bon coté...
Je suis parti de ta fonction, en la modifiant petit à petit. Je te laisse voir comment ça se passe.

//connexion a la bdd
// on le fait une fois, ça va suffir (même les inclusion, un fois c'est bon)
include("config/config.php");
require_once("classes/gestion_bdd.class.php");
$gestionBdd = new gestion_bdd($serveur,$baseDeDonnee,$utilisateur,"");
$gestionBdd->connexionBdd();
        

// La fonction récursive
function creaMenu( $idparent=0 ) {
    global $gestionBdd; // on récupère le gestionnaire de BDD
    
    // On va chercher tous les liens qui ont comme parent : $idparent    $requeteRechercheEnfant "SELECT * FROM menu WHERE `idParent` ".$idparent;
    $resultatRechercheEnfant = $gestionBdd->executeRequete($requeteRechercheEnfant);

    // Si aucun... on laisse tomber
    if( !mysql_num_rows($resultatRechercheEnfant) ) return;

    echo ""; // debut de la liste

    // pour chaque lien, un point dans la liste
    while( $row = mysql_fetch_assoc($resultatRechercheEnfant) ) {
        echo "<li>"; // debut de l'item
        // le lien
        echo "{$row['titre']}\n";

        // puis on va chercher les sous liens de celui ci
        // soit ceux qui ont comme parent le présent! C'est la récursion
        creaMenu( $row['id'] ); // Envoi directe à l'affichage la liste des liens enfants

        echo "</li>"; // fin de l'item
    }

    echo "" // fin de la liste
}

// Puis pour envoyer le menu :
creaMenu(); // On commence à idparent=0, donc à la racine !

Voilà, cela te plait-il ?
0
Rejoignez-nous