Bonjour, je suis débutant et je voudrais faire un site e-commerce avec un panier, pour faire sa j'ai créer une permière fonction qui permet de créer un panier et de voir si il est vide ou pas, si le panier est vide sa créer le panier et sa ajoute le produit et si le panier est déja créer sa incrément de 1 a chaque que l'on ajoute un produit.
Voici le code :

 "``public function add(Produit $produit, SessionInterface $session){
         // On recupère le panier actuel
         $panier = $session->get("panier", []);
         $id = $produit->getId();
         //On créer un tableau
         if(!is_array($panier)){
            $panier = [];
         }
         //si le panier n'est pas vide on l'incrémente de 1
        if(!empty ($panier[$id])){
            $panier[$id]++;
        }
        //si le panier est vide on ajoute 1
        else{
             $panier[$id] = 1;
        }
      //ON sauvegarde dans la session
      $session->set("panier", $panier);

      return $this->redirectToRoute("panier_index");``"

  }

Ensuite j'ai créer une deuxième fonction pour pouvoir récuperer le panier et le mettre dans une boucle foreach pour qu'il m'affiche tous se qui se trouve dans le panier pour faire sa j'ai créer une variable $dataPanier et je lui est donné la valeur tableau, et j'ai aussi créer une variable $total et je lui est donné la valeur 0 car elle vas servir a calculer le total du panier.
Voici le code:

public function index(SessionInterface $session, ProduitRepository $produitRepository): Response
{   
    $panier = $session->get("panier", []);//On recuperer la session panier et si jamais elle est vide on recuperer un tableau vide 
    //On fabrique les données 
    $dataPanier = [];//créer une variable et on l'initialise a un tableau vide 
    $total = 0;//sers a calculer le total des prix 

    foreach($panier as $id => $quantite){//sert a bouclée sur le panier pour y recuperer l'id et la quantité

          $produit = $produitRepository->findBy($id);//Permet de recuperer un produit grace a la methode findAll() à partir de sont identifiant 

          $dataPanier[] = [  //Créer un tableau pour stocker des information sur un panier, la clé "produit" contiendrait le nom ou la référence du produit
            //et la clés "quantité" contiendrait la quantité de se produit dans le panier.
            "produit" => $produit,
            "quantite" => $quantite
           ];
          $total += $produit->getPrice() * $quantite;//permet de calculer d'un produit par la quantité commandé et en ajoutant ce montant au coût total deja accumulé.

    }
    return $this->render('panier/index.html.twig', compact("dataPanier", "total"));
}

Et le dernier code que j'ai fait c'est le tableau pour pouvoir afficher le tous sur la page panier de l'utilisateur.
Voici le code:

 <table class="table">
        <thead>
            <tr>
               <th>Produit</th>
               <th>Prix</th>
               <th>Quantité</th>
               <th>Total</th>
               <th>Actions</th>
            </tr>
        </thead>
        <tbody>

            {% for element in dataPanier %}
                <tr>
                    <td>{{produit.titre}}</td>
                    <td>{{produit.prix}}</td>
                    <td>{{quantite }}</td>
                    <td>{{produit.prix * quantite}}</td>
                    <td></td>
                </tr>

            {% endfor %}

        </tbody>

   </table>

Ce que je veut c'est pouvoir afficher dans la page panier tous les produit que le client aura ajouter a sont panier

Mais se que j'obtien c'est une erreur qui dit que la variable $dataPanier n'existe pas et symfony me surligne cette ligne {% for element in dataPanier %}.
Se que j'ai fait pour resoudre se problème c'est de regarder si la variable était correctement initialiser et si elle était correctement orthographier, j'ai aussi verifier si elle était en dehors de la boucle foreach.

Merci d'avance pour vos réponse.

2 réponses


Bonjour, Oui regarde bien le render.
Tu renvoies un string au lieu de retoutner t'a variable.
Généralement pour twig, c'est sous forme de tableau

Exemple :return $this->render('panier/index.html.twig', ["dataPanier" => $dataPanier, "total" => $total));

Le soucis vient de la partie vue.
Tu boucles sur ton panier et tu met le contenu dans une variable "element" et ensuite, tu utilises les variables "produit", et "quantite" qui n'existent pas.

Ceci devrait régler ton problème

{% for element in dataPanier %}
    <tr>
        <td>{{element.produit.titre}}</td>
        <td>{{element.produit.prix}}</td>
        <td>{{element.quantite }}</td>
        <td>{{element.produit.prix * element.quantite}}</td>
        <td></td>
    </tr>
{% endfor %}