Partage
  • Partager sur Facebook
  • Partager sur Twitter

[symfony3] problème de validation de panier

    1 septembre 2016 à 10:21:06

    bonjour;

    je suis a créer un site de e-commerce, est le souci c'est que j'essaye que une fois que le client a valide son panier et ses adresses, j'ai une page de récapitulatif de son panier et adresse avant de payer:

    mais le souci c'est que la je ne retrouve avec cette erreur :

    Impossible to access an attribute ("commande") on a null variable in EmiliePlatformBundle:Advert:validation.html.twig at line 30

    voici le fichier validation: 

    {% extends "EmiliePlatformBundle::layout.html.twig" %}
    
    
    {% set total = 0%}
    
    {% block body %}
    <div class="container">
        <div class="row">
            
            <div class="span9">
                
                <h2>Valider mon panier</h2>
                <table id='table' name='table' style='border-collapse: collapse; width: 73%;'>
                    <thead>
                        <tr style='background-color: gray;'>
                            <th>Désignation</th>
                            <th>Quantité</th>
                            <th>Prix unitaire</th>
                            <th>Total</th>
                        </tr>
                    </thead>
                    <tbody>
                        
                        {% for articles in commande.commande.advert %}
                        <tr>
                                <td>{{ articles.dsgart }}</td>
                                <td>
                                    {{ articles.quantite }}
                                </td>
                    
                                <td>{{ articles.prxrep * articles.quantité }} €</td>
                            
                        </tr>
                        
                        {% endfor %}
                    </tbody>
                </table>
                
                <dl class="dl-horizontal col-sm-3 col-sm-push-1">
                
                    <dt>Total :</dt><dd>{{ commande.commande.prix }} €</dd>
                </dl>
    
                </br>
                
                </br></br>
    
                <div class="span3 col-sm-3 col-sm-push-1">
                    <dl class="col-sm-3 col-sm-push-1">
                        <dt><h4>Adresse de livraison</h4></dt>
                        <dt>{{ commande.commande.livraison.NUMCLI }} - {{ commande.commande.livraison.NOMCLI }}</dt>
                        <dt>{{ commande.commande.livraison.ADRCLI }}</dt>
                        <dt>{{ commande.commande.livraison.ADRCEN }}</dt>
                        <dt>{{ commande.commande.livraison.TELCLI }}</dt>
                    </dl>
                </div>
    
                
                
                <div class="span3 ">
                    <dl class="col-sm-3 col-sm-push-1">
                        <dt><h4>Adresse de facturation</h4></dt>
                        <dt>{{ commande.commande.facturation.NUMCLI }} - {{ commande.commande.facturation.NOMCLI }}</dt>
                        <dt>{{ commande.commande.facturation.ADRCLI }}</dt>
                        <dt>{{ commande.commande.facturation.ADRCEN }}</dt>
                        <dt>{{ commande.commande.facturation.TELCLI }}</dt>
                    </dl>
                </div>
                
                <div class="clearfix"></div>
    
    
               <form action="{{ path('emilie_platform_validationCommande', { 'id' : commande.id }) }}" method="POST"/>
                    <input name="token" type="hidden" value="{{ commande.commande.token }}" />
                    <input name="prix" type="hidden" value="{{ commande.commande.prix }}" />
                    <input name="date" type="hidden" value="{{ commande.date|date('dmyhms') }}" />
                    <button type="submit" class="btn btn-success col-sm-2 col-sm-push-4">Payer</button>
                </form>
            
                <a href="{{ path('emilie_platform_livraison') }}" class="btn btn-primary ">retour</a>
               </form> 
               
            </div>
    
        </div>
    </div>
    {% endblock %}

    et voici le controller (une partie):

     //GESTION DU PANIER
      public function panierAction(Request $request)
      {
           $session = $request->getSession();
            
            if (!$session->has('panier')) 
    
            $session->set('panier', array());
            
            $em = $this->getDoctrine()->getManager();
    
            $advert = $em->getRepository('EmiliePlatformBundle:Advert')->findArray(
            array_keys($session->get('panier'))
    
            );
            
    
            return $this->render('EmiliePlatformBundle:Advert:panier.html.twig', array(
              'advert' => $advert,
              'panier' => $session->get('panier')
              )); 
           
      }
    
      public function ajouterAction($numart, Request $request)
        {
            $session = $request->getSession();
            
            if (!$session->has('panier')) $session->set('panier',array());
            $panier = $session->get('panier');
            
            if (array_key_exists($numart, $panier)) {
                if ($request->query->get('qte') != null){
                  $panier[$numart] = $request->query->get('qte');
                  $this->get('session')->getFlashBag()->add('success','Quantité modifié avec succès');
                  } 
            } else {
                if ($request->query->get('qte') != null){
                    $panier[$numart] = $request->query->get('qte');
                }else{
                    $panier[$numart] = 1;
                }
                $this->get('session')->getFlashBag()->add('success','Article ajouté avec succès');
            }
                
            $session->set('panier',$panier);
            
            
            return $this->redirectToRoute('emilie_platform_panier');
         
        }
    
        public function supprimerAction($numart, Request $request)
        {
            $session = $request->getSession(); 
            
            $panier = $session->get('panier');
            
            if (array_key_exists($numart, $panier))
            {
                unset($panier[$numart]);
                $session->set('panier',$panier);
                $this->get('session')->getFlashBag()->add('success','Article supprimé avec succès de votre panier');
            }
            
            return $this->redirectToRoute('emilie_platform_panier');
        }
    
    
    
        //GESTION LIVRAISON
        public function livraisonAction(Request $request)
        {
          $session = $request->getSession();
    
          if (!$session->has('livraison')) 
    
            $session->set('livraison', array());
            
            $em = $this->getDoctrine()->getManager();
    
            $clients = $em->getRepository('EmiliePlatformBundle:Clients')->findall(
            array_keys($session->get('livraison'))
    
            );
    
            return $this->render('EmiliePlatformBundle:Advert:livraison.html.twig', array(
              'clients' => $clients,
              'livraison' => $session->get('livraison')
              ));
    
       }
    
       public function setLivraisonOnSession(Request $request)
        {
            $session = $request->getSession();
            
            if (!$session->has('adresse')) $session->set('adresse',array());
            $adresse = $session->get('adresse');
            
            if ($request->request->get('livraison') != null && $request->request->get('facturation') != null)
            {
                $adresse['livraison'] = $request->request->get('livraison');
                $adresse['facturation'] = $request->request->get('facturation');
            } else {
                return $this->redirectToRoute('emilie_platform_validation');
            }
            
            $session->set('adresse',$adresse);
            return $this->redirectToRoute('emilie_platform_validation');
        }
    
        public function validationAction(Request $request)
        {
            if ($request->getMethod('POST'))
    
              $this->setLivraisonOnSession($request);
            
            $em = $this->getDoctrine()->getManager();
            $prepareCommande = $this->forward('EmiliePlatformBundle:Commandes:prepareCommande');
            $commande = $em->getRepository('EmiliePlatformBundle:Commandes')->find($prepareCommande->getContent());
            
            return $this->render('EmiliePlatformBundle:Advert:validation.html.twig', array('commande' => $commande));
            
        }
    
        //GESTION COMMANDES
        public function facture(Request $request)
        {
            $em = $this->getDoctrine()->getManager();
            $generator = $this->container->get('security.secure_random');
            $session = $request->getSession();
            $adresse = $session->get('adresse');
            $panier = $session->get('panier');
            $commande = array();
            $total = 0;
    
            $facturation = $em->getRepository('EmiliePlatformBundle:Clients')->find($adresse['facturation']);
            $livraison = $em->getRepository('EmiliePlatformBundle:Clients')->find($adresse['livraison']);
            $advert = $em->getRepository('EmiliePlatformBundle:Advert')->findArray(array_keys($session->get('panier')));
    
            foreach ($advert as $articles) {
              $prix = ($articles->getPrxrep() * $panier[$articles->getNumart()]);
              $total += $prix;
    
              $commande['articles'][$articles->getNumart()] = array('reference' => $articles->getDsgart(),
                                                                    'quantite' => $panier[$articles->getNumart()],
                                                                    'prix' => round($articles->getPrxrep(),2));
    
            }
    
              $commande['livraison'] = array('Numéro' => $livraison->getNumcli(),
                                              'Nom' => $livraison->getNomcli(),
                                              'Adresse client' => $livraison->getAdrcli(),
                                              'Adresse centre' => $livraison->getAdrcen(),
                                              'Telephone' => $livraison->getTelcli());
              
              $commande['facturation'] = array('Numéro' => $facturation->getNumcli(),
                                              'Nom' => $facturation->getNomcli(),
                                              'Adresse client' => $facturation->getAdrcli(),
                                              'Adresse centre' => $facturation->getAdrcen(),
                                              'Telephone' => $facturation->getTelcli());
    
             
              $commande['prix'] = round($total,2);
              $commande['token'] = bin2hex($generator->nextBytes(20));
    
              return $commande; 
        }
    
        public function prepareCommandeAction(Request $request)
        {
          $session = $request->getSession();
          $em = $this->getDoctrine()->getManager();
    
          if(!$session->has('commande'))
            $commande = new Commande();
          else
            $commande = $em->getRepository('EmiliePlatformBundle:Commandes')->find($session->get('commande'));
    
          $commande->setDate(new \DateTime());
          $commande->setUsername($this->get('security.token_storage')->getToken()->getUser());
          $commande->setValider(0);
          $commande->setReference(0);
          $commande->setCommande($this->facture());
    
          if(!$session->has('commande')){
            $em->persist('commande');
            $session->set('commande', $comande);
          } 
    
          $em->flush();
    
          return new Response($commande->getId());
        }    
    
        /*
         * Cette methode remplace l'api banque.
         */
        public function validationCommandeAction($id, Request $request)
        {
          $em = $this->getDoctrine()->getManager();
          $commande = $em->getRepository('EmiliePlatformBundle:Commandes')->find($id);
    
          if (!$commande || $commande->getValider() ==1)
            throw $this->createNotFoundException('La commande n\'existe pas');
    
          $commande->setValider(1);
          $commande->setReference(1); //Services
          $em->fush();
    
          $session = $request->getSession();
          $session->remove('adresse');
          $session->remove('panier');
          $session->remove('commande');
    
          $this->get('session')->getFlashBag()->add('success', 'Votre commande est validé avec succès');
    
          return $this->redirectToRoute('emilie_platform_Advert');
        }

    si je comprend bien il arrive pas a accéder a variable commande qui est nul.

    merci d'avance de votre aide.

    -
    Edité par EmyJ 1 septembre 2016 à 13:59:57

    • Partager sur Facebook
    • Partager sur Twitter
    Emilie jezezquel
      15 avril 2017 à 16:23:56

      Bonjour emilie, j'ai exactement le meme problème , au meme niveau, sur la meme plate-forme; 1 semaine déjà que j'arrive pas à trouver le bémol.

      je sai sue ca fait longtemps pour ton post.mais avez vous trouvé la solution ou un moyen de contourner ce problème.plllleeaase , je suis fatigué

      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2017 à 16:38:03

        Hello,

        peux-tu faire un dump de "commande" (dans ta vue) et nous montrer son contenu?

        /***/
        
        {{ dump(commande) }}
        
        {% for articles in commande.commande.advert %}
            <tr>
                <td>{{ articles.dsgart }}</td>
                <td>{{ articles.quantite }}</td>
                <td>{{ articles.prxrep * articles.quantité }} €</td>
            </tr>
        {% endfor %}
        
        /***/



        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2017 à 19:12:01

          le dump placé a ce niveau ne renvoie rien. c'est de le message d'erreur qui prend le dessus.malgré le dump

          Impossible to access an attribute ("commande") on a null variable.

          -
          Edité par YannDeo 17 avril 2017 à 23:40:02

          • Partager sur Facebook
          • Partager sur Twitter
            17 avril 2017 à 3:25:32

            personne pour aider svp???? :( :(
            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2017 à 20:18:42

              Bonjour

              Dit est ce ton Numart qui est  l'ID?

              • Partager sur Facebook
              • Partager sur Twitter
                17 avril 2017 à 20:26:48

                pas compris.Tu peux être plus claire stp

                -
                Edité par YannDeo 17 avril 2017 à 20:34:02

                • Partager sur Facebook
                • Partager sur Twitter
                  17 avril 2017 à 22:03:10

                  YannDeo,

                  Tu devrais faire ton dump($commande); puis un die(); dans ton controller :

                  prepareCommandeAction dans le else juste après : $commande = $em->getRepository('EmiliePlatformBundle:Commandes')->find($session->get('commande')); et nous renvoyer ce que cela te retourne. 

                  Pour déboguer, fait des dump() petit à petit à divers endroit de ton code pour voir ce que tu récupères à chaque fois. 

                  Par exemple, là tu le fais là ou je t'ai dit. Après tu peux faire un dump($prepareCommande) dans validationAction après $prepareCommande etc..

                  Sincèrement,

                  KillaFu

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui croit tout savoir n'apprend plus.

                    17 avril 2017 à 22:12:25

                    Tu fais $commande['articles'][$articles->getNumart()] au lieu de $commande['articles'][$articles->getID()] 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 avril 2017 à 23:53:50

                      j'ai essai le dump un peu partout en amont et en aval ,soit l'erreur continu a prendre le dessus sur le dump ,soit le dump de $prepareCommande ou de $commande me dit que c'est nulle. **Petite précision,le plus bizarre c'est que la commande liée au un utilisateur est belle et bien enregistrée en BD ; mais au moment ou il faut récupérer ces informations pour constituer la facture .j'ai toujours cette horrible erreur .

                      Impossible to access an attribute ("commande") on a null variable.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 avril 2017 à 1:19:12

                        Ce n'est pas bizarre. La création en BDD est ok.

                        Mais la requête pour récupérer tes données n'est pas bonne. Et vu ce que tu indiques, tu récupères une valeur null sur $prepareCommande.

                        Donc du coups dans ta vue tu essaies d'avoir accès à ton attribut "commande" sur une variable null. C'est tout simplement ce qu'indique ton erreur.

                        Essais donc de chercher pourquoi tes requêtes te retournent un résultat null.

                        Sincèrement,

                        KillaFu

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Celui qui croit tout savoir n'apprend plus.

                          18 avril 2017 à 2:31:42

                          $prepareCommande foward sur un autre controller.le dump de cette variable affiche null ;ensuite vient la ligne censé récupéré l'id que retourne la méthode Response

                          public function ValidationAction(Request $request)
                          {
                          if ($request->isMethod('POST'))
                          $this->setLivraisonOnSession($request);

                          $em = $this->getDoctrine()->getManager();

                          $prepareCommande = $this->forward('EmarketBundle:Commandes:prepareCommande');

                          $commande = $em->getRepository('EmarketBundle:Commandes')->find($prepareCommande->getContent());


                          return $this->render('EmarketBundle:Frontend:panier/validation.html.twig' ,array('commande'=> $commande ));
                          }


                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 avril 2017 à 13:17:09

                            Bonjour , j ai vu ton erreur

                            Ligne 188

                            $em->persist('commande');
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 avril 2017 à 23:17:15

                              Salut les gars merci pour vos propositions, 2 semaines déjà je suis encore sur cette erreur ,je désespère.

                              Life Goes On la modif sur la ligne 188 ne donne toujours rien .jai toujours le meme message d'erreurs. Autre chose please?.

                              -
                              Edité par YannDeo 3 mai 2017 à 18:37:39

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 avril 2017 à 12:13:09

                                Bonjour STP renvoie mon le controller au complet STP. As tu un CommandeController?

                                -
                                Edité par Life Goes On 19 avril 2017 à 12:34:15

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 juillet 2017 à 11:56:39

                                  le problème vient de "security.secure_random"
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 juillet 2017 à 8:25:35

                                    Steeve martin security.secure.random  a remplacé par quoi? . 4 mois deja jen suis tjr au mm problème.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 juillet 2017 à 14:03:10

                                      Bonjour j'ai eu le même problème et avec un de bol j'ai pu trouver une solution. Emy-J et YannDeo je peux voir le contenu de votre entité commandes et les uses de vos panierController et CommandesController s'ils vous plaît??

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 juillet 2017 à 11:45:18

                                        salut cedrick57, je suppose que tu travaille sur le même projet .C'est vraiment galère ; comme Emily ,jai du aussi stoppé le projet faute de solution .je voudrais te laisser mon gmail;pour voir ça ensemble de plus prêt . t'en pense quoi?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 juillet 2017 à 12:12:15

                                          Salut YannDeo. Chui d'accord pour le gmail

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 juillet 2017 à 12:45:45

                                            D'accord ,c'est super.

                                            -
                                            Edité par YannDeo 23 février 2018 à 16:20:44

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              22 septembre 2017 à 11:23:59

                                              Désolé pour le retard,

                                              Ajouter les "use" dans le controller et remplacer $generator par $random

                                              ;)

                                              use Symfony\Component\Security\Core\SecurityContext;
                                              use Symfony\Component\Security\Core\Util\SecureRandom;
                                              
                                              class CommandesController extends Controller
                                              {
                                                  public function facture(Request $request)
                                                  {
                                                      $em = $this->getDoctrine()->getManager();
                                                      $random = random_int(1, 20);
                                              // $generator = $this->container->get('security.secure_random');



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                22 février 2018 à 21:27:22

                                                UP j'ai le meme probleme que vous quelqu'un a une solution svp
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                [symfony3] problème de validation de panier

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown