Construire un menu arborescent avec une fonction récursive en PHP

Un sujet assez difficile à comprendre dans le monde de la programmation web pour plusieurs webmasters qui ont appris par eux-mêmes, dont je fais parti, est la technique de récursivité, où une fonction fait appel à elle-même. Cette fonction est dit récursive dans ce cas, et elle peut être nécessaire dans plusieurs situations, telles que la création d’un menu arborescent complexe où le nombre de sous-catégories n’est pas prévisible.

Commençons par la structure d’une base de donnée MySQL simple et typique pour ces catégories. Celle-ci est une table, appelée Animaux, contenant une liste de catégories, avec leur identitification propre, leur nom, et leur lien de parenté avec une autre catégorie, si elle est en fait une sous catégorie de celle-ci dans une menu arborescent.

ID 	Parent 	Nom
1 	0 	Félins
2 	1 	Grands Félins
3 	2 	Panthères
4 	2 	Lions
5 	1 	Petits Félins
6 	2 	Tigres
8 	0 	Poissons
9 	0 	Canins
10 	8 	Saumons
11 	8 	Requins
12 	9 	Loups
13 	9 	Chiens

Le champs Parent d’une sous-catégorie fait référence à l’identification ID de la catégorie dont elle fait partie. Par exemple, Panthères, avec la valeur Parent de 2, est une sous-catégorie de Grands Félins, identifiée par le code ID 2, et avec son code Parent de 1, elle est elle-même une sous-catégorie Félins, identifiée par le code ID 1. Comme Félins est une catégorie principale qui n’a pas de lien de parenté, sa valeur pour Parent est 0.

Pour saisir ces données et l’insérer dans une liste (array en anglais) afin de pouvoir l’organiser avec PHP, on fera appel à la fonction suivante:

1
2
3
4
5
6
7
8
9
10
11
12
$query = "SELECT ID, Parent, Nom FROM Animaux ORDER BY Nom ASC";
$result = mysql_query($query);
 
$categories = array();
 
while($row = mysql_fetch_array($result)) {
	$categories[] = array(
	'parent_id' => $row['Parent'],
	'categorie_id' => $row['ID'],
	'nom_categorie' => $row['Nom']
	);
}

Si on visualise les 3 premiers éléments de la liste associative en PHP qui est maintenant en ordre alphabétique, elle ressemble à ça:

(
    [0] => Array
        (
            [parent_id] => 1
            [categorie_id] => 5
            [nom_categorie] => Petits Félins
        )
 
    [1] => Array
        (
            [parent_id] => 9
            [categorie_id] => 13
            [nom_categorie] => Chiens
        )
 
    [2] => Array
        (
            [parent_id] => 8
            [categorie_id] => 10
            [nom_categorie] => Saumons
        )
 
)

Nous avons donc maintenant le contenu de notre table dans une liste PHP organisée en ordre alphabétique. Comment l’organiser de façon à ce que la liste de menu soit affichée en mode arborescent dans une page HTML? Nous allons utiliser une fonction récursive appelée afficher_menu(). Dans cette version, nous allons tout simplement l’afficher en mode texte de façon à rester simple et compréhensible à ce niveau du tutoriel.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function afficher_menu($parent, $niveau, $array) {
 
$html = "";
 
foreach ($array AS $noeud) {
 
	if ($parent == $noeud['parent_id']) {
 
	for ($i = 0; $i < $niveau; $i++) $html .= "-";
 
	$html .= " " . $noeud['nom_categorie'] . "<br />";
 
	$html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array);
 
	}
 
}
 
return $html;
 
}

Quelques explications: Alors qu’on parcoure la liste désorganisée, si on rencontre une catégorie qui a un lien de parenté avec une autre, après l’avoir ajoutée dans le code HTML (variable $html), on fait encore appel à la même fonction afin de vérifier si celle-ci n’a pas aussi une sous-catégorie, avant de continuer les instructions additionnelles de la fonction, et ainsi de suite. On sauvegarde le nombre de fois que la fonction est appelée par elle-même dans la variable $niveau afin de déterminer combien de symboles « - » on devrait ajouter afin de démontrer sa position dans la structure arborescente.

