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

PHP & Base de données Discussion :

Menu déroulant à trois niveaux


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Menu déroulant à trois niveaux
    Bonjour,

    Je suis un débutant en ce qui concerne la programmation de sites web à l'aide de PHP/MySql, mais j'ai quand même quelques années d'expérience et j'ai déjà pu créer des sites avec console d'administration et tout.

    Je bosse actuellement sur un mandat, tout se passait bien jusque quand j'appris que mon patron désire un menu dynamique (alors que j'avais déjà tout prévu pour qu'il soit fixe, bref, je recommence tout!).

    Voici à quoi le menu ressemblerait :

    [Menu1]
    - -[Page1]
    - -[Page2]
    - -[Menu1.1]
    - - - -[Page3]
    - - - -[Page 4]
    - - - -[Menu 1.1.1]
    - - - - - -[Page 5]
    - - - - - -[Page 6]

    J'ai déjà défini le style css pour que mon menu soit déroulant. En ce qui concerne le HTML, je place le tout dans une liste, jusqu'alors faite à la main.

    Pour ce système, un maximum de trois niveaux est autorisé. Mon problème, c'est que je n'ai jamais fais ça et je ne m'en sors pas avec la base de donnée ! J'ai pensé que la meilleure solution serait d'effectuer un auto-jointure sur une table "menus", qui contiendrait entre autre une clé étrangère qui pointerait sur l'ID du menu parent.

    Mon autre soucis, c'est comment faire apparaître mon menu, correctement listé avec du PHP ? A savoir qu'un menu, contient d'autres menus ainsi que des pages qui se trouvent dans une autre table.

    J'utilise des while pour faire apparaître le résultat de mes requêtes SQL, est-ce possible avec ceux-ci pour faire ce que je veux ?

    Merci d'avance pour vos réponses !!

  2. #2
    Membre régulier
    Bonjour,
    Moi aussi je débute (depuis pas mal de temps...). J'ai beaucoup galéré pour obtenir un menu déroulant à 3 niveaux. Si je peux t'aider aujourd'hui ce sera avec plaisir. Je te transmets mon code qui marche très bien. Il s'agit de choisir un pays puis un département puis une commune. Tout est extrait de la base sql. Il me semble que c'est ce que tu souhaites. Ce code est inclus dans un fichier de traitement de formulaire avec un include pour la connexion à la Bdd.
    Bon courage et très bonne journée,
    Evelyne

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    <?php
    $idp = (empty($_POST['ID_pays']) ? -1 : intval($_POST['ID_pays']));
    $idp = (($idp < -1) || ($idp == 0) ? -1 : $idp);
     
    $iddp = (empty($_POST['ID_departement']) ? -1 : intval($_POST['ID_departement']));
    $iddp = (($iddp < -1) || ($iddp == 0) ? -1 : $iddp);
     
    $idc = (empty($_POST['ID_commune']) ? -1 : intval($_POST['ID_commune']));
    $idc = (($idc < -1) || ($idc == 0) ? -1 : $idc);
     
    $rech_pays = parcoursRs(SQLSelect("SELECT `id_pays`, `codePays`, `nomPays` FROM `PAYS` ORDER BY 'nomPays'"));
    ?> 
    <p>Pays (*): 
        <select name="ID_pays" id="nomPays" onchange="document.forms['chgdepartement'].submit();">
            <option value='-1'>Choisissez un pays</option>-->
            <?php
            foreach ($rech_pays as $pays)
            {
                ?>            
                <option value='<?php echo $pays["id_pays"]; ?>' <?php echo (($idp == $pays['id_pays']) ? " selected='selected'" : null); ?>><?php echo $pays['nomPays']; ?></option>  
                <?php
            }
            ?>
        </select> 
     
    </p>
    <?php
    if ($idp != -1)
    {
        $rech_departement = parcoursRs(SQLSelect("SELECT `id_departement`, `codeDepartement`,`nomDepartement` FROM `DEPARTEMENT` WHERE `id_pays` = $idp"));
        ?>
        <p>
            Département (*): 
            <select name="ID_departement" id="nomDepartement" onchange="document.forms['chgdepartement'].submit();">
                <option value='-1'>Choisissez un département</option>
                <?php
                foreach ($rech_departement as $departement)
                {
                    ?>
                    <option value="<?php echo $departement['id_departement']; ?>" <?php echo (($iddp == $departement['id_departement']) ? " selected=\"selected\"" : null); ?>><?php echo $departement['nomDepartement']; ?></option>
                    <?php
                }
                ?>
            </select>
     
        </p>
        <?php
        if ($iddp != -1)
        {
            $rech_commune = parcoursRs(SQLSelect("SELECT `id_commune`, `codeCommune`,`nomCommune` FROM `COMMUNE` WHERE `id_departement` = $iddp"));
            ?>
            <p>
                Commune (*): 
                <select name="ID_commune" id="nomCommune" onchange="document.forms['chgdepartement'].submit();">
                    <option value='-1'>Choisissez une commune</option>
                    <?php
                    foreach ($rech_commune as $commune)
                    {
                        ?>
                        <option value="<?php echo $commune['id_commune']; ?>" <?php echo (($idc == $commune['id_commune']) ? " selected=\"selected\"" : null); ?>><?php echo $commune['nomCommune']; ?></option>
                        <?php
                    }
                    ?>  
                </select>
     
            </p>
            <?php
            if ($idc != -1)
            {
                //actions si les champs sont sélectionnés
            }
        }
    } else
    {
        ?>
        <div>Vous devez sélectionner un pays</div>
        <?php
    }
    ?>

  3. #3
    Membre expert
    salut,

    c'est bien evelyne tu l'as fini ton truc... je suis fier de toi

    mais c'est pas tout à fait ce que lui veut

    toi tu as un triple enchainement de listes déroulantes dynamiques

    lui veut générer une hiérarchie "fixe" qui sera un menu déroulant (comme les menu d'applications windows par exemple) dont la hiérarchie est stockée en bd

    le principe est simple faire une récursion... ou en pur sql (procédure stockée) ou php/mysql:
    tu fais une fonction qui liste tous les éléments enfants d'un élément parent que tu as passé en paramètre:
    • si au moins un élément est trouvé:
      • tu ouvres une liste: <ul>
      • pour chaque élément trouvé:
        • tu affiches <li><a href='#'>l'élément
        • tu appliques la fonction à l'élément
        • tu fermes la ligne: </li>

      • tu fermes la liste: </ul>

    • sinon tu ne fais rien
    le but est de générer un code xml qui ressemble à ça:
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ul>
      <li><a href='#'>menu1</a>
        <ul>
          <li><a href='#'>sous-menu1-1</a></li>
          <li><a href='#'>sous-menu1-2</a></li>
          <li><a href='#'>sous-menu1-3</a></li>
        </ul>
      </li>
      <li><a href='#'>menu2</a></li>
      <li><a href='#'>menu3</a></li>
    </ul>

    la subtilité du css (à partir de css2) permet de générer les effets d'apparition/disparition des différents niveaux du menu
    voir cet exemple de cours qui le propose...

    donc tu vois, si tu sais lister tous les éléments qui ont pour parent un élément donné alors rien de compliqué

    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Membre régulier
    Bonjour eric69 et jonfever,
    Je n'y serais jamais arrivée sans toi Eric, encore merci.
    Pour une fois que je voulais rendre service, je tombe à côté, désolée jonfever !
    Le code marche à merveille, je l'ai étendu aux communes et je le fais suivre !
    Très bonne journée à vous 2,
    Evelyne