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 :

Création d'un menu déroulant en php


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut Création d'un menu déroulant en php
    Bonjour, je viens vous demander de l'aide pour la création d'un menu déroulant.
    Ce menu se déroule plusieurs fois sans limites de niveau (il peut y avoir des souscatégories).

    Ce menu en html css est développé et fonctionne mais désormais je dois le mettre en php afin que les catégories ajoutés ou supprimés de la BDD soient mises à jour sur le menu.

    En html le menu est développé ainsi :

    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
     
    <ul>
    <li class="first"><a href="./">Accueil</a></li>
    	<li class="dir">La ville
    		<ul>
    			<li class="first"><a href="./">Histoire</a></li>
    			<li><a href="./">Patrimoine</a></li>
                            <li><a href="./">Aménagement urbain</a></li>
                            <li><a href="./">Logement</a></li>
                            <li><a href="./">Environnement</a></li>
    			<li class="last"></li>
     
    		</ul>
    	</li>
    	<li class="dir">La mairie
    		<ul>
    			<li class="first"><a href="./">Le mot du maire</a></li>
    			<li><a href="./">Les services</a></li>
    			<li><a href="./">Le conseil municipal</a></li>
    			<li><a href="./">Bulletins municipaux</a></li>
                            <li><a href="./">Offres d'emploi</a></li>
                            <li class="dir"><a href="./">Vos démarches</a>
                	                  <ul>
    					<li class="first"><a href="./">Etat civil</a></li>
    					<li class="dir"><a href="./">Urbanisme</a>
     
                                                   <ul>
    							<li class="first"><a href="./">1</a>
    							<li><a href="./">2</a></li>
    							<li><a href="./">3</a></li>
    							<li><a href="./">4</a></li>
    							<li><a href="./">5</a></li>
                                                            <li class="last"></li>
    						</ul>
                                            </li>
    					<li><a href="./">Etranger en France</a></li>
    					<li><a href="./">Réservation de salles</a></li>
                                           <li class="last"></li>
    				</ul>
                            </li>
    			<li><a href="./">Elections</a></li>
                            <li class="last"></li>
    		</ul>
    	</li>
    <ul>
    C'est donc tout simple en Html avec des ul et des li successifs. En php j'ai developpés le même résultats avec une boucle qui va chercher toutes les rubriques de 1er niveaux ainsi :

    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
     
    <?php
    $sql = "SELECT * FROM rubrique WHERE id_parent='0' ORDER BY rubrique.ordre";
    $sth = $dbh->query($sql);
    $menu = $sth->fetchAll();
    $nombre = count($menu);
    ?>
    <ul>
    		 <li class="debut"><a>&nbsp;</a></li>
    		<?php
            foreach($menu as $row){
     
    		echo "<li class='classic'><a href='./'>".$row['intitule']."</a></li>";
            }
            ?>
     
        <li class="fin"><a>&nbsp;</a></li>
     
    </ul>
    Donc là pas de problème le premier niveau apparaît et je peux faire 1 ou 2 niveaux supplémentaires (souscatégories et soussouscatégories) en faisant des boucles supplémentaires. Mais en faisant cela mon menu sera limité à 3 niveaux.

    LA QUESTION EST DONC LA SUIVANTE, avez vous une piste à me donner pour je permette à ce menu à n'avoir aucune limite de profondeur...

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Tu peux ajouter en base un champ qui te permet de connaitre le niveau du menu pour chaque menu.
    Comme ça tu peux construire tes niveaux en comparant le niveau courant avec l'ancien pour savoir si :
    - Tu débutes un nouveau niveau
    - Tu continues un niveau
    - Tu fermes un niveau

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Bonjour et merci de votre réponse.

    J'avais pensé également à ajouter un champs de niveau mais mais je suis tout de même obligé de faire autant de boucle manuellement qu'il y a de niveaux. A moins que vous ayez une solution.

    Voici mon exemple :

    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
     
    <?php
            foreach($menu as $row){
     
    		echo "<li class='classic'><a href='./'>".$row['intitule']."</a></li>";
     
                    if(enfant) alors 
                        <ul>
                        foreach($menu2 as $row){
     
    		echo "<li class='classic'><a href='./'>".$row['intitule']."</a></li>";
     
                           </ul>
            }
            ?>

    La j'ai bien un niveau supplémentaire si il y a des "enfants" mais si je veux qu'il y ai à l'infini des possibilités d'autres niveaux, comment faire ? Je ne vais pas prévoir avec des if( enfant) sur 10 ou 15 niveaux manuellement ? on doit bien pouvoir le gérer automatiquement ?

    Merci d'avance

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    En fait il faut faire un truc comme ça :

    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
     
    <?php
            $niveau = 1;
            foreach($menu as $row){ //les menus de tout niveau
            {
    	if($row['niveau'] > $niveau)
                          <ul>  //On descend d'un niveau
    	else if (($row['niveau'] < $niveau)
                          </ul> //On remonte d'un niveau
    	//on affiche le meu
    	echo "<li class='classic'><a href='./'>".$row['intitule']."</a></li>";
     
    	//on sauvegarde le niveau
    	$niveau = $row['niveau'] ;
            }
    ?>
    Cette solution nécessite de récupérer le menu dans le bon ordre.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Merci de votre réponse.

    Mais c'est justement le problème comment obtenir tout le menu dans l'ordre alors que les id ne seront pas dans l'ordre ce qui les relies entre eux est juste le champs id_parent.

    Je tourne en rond

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Dans ce cas il faut ajouter un champ position pour connaitre la position du menu.

    Peux tu sinon me dire les contraintes que tu as par rapport aux données que tu disposes.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Je n'ai pas beaucoup de contraintes mon désir était d'avoir un menu totalement dynamique. J'ai une table rubrique avec id, titre, contenu, ordre d'affichage, id_parent. Théoriquement cela doit être possible avec que cela. Mais je n'arrive pas à trouver la solution...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Avec le champ "ordre d'affichage" c'est bon alors, il suffit de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY ordre_affichage
    Dans ta requête SQL et avec le code d'avant ça devrait fonctionner.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Ah bon ? vous êtes sur ? Car ce champs contient par exemple de 1 à 7 pour les catégories principales puis par exemple de 1 à 12 pour les sous catégories d'une catégories principales et de 1 à 5 pour les sous catégories d'une autre puis par exemple également de 1 à 6 pour des sous sous catégories d'une sous catégorie ...

    Je vois pas comment cet ordre peut me servir pour avoir la totalité des rubriques dans le bon ordre ?

  10. #10
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Pourquoi ne pas ajouter un champ niveau (char 1) alors ?

    En plus des ordre d'affichage que tu décris, tu ajoutes un champ A B C D etc... selon le critère parent/enfant.

    dans ce cas, la requête se terminera par
    order by niveau, ordre_affichage;

    ou plus simple encore, tu vires ton ordre_affichage, et tu fais un champ 'niveau' varchar qui intègre directement ton niveau avec son "chemin", un peu comme on écrit des sous chapitres

    ex abc (pour chapitre 1-sous chapitre 2- sous chapitre 3)

    Après tu contentes de substr en sql pour récupérer tes menus parents, enfants, petits enfants etc...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    A oui pourquoi pas.

    Ensuite il me suffirait de faire un select * order by niveau c'est bien cela ?

    Ainsi vu que mes niveaux seraient triés ainsi par ex :
    a
    aa
    ab
    ac
    aca
    acb
    acc
    ad
    b
    c
    da
    db ...

    C'est bien cela ?
    Ensuite il me suffirait de tester si le nombre de lettre présent dans niveau est supérieur au précédent, je rajoute un "<ul><li>" afin d'engendrer le sous menu ???

    Merci de m'accorder un peu de temps c'est gentil.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Bonjour, je reviens sur ce forum pour vous remercier tous de votre aide, je suis arrivé à la solution grâce à vos conseils et quelques recherches.

    Je vais en parler si des gens veulent faire la même chose que moi.

    J'ai en fait changé mon architecture de ma BDD en adaptant ma table rubrique à l'architecture intervallaire comme dans ce super cours :

    http://sqlpro.developpez.com/cours/arborescence/

    Au départ, j'ai rien compris, mais il faut bien lire calmement et en fait c'est faisable. On utilise plus du tout de id_parent mais des bornes gauches et droites (bref lisez bien le cours). Et grâce à cela je fais un simple select * order by BG (borne gauche), et là j'ai mes rubriques dans le bon ordre.

    Et là Bwaim, j'ai pu faire un script ressemblant au tiens pour afficher mon menu et c'est gagné.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un menu déroulant
    Par coco38 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/04/2007, 10h15
  2. Réponses: 10
    Dernier message: 22/03/2007, 08h36
  3. [Tableaux] Menu déroulant en PHP
    Par dunbar dans le forum Langage
    Réponses: 4
    Dernier message: 11/08/2006, 10h22
  4. Réponses: 8
    Dernier message: 06/07/2006, 08h19
  5. menu déroulant en php
    Par Husqvarna dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2005, 13h26

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