Ensuite, nous faisons appel à cette fonction dans la page web ou nous voulons afficher le menu. Le premier 0 de la fonction pour la variable $parent indique que nous voulons afficher le menu en commençant avec les catégories principales à la racine qui ont une valeur de parenté de 0, mais au besoin, on pourrait seulement afficher une sous-catégorie avec une valeur de parenté différente. L’autre 0 initialise la valeur de $niveau à 0. $categories est évidemment notre liste précédente:

echo afficher_menu(0, 0, $categories);

Le résultat devrait être celui-ci:

Canins
- Chiens
- Loups
Félins
- Grands Félins
-- Lions
-- Panthères
-- Tigres
- Petits Félins
Poissons
- Requins
- Saumons

Maintenant, ce format n’est pas très élégant, nous allons voir comment formater ce menu textuel avec les balises <ul> et <li>, une façon sémantiquement correcte de présenter une liste en HTML, et qui peut, par la suite, être pleinement contrôlée en CSS pour créer un menu de navigation esthétiquement plaisant.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function afficher_menu($parent, $niveau, $array) {
 
$html = "";
$niveau_precedent = 0;
 
if (!$niveau && !$niveau_precedent) $html .= "\n<ul>\n";
 
foreach ($array AS $noeud) {
 
	if ($parent == $noeud['parent_id']) {
 
	if ($niveau_precedent < $niveau) $html .= "\n<ul>\n";
 
	$html .= "<li>" . $noeud['nom_categorie'];
 
	$niveau_precedent = $niveau;
 
	$html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array);
 
	}
}
 
if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "</ul>\n</li>\n";
else if ($niveau_precedent == $niveau) $html .= "</ul>\n";
else $html .= "</li>\n";
 
return $html;
 
}

Quelques explications: La variable $niveau_precedent garde en mémoire le niveau précédent dans l’arborescence du menu, donc on peut la comparer au niveau actuel, $niveau, pour voir s’il y a eu un changement pour contrôler les débuts et les fins de liste avec la balise ul. À la ligne 6, si la variable est encore vide, on commence avec la balise ul de la liste principale. Ensuite, à la ligne 12, si le niveau vient d’augmenter, on peut commencer avec une nouvelle balise ul qui sera un sous-menu. On enregistre la niveau actuel à la ligne 16, et la fonction est appelée récursivement pour voir s’il y aura encore un sous-menu. Dans le cas contraire, on doit contrôler la fermeture des balises correctement.

Cette fonction va générer le code suivant:

<ul>
<li>Canins
	<ul>
	<li>Chiens</li>
	<li>Loups</li>
	</ul>
</li>
<li>Félins
	<ul>
	<li>Grands Félins
		<ul>
		<li>Lions</li>
		<li>Panthères</li>
		<li>Tigres</li>
		</ul>
	</li>
	<li>Petits Félins</li>
	</ul>
</li>
<li>Poissons
	<ul>
	<li>Requins</li>
	<li>Saumons</li>
	</ul>
</li>
</ul>

Pour ajouter des liens à chaque catégories, il suffit maintenant de modifier la ligne 14 avec celle-ci:

14
$html .= "<li><a href=\"?categorie=" . $noeud['categorie_id'] . "\">" . $noeud['nom_categorie'] . "</a>";

Le résultat est le suivant:

liste récursive

Pour apprendre à faire un menu dynamique de façon à cacher les sous-catégories et les afficher quand on clique sur son menu parent, veuillez vous référez à l’article: Comment développer des sous-menus cachés.

Partager cet article:

  • del.icio.us
  • Facebook
  • StumbleUpon
  • Twitter
  • LinkedIn

Catégories: Programmation web | 45 commentaires »
Les tags de cet article: ,

Note: Merci pour vos commentaires, j'apprécie ceux qui partagent leurs avis et leurs expériences de webmestre, ou s'il y a lieu, indiquent une erreur dans mes tutoriels, mais je ne peux évidemment pas faire de support technique pour votre site, alors veuillez éviter d'en faire la demande dans cette section.

