comment faire une boucle dans une boucle / menus et sous menus

Eléphanteau du PHP | 39 Messages

10 juin 2008, 00:19

Bonjour à tous,

Je souhaite réaliser un menu dynamique composé de sous-menus. Pour cela j'ai creé 2 tables :
menus=> menu_id, menu_nom, menu_lien
sous_menus=>sous_menus_id, sous_menu_nom, sous_menus_lien, menu_id_

Comme vous l'aurez remarqué, ces 2 tables sont en relation par menu_id et menu_id_

il faudrai que je puisse faire une 1ere boucle qui affiche les menus et une 2eme dans la 1ere pour afficher les sous-menus correspondant aux menus.

Après plusieurs tentatives sans succès je me tourne à vous.

Voici une de mes tentatives qui ne regroupe pas les sous-menus par menu :
<?php
$req="SELECT menu_nom, menu_lien,sous_menus_nom,sous_menus_lien from menus,sous_menus where menu_id=menu_id_ ";
$result=mysql_query($req);
$nb=mysql_num_rows($result);
$i=0;

echo "<ul id='menunav'>";
while ($nb>$i){
$data=mysql_fetch_object($result);

echo    "<li class='rubrique'> <a href='$data->menu_lien' title='$data->menu_nom' class='first-rub'>$data->menu_nom</a>";
echo        "<ul>";

echo          "<li class='rubrique'> <a href='$data->sous_menus_lien' title='$data->sous_menus_nom' class='second-rub'>$data->sous_menus_nom</a></li>";


          
echo        "</ul>";
echo    "</li>";
$i++;
}
echo "</ul>";
?>
Merci d'avance pour votre aide :D
C'est en forgeant qu'on se forge

Mammouth du PHP | 19672 Messages

10 juin 2008, 05:43

Je dirais que tu ne pars pas avec la bonne structure. Tu pourrais stocker tous tes menus dans une seule et même table.

Sommairement :

Code : Tout sélectionner

+----------------+----+ | menus | +----------------+----+ | menu_id | PK | | menu_parent_id | FK | | menu_libelle | | | ... | | +----------------+----+
Dans une table sous cette forme, chaque menu a un identifiant unique : il a aussi l'identifiant du menu parent, lui-même s'il est un menu racine ou un autre s'il dépend d'un autre menu.

Premier avantage, tu n'es plus limité en nombre de profondeur contrairement à ton système à deux tables qui te bloque à un seul sous-niveau.

Partant de là, ta requête nécessite simplement un "ORDER BY menu_parent_id, menu_id" pour obtenir tes menus triés dans le bon ordre.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

10 juin 2008, 10:10

oui mais ça ne me permet pas réellement de distinguer les menus des sous-menus

J'ai fais une autre tentative qui fonctionne pour un menu, je vais donc essayé de faire boucler tout cela en incrémentant menu_id_
<?php
$req="SELECT menu_nom, menu_lien,sous_menus_nom,sous_menus_lien from menus,sous_menus where menu_id=menu_id_ and menu_id_='1'";
$result=mysql_query($req);
$nb=mysql_num_rows($result);
$i=0;
$result2=mysql_query($req);
echo "<ul id='menunav'>";
$data2=mysql_fetch_object($result2);
echo    "<li class='rubrique'> <a href='$data2->menu_lien' title='$data2->menu_nom' class='first-rub'>$data2->menu_nom</a>";
echo        "<ul>";
while ($nb>$i){
$data=mysql_fetch_object($result);
echo          "<li class='rubrique'> <a href='$data->sous_menus_lien' title='$data2->sous_menus_nom' class='second-rub'>$data->sous_menus_nom</a></li>";

$i++;
}
          
echo        "</ul>";
echo    "</li>";

echo "</ul>";
?>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Mammouth du PHP | 19672 Messages

10 juin 2008, 10:45

oui mais ça ne me permet pas réellement de distinguer les menus des sous-menus
Bien sur que si.

C'est sûr que si tu essayes de voir ça en regardant directement le contenu de la table dans phpMyAdmin par exemple, la différence ne sera pas évidente. Néanmoins avec une requête appropriée, tu pourras distinguer parfaitement les menus des sous-menus voire éventuellement des sous-sous-menus s'il te prend la fantaisie d'ajouter un niveau de profondeur supplémentaire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 39 Messages

10 juin 2008, 12:54

Je vais essayer ta méthode et je te tiens au courant :wink:
C'est en forgeant qu'on se forge