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 :

Comment afficher correctement les éléments enfants dans l'élément parent


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut Comment afficher correctement les éléments enfants dans l'élément parent
    Je construis un système de boutique en ligne architecture MVC. J'ai la table MERCHANTS et la table PRODUCTS et CART . Un commerçant (magasin) peut avoir un ou plusieurs produits, chaque produit du système appartient à un magasin donc je veux afficher les produits par magasin quand je vais sur la page panier, je veux dire qu'une fois qu'un utilisateur ajoute par exemple des produits qui appartiennent à la même boutique, le panier doit afficher les produits comme une arborescence. J'ai déjà posté ce problème, j'ai pu réfléchir et venir avec la mise à jour de ce que j'ai fait, mais il n'affiche toujours pas correctement l'arborescence, comme lorsqu'un magasin a plus d'un produit dans le panier. Voici une illustration. Quelqu'un peut-il m'aider s'il vous plaît ou me dire ce que je fais mal

    Model
    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
     
    $userId = 1; // This is just for an example
    $itemsInCart= getCart($userId); // Fetch the items in cart from the DB on session
    function getCart($userId): array
    {
        try {
            $db = createConnection();
            $sql = 'SELECT * FROM cart
                    LEFT JOIN products p ON cart.product_id = p.product_id
                    LEFT JOIN merchants m ON p.merchant_id = m.merchant_id
                    WHERE user_id = :userId ';
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':userId', $userId, PDO::PARAM_INT);
            $stmt->execute();
            $invInfo = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
            return $invInfo;
        } catch (PDOException $e) {
            return [];
        }
    }
    Vue
    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
     
    $userCartDisplay = buildUserCartDisplay($itemsInCart); // Builds the cart elements' view
    function buildUserCartDisplay($itemsInCart)
    {
     
    // Here's how you track if you need the header
    $lastMerchantID = -1 ;
     
    $html = '';
    // Now loop
     
    foreach($itemsInCart as $row)
    {        $html .= '<div>';
     
            // Only show merchant header on condition
            if ($lastMerchantID <> $row['merchant_id']) {
                $html .= '<ul>';
                $html .=  "". $row['merchant_name']."";
                // Note that you've shows this header so you don't show it again.
                $lastMerchantID = $row['merchant_id'];
                $html .=  '</ul>';
            }
     
            // Now output the rest
            $html .=  '<li>';
            $html .=  "".$row['product_model']."";
            $html .=  '</li>';
            $html .=  '</div>';
    }
     
    return $html;
    }
    echo $userCartDisplay; // Display the view

    Je veux afficher les produits par boutique de cette sorte ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ul>MERCHANT_NAME
        <li>Product model</li>
    </ul>
    <ul>MERCHANT_NAME
        <li>Product model</li>
        <li>Product model</li>
        <li>Product model</li>
    </ul>
    Mais malheureusement voila ce qui resort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <ul>MERCHANT_NAME
        <li>Product model</li>
    </ul>
    <ul>MERCHANT_NAME
        <li>Product model</li>
    </ul>
    <ul>
        <li>Product model</li>
    </ul>
    <ul>
        <li>Product model</li>
    </ul>

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 341
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 341
    Billets dans le blog
    17
    Par défaut
    Tu ouvres et fermes *immédiatement* <ul> à chaque nouveau marchand
    De plus le <div> ne me semble pas bien placé

    Essaie ceci :

    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 buildUserCartDisplay($itemsInCart)
    {
        // Here's how you track if you need the header
        $lastMerchantID = -1 ;
        $html = '';
     
        // Now loop
        foreach($itemsInCart as $row) {
     
            // Only show merchant header on condition
            if ($lastMerchantID <> $row['merchant_id']) { // Nouveau marchand ?
                if ($lastMerchantID !== -1) { // Y-avait-il un précédent marchand ?
                    $html .= '</ul>'; // Ferme la liste du précédent marchand
                }
                $html .= '<ul>'; // Ouverture de la nouvelle liste
                $html .=  "". $row['merchant_name']."";
                // Note that you've shows this header so you don't show it again.
                $lastMerchantID = $row['merchant_id'];
            }
     
            // Now output the rest
            $html .=  '<li>';
            $html .=  "".$row['product_model']."";
            $html .=  '</li>';
       }
     
        return $html . '</ul>'; // Fermeture de la dernière liste
    }
    Autre manière de régler cela : avec PDO tu peux faire un groupement des lignes selon la valeur du premier champ de chaque ligne. Dans ton cas ça pourrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = 'SELECT m.merchant_name, ... FROM cart';
     
    $result = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);
     
    foreach ($result as $merchant => $products) {
        echo "{$merchant} : <ul>";
        foreach ($products as $product) {
            echo "<li>{$product['product_model']}</li>";
        }
        echo '</ul>';
    }

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut
    Merci bcp Séb tu es le meilleur.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/12/2009, 12h05
  2. Réponses: 2
    Dernier message: 18/05/2009, 12h17
  3. [SQL] Comment afficher correctement les caractères accentués ?
    Par innova dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/01/2007, 10h35
  4. Réponses: 1
    Dernier message: 01/05/2006, 11h17

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