45 commentaires pour “Construire un menu arborescent avec une fonction récursive en PHP”

  1. Eric dit: 9 janvier 2009 at 19:20

    Bonsoir,

    Merci pour cette excellente démonstration ! c’est ce que je recherchais ;-)

    Par contre, j’aimerai insérer tout ça dans une liste déroulante, merci de votre aide ! Eric

  2. Bob dit: 10 janvier 2009 at 10:10

    Salut Martin et merci encore pour ce tutoriel.
    C’est bien fait et très clair.

    Je cherche à créer une liste (code html) à partir d’une table de ma BDD afin de créer un menu dynamique.

    Je suis tombé hier sur la gestion d’arbres par représentation intervallaire (http://sqlpro.developpez.com/cours/arborescence/).

    Ça l’air pas mal du tout !!!
    Je pense que ce principe est idéal pour manipuler facilement la structure du menu.

    Le hic c’est de créer la fonction PHP qui créera ma liste en html.
    Je sèche un peu je dois avouer…
    Tu n’aurais pas une piste à me donner ?

    Merci

  3. Bob dit: 10 janvier 2009 at 12:16

    Est-ce moi ou il y a une erreur concernant la fermeture des balises ?

  4. Bob dit: 10 janvier 2009 at 12:21

    Oh… Mille pardons… C’était bien moi…

  5. rip_pit dit: 19 janvier 2009 at 13:09

    Tu es un seigneur!!!

    Je viens de passer des jours pour ne meme pas achever ma propre fonction recursive. T’es trop fort !

    Une petite info: L’utilisation de variables non initialisées renvoient des notices:
    (genre html .= ****)

    Pour l’éviter j’ai mis au début de la fonction html:
    if (!isset($html)) $html = «  »;
    if (!isset($previous_level)) $previous_level = «  »;

    Merci encore!

  6. Martin dit: 19 janvier 2009 at 17:20

    Merci rip_pit, en effet, il semble difficile de trouver de la doc simple sur ce sujet. Pour les notices, j’ai ajouté une déclaration des variables au début de la fonction, c’est plus propre ainsi. Comme certaines personnes m’ont aussi demandé de franciser un peu plus la fonction, j’en ai profité pour traduire quelques morceaux, donc certains noms de variables ont changé aujourd’hui, pour le reste tout est pareil.

  7. Laurent dit: 12 mars 2009 at 8:10

    Bonjour,
    Je voudrais savoir si vous seriez d’accord d’atapter vous tuto ++http://www.coinduwebmaster.com/menu-arborescent-fonction-recursive-php/89/++ a mes besoins et cela contre rémunération évidament.
    D’avance merci

  8. Charaf dit: 10 mai 2009 at 15:48

    Waw kel demo, kel tuto, felicitations, ur the best !!! :=)

  9. Ledoux dit: 17 juin 2009 at 17:18

    Super, ca aide pas mal, surtout pour les petits développeur. une petite question. comment afficher le nombre de produits dans chaque catégorie. j’ai une table boutique_categories avec un champs id_cat. je n’arrive pas à compter le nbre. quelqun aurais un piste svp ?

  10. neang dit: 2 juillet 2009 at 6:22

    Bonjour,

    Merci pour le script. j’ai une question. est-il possible d’enlever le lien sur le rubrique qui a des sous rubriques ?
    merci d’avance.

  11. Yann Geez dit: 10 juillet 2009 at 7:51

    Bonjour à tous !!

    Cela fait 2 jours que je cherche à finaliser un système comme celui-ci, mais avec aussi du code JS qui affiche et cache les liens sur click.

    J’ai passé ma journée hier à chercher, et ce matin j’ai décidé de faire moi même mes propres boucles parce que c’est vraiment complexe cette (connerie^^) de récursivité.

    Je viens de terminer, voila mes sources :

    function afficher_menu()
    {

    // Requête SQL
    $query = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’0′ ORDER BY Nom ASC »); // Avec 0 on ne prend que les menus
    $result = mysql_query($query);

    $nb = 1;

    while($row = mysql_fetch_array($result)) // la boucle va s’effectuer le nombre de titres trouvés dans la BDD
    {

    if ($nb != 1)
    {
    echo « \n »;
    }

    //Affichage du menu titre avec le lien pour ouvrir les sous menus
    echo »« .$row['Nom']. »\n »;

    $id = $row['ID'];

    // Ecriture du script pour cacher le premier groupe dans le sous menu
    echo « \n »;

    // Requête pour afficher les sous-catégories
    $query1 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$id’ ORDER BY Nom »);
    $result1 = mysql_query($query1);
    while($row1 = mysql_fetch_array($result1))
    {

    $nom = $row1['Nom']; // Pour éviter le problème dans la boucle while suivante

    $query2 = (« SELECT ID FROM categories WHERE Nom=’$nom’ ORDER BY Nom »);
    $result2 = mysql_query($query2);
    while($row2 = mysql_fetch_array($result2))
    {
    //Affichage du lien du sous menu // POUR CHAQUE 1er sous menu // objectif : modifier ID pour avoir le lien 12 .. 13 ect
    echo »« .$nom. »\n »;

    ////////////////////////// Fin des 2 premières catégories ////////////////////////

    $IDRQ = $row2['ID'];

    $nbl = 1;

    // Requête pour afficher les derniers enfants
    $query3 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
    $result3 = mysql_query($query3);
    while($row3 = mysql_fetch_array($result3))
    {

    if ($nbl == 1) // première fois qu’on passe donc on affiche le script pour cacher les lignes
    {
    // Paramètre ID identique à celui affiché juste au dessus sur le parent
    echo « \n »;
    }

    // Affichage du lien pour la rubrique

    echo »« .$row3['Nom']. »\n »;

    $nbl++;
    }

    ////////////////////////// Fin des 3 premières catégories ////////////////////////

    }

    }

    $nb++;
    }

    }

    Le script utilise la même base de donnée.
    Et le il faut le script java :

    function showmenu(menu) {
    if (menu.style.display == ‘none’) menu.style.display = ‘block’;
    else menu.style.display = ‘none’;
    }

    dans le header.

    ENJOY !!!

  12. Yann Geez dit: 10 juillet 2009 at 8:23

    Petite correction suite à un minuscule bug de fermeture de balises

    à remplacer entre les 2 commentaires en fin de script :

    ////////////////////////// Fin des 2 premières catégories ////////////////////////

    $IDRQ = $row2['ID'];

    $nbl = 1;

    // Requête de calcul pour l’affichage de la fermeture UL
    $calcul=0;
    $query4 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
    $result4 = mysql_query($query4);
    while($row4 = mysql_fetch_array($result4))
    {
    $calcul++;
    }

    // Requête pour afficher les derniers enfants
    $query3 = (« SELECT ID, Parent, Nom FROM categories WHERE Parent=’$IDRQ’ ORDER BY Nom »);
    $result3 = mysql_query($query3);
    while($row3 = mysql_fetch_array($result3))
    {

    if ($nbl == 1) // première fois qu’on passe donc on affiche le script pour cacher les lignes
    {
    // Paramètre ID identique à celui affiché juste au dessus sur le parent
    echo « \n »;
    }

    // Affichage du lien pour la rubrique

    echo »« .$row3['Nom']. »« ;

    $calcul–;

    if ($calcul == 0)
    {
    echo »";
    }

    echo »\n »;

    $nbl++;
    }

    ////////////////////////// Fin des 3 premières catégories ////////////////////////

  13. phpdudimache dit: 16 juillet 2009 at 7:32

    Si je veux retourner un tableau imbriqué avec afficher_menu($parent, $niveau, $array), comment je m’y prends ? Il faut passer le tableau en paramètre dans la fonction récursive, utiliser un tableau temporaire ? Je cale ! Si vous pouvez m’éclairer, je dois avoir un problème de logique. Merci

  14. Abdessamad dit: 12 août 2009 at 9:26

    Bonjour,

    Merci pour cette source de Code, elle est vraiment impeccable.

    cependant, j’ai un soucis à l’adapter pour être afficher dans un menu déroulant.

    J’utilise la librairie « YUI Library » de Yahoo!. Pour voir un aperçu du menu voilà le lien :
    http://developer.yahoo.com/yui/examples/menu/topnavfrommarkupwithanim_source.html

    J’espère avoir bien expliquer mon Pb.

    Merci d’avance.

  15. fenoril dit: 11 janvier 2010 at 11:11

    Youpi !

    Merci pour m’avoir fait découvrir la récursivité, enfin un exemple clair, ça change !

  16. laurentj dit: 1 février 2010 at 9:02

    bon exemple pour la recursivité. Mais je ne recommande pas de l’utiliser tel quel, car il parcours le tableau avec une complexité en O(n2), en d’autres termes, il parcourt le tableau pour chaque élément du tableau. Pour afficher de telles données en arborescence, on a vu mieux au niveau performance (il y a des solutions avec lesquelles on ne parcourt que deux fois le tableau)…

  17. Richard Perez dit: 30 avril 2010 at 7:41

    Peux tu nous un donner un lien vers ta technique?

  18. sam dit: 11 mai 2010 at 15:59

    salut a tous, je vous remercie pour cette trés belle démonstration, c est exactement ce que j voulais faire cependant j ai essayé d’appliquer la fonction javascript showmenu a fin de cacher et dafficher le sous menu en cliquand sur son menu parent mais ça marche pas, qlq peut m aider. je lui serai reconnaissant : voici le code :

    function showmenu(menu) {
    if (menu.style.display == ‘none’) menu.style.display = ‘block’;
    else menu.style.display = ‘none’;
    }


    $row['branche_id'],
    ‘parent_id’=>$row['parent_id'],
    ‘nom_br’=>$row['libelle_branche']);
    }

    function afficher_menu($parent, $niveau, $array) {
    $html = «  »;
    $niveau_precedent = 0;
    // si le $niveau et $niveau_precedent sont vides on commence avec la balise
    if (!$niveau && !$niveau_precedent) $html .= « \n\n »;
    foreach ($array AS $noeud) {
    if ($parent == $noeud['parent_id']) {
    $id=$noeud['branche_id'];
    $nom=$noeud['nom_br'];

    //si le $niveau vient d’augmenter, on commencer avec une nouvelle balise ul qui sera un sous-menu.
    if ($niveau_precedent < $niveau) $html .= "\n\n »;
    $id=$noeud['branche_id'];

    $html .= «  » . $noeud['nom_br'] . »–> ».$noeud['branche_id']. »« ;

    $niveau_precedent = $niveau;
    $html .= afficher_menu($noeud['branche_id'], ($niveau + 1), $array);
    }
    }
    if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= « \n\n »;
    else if ($niveau_precedent == $niveau) $html .= « \n »;
    else $html .= « \n »;
    return $html;
    } // Fin de la fonction afficher_menu()
    echo afficher_menu(0, 0, $branche);

    /*$bool = 1;
    if(!$bool) {
    echo « Variable maVariable vaut 0″;
    }
    else{
    echo « Variable maVariable vaut $bool »;
    }*/
    ?>

  19. luluberlu dit: 15 juin 2010 at 11:15

    J’ai un problème, pourtant je fait un copié collé du texte en haut.

    Je donne un tableau comme cela :
    ###################
    Array
    (
    [0] => Array
    (
    [parent_id] => 0
    [categorie_id] => 9
    [nom_categorie] => Mon Titre
    )

    [1] => Array
    (
    [parent_id] => 0
    [categorie_id] => 10
    [nom_categorie] => Mon Titre2
    )

    [2] => Array
    (
    [parent_id] => 0
    [categorie_id] => 11
    [nom_categorie] => Mon titre3
    )

    [3] => Array
    (
    [parent_id] => 9
    [categorie_id] => 12
    [nom_categorie] => Sous Titre1
    )

    [4] => Array
    (
    [parent_id] => 12
    [categorie_id] => 13
    [nom_categorie] => Sous Titre2
    )

    )
    ###################
    Et j’obtiens :
    ###################

    Mon Titre

    Sous Titre1

    Sous Titre2

    Mon Titre2
    Mon titre3

    ###################

  20. luluberlu dit: 15 juin 2010 at 11:17

    Oups désoler j’ai mis le mauvais code :

    Mon Titre

    Sous Titre1

    Sous Titre2

    Mon Titre2
    Mon titre3

    ps: les * sont pour éviter la mise en forme HTML dans le commentaire.

  21. luluberlu dit: 15 juin 2010 at 11:19

    ça prend toujours pas, je remplace les par $.

    *ul$
    *li$Mon Titre
    *ul$
    *li$Sous Titre1
    *ul$
    *li$Sous Titre2*/li$
    */ul$
    */li$
    */ul$
    */li$
    *li$Mon Titre2*/li$
    *li$Mon titre3*/li$
    */ul$

  22. luluberlu dit: 16 juin 2010 at 5:04

    En faite j’ai rien dit, le code mal formaté ma perturbé :$

  23. shintomasu dit: 5 août 2010 at 6:34

    Bonjour à toutes et à tous. Félicitations pour le tuto !

    J’ai une petite question : Comment faire pour ne pas afficher une rubrique si celle-ci ne contient pas de sous-rubriques ?

    Merci d’avance

  24. dekpo dit: 29 septembre 2010 at 17:50

    Bravo ! très efficace ! merci pour cette belle démonstration !

  25. pimeo dit: 4 janvier 2011 at 19:07

    C’est tout a fait ce que je recherchais. Continues comme ça! Et merci de partager ton savoir!

  26. cerres dit: 7 janvier 2011 at 3:51

    Merci c’est un très bon exemple de système d’arborescence. Par contre, j’ai eu un peu de mal a visualisé les étapes, Peut être que si tu commentais ton code ce serais plus facile à comprendre pour les débutant comme moi :).

    Encore merci!

  27. moltuzar dit: 4 mars 2011 at 6:29

    excellent ce script, une matinée pour l’adapter bien comme il faut, avec notamment du js et zou….

    bonne continuation.

  28. tib dit: 23 mars 2011 at 8:08

    Bonjours,

    Déjà merci pour ce tutoriel.
    Maintenant j’aimerais par-exemple que l’arborescence soit plus adapté au référencement, je m’explique =>

    on a ça au finale :

    Canins

    Chiens
    Loups

    Félins

    Grands Félins

    Lions
    Panthères
    Tigres

    Petits Félins

    Poissons

    Requins
    Saumons

    Mais j’aimerais qu’il soit comme ça :

    Canins

    Canins/Chiens
    Canins/Loups

    Félins

    Félins/Grands Félins

    Grands Félins/Lions
    Grands Félins/Panthères
    Grands Félins/Tigres

    Bien-sure au préalable o pourrait faire un str_replace(); pour la variable $noeud['nom_categorie'].

    Merci d’avance pour votre réponse

  29. Maxime dit: 30 mars 2011 at 10:18

    SUPER !
    Je cherchais un script de ce type depuis plusieurs jours, faute d’avoir réussi à le coder moi-même…

    MILLE MERCIS de le partager !

    Maxime (programmeur du dimanche)

  30. Jean-Patrick dit: 31 mai 2011 at 12:22

    Excellent.
    J’avais déjà trouvé quelque chose dans le genre mais qui nécessitait un très grand nombre d’appel de la base de donnée.(http://xl714.free.fr/menu-dynamique/)
    Bilan chez Free, aux heures de pointe, ça ne passait plus.
    En combinant votre façon de construire le menu et son éditeur très simple et pratique j’ai pu me construire facilement l’outil que je recherchais pour le site de mon club
    Merci bien pour ce topo!
    Jean-Patrick , autre programmeur du dimanche…content! ;)

  31. cyrille2u dit: 7 septembre 2011 at 15:30

    Merci beaucoup cousin, tu confirme le dicton qui dit qu’on ne peut plus rien inventer sur la lune. J’ai facilement trouvé après avoir longtemps cherché. Encore mille merci.

  32. lausti dit: 19 octobre 2011 at 4:36

    Merci pour ce magnifique tuto, cependant comment adapter cela avec des balise ?

    Merci

  33. bouffekai dit: 14 novembre 2011 at 10:59

    Bonjour,

    Ta fonction est géniale, cependant je souhaiterais savoir comment retrouver la catégorie parent.
    Je m’explique, j’ai utilisé ta fonction pour un menu déroulant vertical en jQuery et je souhaiterais afficher une flèche lorsque que l’élément contient un ou plusieurs fils.

    Comment dois-je procéder ?

    Merci d’avance

  34. mechri anis dit: 7 février 2012 at 7:57

    bjr…j’ai testé ce tutoriel , il fonctionne très bien..
    mais j’ai un problème en utilisant les deux variable [parent_id] et [categorie_id] de type varchar
    exp :
    parent_id=12345687 (type varchar et non int)
    categorie_id=7777777 (type varchar et non int)

    le problème est le sous menu, en fonction réciproque
    $html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array);

    rmq: je travaille sous joomla
    quelqu’un peut m’aide svp ??

  35. mechri anis dit: 7 février 2012 at 12:38

    oops…. jai fais une grande fausse :)
    j’ai trouver mon problème
    j’ai déclaré :

    ___ID_____ __Parent__
    —————|—————
    11111111 | 12345687
    12345687 | 11111111
    ——————————-

    j’ai corrigé ….et merci :)

  36. fab dit: 14 février 2012 at 7:55

    pour un menu deroulant :

    function afficher_menu($parent, $niveau, $array) {

    $html = «  »;

    foreach ($array AS $noeud) {

    if ($parent == $noeud['parent_id']) {
    $html .= «  »;
    for ($i = 0; $i < $niveau; $i++) $html .= "-";
    $html .= $noeud['categorie_id'].$noeud['nom_categorie'] . " »;

    $html .= afficher_menu($noeud['categorie_id'], ($niveau + 1), $array);

    }

    }

    return $html;

    }

    echo  »;
    echo afficher_menu(1, 0, $categories);
    echo  »;

  37. doudygirl dit: 12 mars 2012 at 10:11

    Merci beaucoup.
    Ce script est super, court et efficace!!

    Je débute en php, et j’aurais besoin que les résultats soient renvoyés dans un tableau (car j’ai d’autres infos à mettre avec le nom comme contenu page, description, etc…)

    Avez-vous des pistes?

    Merci encore

  38. doudygirl dit: 19 mars 2012 at 10:08

    Bonjour,

    J’ai intégrer le script de base dans une liste déroulante:

    $html .=  » « ;
    //affichage de l’arborescence dans la liste déroulante
    // on parcours la liste
    foreach ($array AS $noeud) {
    //si on rencontre une catégorie qui a un lien de parenté avec une autre
    if ($parent == $noeud['parent_id']) {
    //on sauvegarde le nombre de fois ue la fonction est appelée par elle-meme dans $niveau pour déterminé le nombre de symbole a ajouté
    for ($i = 0; $i < $niveau; $i++) $html .= "–";
    $html .= " " . $noeud['nom_page'];
    $html .=" »;
    $html .= liste_page3($noeud['Id_page'], ($niveau + 1), $array);

    }
    }

    et ça fonctionne très bien…

    Savez-vous comment on peut préselectionner une valeur de la liste liste (un parent) en fonction de la BDD.

    J’ai testerplein de truc, notamment ça :

    if(isset($Id_parent) && $Id_parent == $noeud['nom_page'])
    {
    $html .= «  »;
    } else {
    $html .=  » « ;
    }

    Mais ca marche pô! :(

    SVP… help me!

  39. Laurent dit: 27 juin 2012 at 2:23

    Bonjour,
    est-il possible d’avoir une petite mise à jour pour faire un chemin de navigation (breadcrumb) lorsqu’on navigue dans les catégories ? Ce serait super !

    Merci

  40. Adria dit: 17 octobre 2012 at 14:30

    Bonjour,
    Merci pour le tuto, il me sert à beaucoup de choses dans l’appli admin sur lequel je travaille en ce moment. Toutefois, j’ai du mal à intégrer la liste finale dans un . Si quelqu’un pourrait me guider. Merci d’avance.

    Laurent >> pour le breadcrumb, tu te sers de la même fonction que tu as utilisé pour créer le menu dans la bdd pour récupérer le fil.

  41. Adria dit: 17 octobre 2012 at 14:33

    … je voulais dire : Comment intégrer la liste finale à l’intérieur d’une balise SELECT.

    Merci

  42. chatboui dit: 15 mars 2016 at 9:57

    bonjour,

    j’ai un problème pour créer une arbre généalogique des feuille parrainés dans mon boutique prestashop 1.5

    la table nommé ps_referralprogram

    (id_referralprogram,id_sponsor,email,lastname,firstname,id_customer)

    par exemple X est le parain de Y : X a pour id_customer=1 donc Y a pour id_sponsor =1
    exemple de genealogie:

    pour chaque feuille de generation prend 100$
    sachant que chaque parrain parriné deux feuilles seulement

    merci de m’aider SVP SVP SVP SVP SVP SVP

    mon email : wajdichatbouri@gmail.com

    merci d’avance :)

  43. Subzeros dit: 20 mai 2016 at 5:27

    Bonjour,

    Le script est super mais comment afficher les menu de niveau 2 et 3 la fonction permet d’afficher que les niveau 1.

    Merci pour vos futurs réponses ;)

  44. François dit: 25 juillet 2016 at 3:33

    Un énorme merci ! Elle commençait à me rendre fou cette fonction ! Récursivité ok. Mais fermeture des balises dans le bon sens dur dur ! Merci !

  45. okegima dit: 7 novembre 2016 at 11:43

    bonjour, merci pour ce tuto.

    j’aimerai aller un peu plus loin et savoir comment à partir du récursif récupérer qu’une seule branche, par exemple :
    Félins
    - Grands Félins
    – Lions

    .?

Laisser un commentaire