IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Affichage menu récursif


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Par défaut Affichage menu récursif
    Bonjour,

    J'essaye de faire un menu récursif.

    J'ai suivi un tuto ou pour l'instant je veux juste faire apparaitre tout mes menus / sous menu associé.

    Lorsque je balance mon echo, mon menu est vide...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    				<?php
     
    					$query = "SELECT idfamille,libelle from famille order by libelle ASC";
    					$result = mysql_query($query);
     
    					$query2 = "SELECT idfamille,idsous_famille,libelle FROM sous_famille order by libelle ASC";
    					$result2 = mysql_query($query2);
     
     
    					$Menu_Ar = array();
     
     
    						while ($row = mysql_fetch_array($result)){
    							$Menu_Ar[] = array(
    							'idfamille_id' => $row['idfamille'],
    							'idsous_famille_id' => '0',
    							'libelle_id' => $row['libelle'],						
    							);																								
    						}
     
    						while ($row = mysql_fetch_array($result2)){
    							$Menu_Ar[] = array(
    							'idfamille_id' => $row['idfamille'],
    							'idsous_famille_id' => $row['idsous_famille'],
    							'libelle_id' => $row['libelle'],						
    							);																								
    						}
     
     
    						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['idfamille_id']) {
     
     
    								if ($niveau_precedent < $niveau) $html .= "\n<ul>\n";
     
     
    									$html .= "<li>" . $noeud['libelle_id'];
     
    									$niveau_precedent = $niveau;
     
    									$html .= afficher_menu($noeud['idsous_famille_id'], ($niveau + 1), $array);
     
    								}
    							}
     
    							if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "</li></ul>\n\n";
    							else if ($niveau_precedent == $niveau) $html .= "</ul>\n";
    							else $html .= "\n";
     
    							return $html;
    						}
     
     
    						echo afficher_menu(0, 0, $Menu_Ar);
     
     
    				?>

    suis sensé avoir une liste du style :

    .décoration
    ...Lampe
    ...Tableau
    .peinture
    ...Pinceau
    ...Toile
    ...pot
    .sol
    ...carrelage
    ...moquette
    Sauf que j'ai rien


    J'ai contrôlé mon array, il est bien rempli (j'ai pas tout listé c'est un extrait de mon array):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Array
    (
        [0] => Array
            (
                [idfamille_id] => 5
                [idsous_famille_id] => 0
                [libelle_id] => Décoration
            )
     
        [1] => Array
            (
                [idfamille_id] => 3
                [idsous_famille_id] => 0
                [libelle_id] => Murs
            )
        [14] => Array
            (
                [idfamille_id] => 2
                [idsous_famille_id] => 128
                [libelle_id] => Colle
            )
     
        [15] => Array
            (
                [idfamille_id] => 4
                [idsous_famille_id] => F46
                [libelle_id] => Collection caoutchouc         
            )
     
        [16] => Array
            (
                [idfamille_id] => 2
                [idsous_famille_id] => F14
                [libelle_id] => Colles murales et decolle papi
            )
     
        [17] => Array
            (
                [idfamille_id] => 2
                [idsous_famille_id] => F28
                [libelle_id] => Colles sol                    
            )
    Pourquoi mon menu est vide ?
    J'ai loupé un truc je pense...

    Le tuto que j'ai suivi : https://www.coinduwebmaster.com/menu...ursive-php/89/

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par cuiny Voir le message
    ...J'ai suivi un tuto...
    Je t’arrête tout de suite : change de tuto !
    L'extension mysql_ est OBSOLETE depuis PHP 5.5, et supprimée en PHP 7.

    Il faut utiliser PDO.

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Dans le tuto, et il a tout à fait raison, on a affaire à une seule table, surtout pas 2 ou n en fonction de la profondeur des noeuds.
    Il faut d'abord que tu comprennes que n'importe quelle arborescence rentre dans une seule table, pour peu que l'on fasse ce que l'on appelle une auto-jointure, ici, parent_id...

    Dans ton cas, ça donne

    arbo(id,libelle, parent_id)

    1 Magasin NULL
    2 Décoration 0
    3 Murs 2
    4 Colle 0
    5 Collection caoutchouc 4
    6 Colles murales et décolle papier 4
    7 Colles sol 4
    etc. etc.

    Si tu veux "tirer" tout le magasin


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id, libelle, parent_id 
    from arbo
    where parent_id=1


    Si tu veux tirer toutes les colles

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id, libelle, parent_id 
    from arbo
    where parent_id=4
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Si tu veux te passer d'une méthode php, tu peux d'ailleurs tout faire en SQL, moi j'aime bien...
    Tant que tu n'as pas de requêtes récursives, et si tu sais d'avance la profondeur de tes noeuds, ça donne à peu près ça, qui te permet de retracer le chemin du plus large vers le plus précis :

    1 Magasin NULL
    2 Décoration 0
    3 Murs 2
    4 Colle 0
    5 Collection caoutchouc 4
    6 Colles murales et décolle papier 4
    7 Colles sol 4

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    select a1.id, a1.libelle as chemin, a1.libelle as a1_libelle
    from arbo a1
    where a1.parent_id=1
     
    UNION
     
    select a2.id, concat(a1.libelle,'/',a2.libelle) as chemin, a2.libelle
    from arbo a2
    inner join arbo a1 on a2.parent_id=a1.id and a1.parent_id=1
     
    UNION
     
    select a3_id, concat(a1.libelle,'/',a2.libelle,'/',a3.libelle) as chemin, a3.libelle
    from arbo a3
    inner join arbo a2 on a3.parent_id=a2.id
    inner join arbo a1 on a2.parent_id=a1.id and a1.parent_id=1
     
    order by chemin;

    Et tu obtiens un truc très lisible du genre

    25, "Colles/Colles à rustine/Colles à rustine pour VTT", "Colles à rustine pour VTT"

    Et avec un UNION de plus

    37, "Colles/Colles à rustine/Colles à rustine pour VTT/Colles à rustine pour VTT rose à pois verts","Colles à rustine pour VTT rose à pois verts"

    etc. etc.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,



    Je t’arrête tout de suite : change de tuto !
    L'extension mysql_ est OBSOLETE depuis PHP 5.5, et supprimée en PHP 7.

    Il faut utiliser PDO.
    Haa... faudra que je change les requetes.
    Bizarrement elles parviennent à remplir mon array.


    @Dendrite

    Il est vrai que dans le tuto, il utilise une seule table de la base de donnée pour remplir l'array.
    J'ai vu qu'on pouvait remplir l'array avec d'autres table en cumulatif.

    Et je vois que cela fonctionne en listant l'array.

    Par contre ma boucle pour tout afficher, famille / sous famille ne semble pas fonctionner.
    Est ce par que ma requete sql est en langage obsolète ?
    Ou peut etre que les fonctions pour boucler l'array le sont aussi ?

    Si je fais un echo afficher_menu(1, 0, $Menu_Ar);

    J'obtiens un listing famille / sous-famille que pour la famille ayant pour id 1 (famille décoration dans mon exemple).
    Ce qui me laisse croire que coté donnée, c'est bien rempli.

  6. #6
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Peux-tu m'expliquer pourquoi tu as fait 2 tables et non une ?
    Si tu as fait une table sous-famille, c'est que tu n'as pas compris le principe même de l'auto-jointure qui met TOUTE l'arborescence sur UNE seule table. C'est ça qui est beau.

    D'ailleurs, dans ton SQL, as tu posé ton auto-jointure (ou clé étrangère) du parent_id vers l'id de la même table, nullable ( pour le patriarche, ici, magasin ) ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Invité
    Invité(e)
    Par défaut
    Sauf erreur, tu te trompes dans les noms.
    Ce que tu appelle "id_sous_famille" est (il me semble), l'id du "menu parent".

    Et ce que je ne comprends pas, c'est que tu as des valeurs comme "F46", "F14",... alors que c'est censé être des numériques !

    En reprenant le code du tuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function afficher_menu($parent, $niveau, $array) {
    	$html = "";
    	foreach ($array AS $noeud) {
    		if ($parent == $noeud['idsous_famille_id']) {
     
    		$html .= str_repeat("-",$niveau);
    		$html .= " " . $noeud['libelle_id'] . "<br>";
    		$html .= afficher_menu($noeud['idfamille_id'], ($niveau + 1), $array);
    		}
    	}
    	return $html;
    }
    N.B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0; $i < $niveau; $i++) $html .= "-";
    peut être avantageusement remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html .= str_repeat("-",$niveau);
    Dernière modification par Invité ; 07/10/2019 à 18h30.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Par défaut
    J'ai controlé, je suis en php 5 (faudra quand même que je change mes fonctions)

    @dendrite :

    La base de donnée source est sur deux tables,

    Une table famille qui comprend id_famille et libelle (et d'autres valeurs qui ne servent pas dans mon listing)
    Une table sous famille qui comprend id_sous famille ; id_famille et libelle (et d'autres valeurs qui ne servent pas dans mon listing)

    J'ai fait en premier temps une jointure, mais au final je préfère dissocier les requêtes que j'injecte dans mon array.

    Cette parti là fonctionne, mon array est bien rempli, le probleme est plus loin, au moment de la boucle du menu.


    @jreaux62 :

    Sauf erreur, tu te trompes dans les noms.
    Ce que tu appelle "id_sous_famille" est (il me semble), l'id du "menu parent".
    En fait je travaille sur une base de donnée déjà existante, j'ai donc voulu adapter le tuto en fonction de mes données.

    Dans le tuto, id parent est pour moi id famille car famille est la numérotation parent.

    J'ai modifié mon code en inversant les id (id parent est donc id sous famille).
    Cela me liste tout, mais, pas par parent / enfant ^^ , cela me met tous les parents en premier puis tous les enfants.

    C'est déjà mieux avant rien ne se charger :p
    Faut que je me penche sur cette histoire de noeud.

    Et ce que je ne comprends pas, c'est que tu as des valeurs comme "F46", "F14",... alors que c'est censé être des numériques !
    Les valeurs des ID_sous-famille assignées sont en alphanumérique et je n'ai pas le choix puisque la suite du menu que je veux mettre en place devra correspondre à des données clients qui eux saisissent des id en aplha.
    Tu penses que le problème du chargement du menu est là ?

    Faudrait donc que je trouve un autre moyen de le charger.

    Je vais explorer ces pistes, merci

Discussions similaires

  1. [Débutant] problème affichage menu dans pages asp.net (côté code HTML et CSS)
    Par Sardonics dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 12/12/2016, 19h07
  2. Problème affichage menu horizontal sous IE
    Par novice100 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 28/09/2011, 08h57
  3. problème affichage menu C
    Par knulp dans le forum Débuter
    Réponses: 4
    Dernier message: 18/02/2010, 12h29
  4. Problème affichage menu OpenOffice
    Par Yoshidu62 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 03/12/2007, 23h07
  5. Problème affichage menu déroulant
    Par barbapapa2 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/11/2006, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo