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

PHP & Base de données Discussion :

Afficher les catégories et les sous-catégories d'un menu dynamique


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2021
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2021
    Messages : 81
    Par défaut Afficher les catégories et les sous-catégories d'un menu dynamique
    Bonjour, je cherche votre aide pour faire apparaitre mes annonces dans le sous-menu. Quand je clique sur un sous menu rien n'apparait.
    J'ai donc des tables qui sont liées de la façon suivante:
    Nom : C11.png
Affichages : 468
Taille : 58,1 Ko


    Et ma table categories a la forme suivante:

    id id_parent nom_fr nom_en ok_form
    1 0 Accueil ... 0
    ...
    2 0 Immobilier ... 1
    201 2 Vente de Maisons ... 1
    202 2 Location de Maisons ... 1
    203 2 Vente d Appartements ... 1
    204 2 Location d Appartements ... 1
    205 2 Bureaux ... 1
    206 2 Terrains ... 1
    ...
    3 0 Véhicules ... 1
    301 3 Voitures ... 1
    301 3 Motos ... 1
    302 3 Accessoires ... 1
    ...
    4 0 Multimedia ... 1
    401 4 Téléphones ... 1
    402 4 Télévisions ... 1
    ...
    5 0 ... ... 1

    Je voudrais également savoir s'il faudrait ajouter un nouveau champ "page" dans la table categories pour la partie accueil et contact où il faut mettre des liens? Si oui, faudrait-il mettre des liens pour les autres catégories dont on va récupérer l'id pour l'affichage de l'annonce?

    Voici le code de mon menu (dynamique):
    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
    function getMenu( $id_parent=0 )
    {
       global $bdd;
     
       $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; // on s'assure que la langue est correcte
     
       $sql = "SELECT id, id_parent, nom_".$sql_lang." AS nom
    	FROM categories
    	WHERE id_parent = :id_parent
    	ORDER BY id
    	";
     
       try{
          $req = $bdd->prepare($sql);
          $req->execute( array(':id_parent'=>$id_parent) ); 
          $res =  $req->fetchAll(PDO::FETCH_ASSOC);
        }catch(Exception $e){
          echo "Erreur dans la requête " . $sql;
          $res = false;
        }
     
       return $res;
    }
    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
    <div id="menu>">
    <nav>
      <label for="menu-mobile" class="menu-mobile">Menu</label>
      <input type="checkbox" id="menu-mobile" role="button">
     
      <?php
     
     $menus = getMenu(0);	
     
     echo '<ul>';
     
     foreach ($menus as $menu) {
     
         echo "<li class='menu'><a href= 'affichage.php?id={$menu['id']}'>{$menu['nom']}</a>";
     
         $sous_menus = getMenu($menu['id']); 
     
         if ($sous_menus !== false) {
             echo '<ul>';
             foreach ($sous_menus as $sous_menu) {
                 echo "<li class='submenu'><a href= 'affichage.php?id={$sous_menu['id']}'>{$sous_menu['nom']} </a></li>";
             }
             echo '</ul>';
         }
     
         echo '</li>';
     }
     
     echo '</ul>';
     
    ?>
     
    </nav>  
    </div>


    Le code d'affichage:
    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
       function getAffichage($categorie){
          global $bdd;
          $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr';
          $sql = ' SELECT  A.*
                          ,C.nom_'.$sql_lang.' AS CATEGORIE
                          ,V.ville_'.$sql_lang.' AS VILLE
                   FROM annonces A
                   LEFT JOIN categories C ON C.id = A.id_categorie
                   LEFT JOIN villes V ON V.id = A.id_ville
                   WHERE A.id_categorie = ".$categorie."
     
                   ORDER BY A.created_date DESC';
          try {
            $req = $bdd->prepare($sql);
            $req->execute();
            $res = $req->fetchAll(PDO::FETCH_ASSOC);
          } catch (Exception $e) {
            echo "Erreur dans la requête " . $sql;
          }
          // le temps des tests pour voir le résultat
          return $res;
        }
     
     
     
     
     
     
      function affichageAnnonce($categorie){
        global $bdd;
        $annonces = getAffichage($categorie);
        $images = getImagesAnnonces();
     
        $res = [];
        foreach ($annonces as $R) {
          $res[$R['id']] = $R;
          $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL;
          if(!empty($imgs)){
            foreach($imgs as $I){
              $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null;
            }
          }else{
              $res[$R['id']]['images'] = null;
          }
     
        }
        return $res;
     
      }
    J'ai séparé les fonctions, sinon ça se répercute sur les images.

    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
    <?php
            $categorie = !empty($_GET['categorie']) ? trim($_GET['categorie']) : null;
          $affichage= affichageAnnonce($categorie);
     
     
     
         foreach ($affichage as $a) {
            echo '<div class="annoncepubs">';
     
            $images = !empty($a['images']) ? $a['images'] : ['/no_image.png']; // array
     
            if (!empty($images)) {
              //boucle sur les images
              echo'<div class="container">';
              echo ' <div class="slider" >';
              foreach ($images as $img) {
                echo '<img class ="active" style="width:90px; height:90px;" src="' . $img . '">';
              }
              echo "</div>"; // fin div slider . 
              echo '<div class="cont-btn" >';
              echo '  <div class="btn-nav left" > <';
              echo "  </div>";
              echo '  <div class="btn-nav right" > >';
              echo "  </div>";
              echo "</div>";
              echo "</div>"; // fin div container
            }
            echo "<span class='category'>" . $a['CATEGORIE'] . "</span>";
            echo "<span class='title'>" . $a['titre'] . "</span>";
            echo "<span class='comment'>" . $a['description'] . "</span>";
            echo "<span class='price'>" . $a['prix'] . "</span>";
            echo "<span class='date'>" . $a['created_date'] . "</span>";
     
     
            echo "</div>"; // fin div annoncepubs 
          }
     
     
     
           ?>

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    C'est dans le fichier affichage.php qu'il faut dispatcher en fonction de l'id *.
    Ça vaut aussi pour accueil et contact.

    * Et ce n'est pas $_GET['categorie'], mais $_GET['id'].


    Il faudrait être plus rigoureux.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2021
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2021
    Messages : 81
    Par défaut
    Car je pensais qu'il fallait fallait faire get catégorie qui est le name dans le select.

    J'ai donc modifié la fonction getAffichage, mais je n'ai pas de résulat:

    Page des fonctions:
    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
      function getAffichage($categorie){
          global $bdd;
          $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr';
          $sql = ' SELECT  A.*
                          ,C.id AS id, C.nom_'.$sql_lang.' AS CATEGORIE
                          ,V.ville_'.$sql_lang.' AS VILLE
                   FROM annonces A
                   LEFT JOIN categories C ON C.id = A.id_categorie
                   LEFT JOIN villes V ON V.id = A.id_ville
                   WHERE A.id_categorie = ".$categorie."
     
                   ORDER BY A.created_date DESC';
          try {
            $req = $bdd->prepare($sql);
            $req->execute();
            $res = $req->fetchAll(PDO::FETCH_ASSOC);
          } catch (Exception $e) {
            echo "Erreur dans la requête " . $sql;
          }
          // le temps des tests pour voir le résultat
          return $res;
        }
     
     
      function affichageAnnonce($categorie){
        global $bdd;
        $annonces = getAffichage($categorie);
        $images = getImagesAnnonces();
     
        $res = [];
        foreach ($annonces as $R) {
          $res[$R['id']] = $R;
          $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL;
          if(!empty($imgs)){
            foreach($imgs as $I){
              $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null;
            }
          }else{
              $res[$R['id']]['images'] = null;
          }
     
        }
        return $res;
     
      }
    Et dans le fichier affichage.php:
    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
     <?php
            $categorie = !empty($_GET['id']) ? trim($_GET['id']) : null;
          $affichage= affichageAnnonce($categorie);
     
     
     
         foreach ($affichage as $a) {
            echo '<div class="annoncepubs">';
     
            $images = !empty($a['images']) ? $a['images'] : ['/no_image.png']; // array
     
            if (!empty($images)) {
              //boucle sur les images
              echo'<div class="container">';
              echo ' <div class="slider" >';
              foreach ($images as $img) {
                echo '<img class ="active" style="width:90px; height:90px;" src="' . $img . '">';
              }
              echo "</div>"; // fin div slider . 
              echo '<div class="cont-btn" >';
              echo '  <div class="btn-nav left" > <';
              echo "  </div>";
              echo '  <div class="btn-nav right" > >';
              echo "  </div>";
              echo "</div>";
              echo "</div>"; // fin div container
            }
            echo "<span class='category'>" . $a['CATEGORIE'] . "</span>";
            echo "<span class='title'>" . $a['titre'] . "</span>";
            echo "<span class='comment'>" . $a['description'] . "</span>";
            echo "<span class='price'>" . $a['prix'] . "</span>";
            echo "<span class='date'>" . $a['created_date'] . "</span>";
     
     
            echo "</div>"; // fin div annoncepubs 
          }
     
           ?>
    NB: On n'a pas utilisé la fonction getmenu(). Doit-on l'utiliser au lieu de getAffichage?

  4. #4
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Il ne faut pas tout mélanger...

    Soit c'est le menu, soit le select...

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2021
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2021
    Messages : 81
    Par défaut
    Ok, donc du coup j'ai choisi getMenu pour afficher les catégories des annonces au lieu de getAffichage, mais j'ai l'erreur suivante dans la fonction affichageAnnonce:
    Warning: Invalid argument supplied for foreach() in C:

    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
     function getMenu( $id,$id_parent=0 )
         {
            global $bdd;
     
            $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; // on s'assure que la langue est correcte
     
            $sql = "SELECT A*
             ,C.id AS id, C.id_parent, C.nom_".$sql_lang." AS nom
             ,V*
           FROM annonces A
           LEFT JOIN categories C ON C.id = A.id_categorie
           LEFT JOIN villes V ON V.id = A.id_ville
           WHERE id_parent = :id_parent
           AND id = :id
           ORDER BY A.created_date DESC
           ";
     
            try{
               $req = $bdd->prepare($sql);
               $req->execute( array(':id',':id_parent'=>$id,$id_parent) ); 
               $res =  $req->fetchAll(PDO::FETCH_ASSOC);
             }catch(Exception $e){
               echo "Erreur dans la requête " . $sql;
               $res = false;
             }
     
            return $res;
         }

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Si tu fais n'importe quoi sans comprendre, tu n'arriveras à rien.

    1- Tes fonctions ont un usage précis :
    • getMenu() permet d'afficher... le menu !

    Si tu veux afficher "les articles d'une catégorie", écrit la fonction correspondante.
    Avec un nom EXPLICITE.
    Par exemple :
    • getArticles_fromCategorie($id_cat)


    2- concernant :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
            $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; // on s'assure que la langue est correcte
    SI CE TEST a été fait en amont (via une fonction setSession_lang() par exemple),
    alors dans tes fonctions, il suffit d'écrire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
            $sql_lang = $_SESSION['lang'];

Discussions similaires

  1. [XL-2007] [TCD] Comment afficher les sous-totaux AVANT le détail ?
    Par fourchette dans le forum Excel
    Réponses: 3
    Dernier message: 10/03/2010, 07h28
  2. [Dojo] Afficher les sous elements d'un dossier dans une tree
    Par devkaty dans le forum Bibliothèques & Frameworks
    Réponses: 8
    Dernier message: 18/09/2009, 00h03
  3. Afficher les sous titres arabe dans une vidéo
    Par Coussati dans le forum Windows XP
    Réponses: 2
    Dernier message: 26/08/2009, 05h37
  4. [DOM] Menu déroulant et DOM. Afficher les sous-menus cachés
    Par glenouve dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/11/2007, 10h42
  5. Parcourir un dossier et afficher les sous-dossiers
    Par grenoult dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/06/2007, 14h10

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