Partage
  • Partager sur Facebook
  • Partager sur Twitter

Controller commande de produits

    16 juin 2018 à 10:56:36

    Bonjour! Je travaille sur un site e-commerce sur Silex. C'est mon premier site et j'aurais aimé savoir si la logique de mon controller est bonne.

    Le controller est celui de la route post de la page panier, au moment ou l'utilisateur ajoute les produits. Il concerne 2 tables, la table commande(id_commande,  id_client) et la table commande_produits(infos des produits, id_comm(=id_commande)).

    Le controller :

    $app->post('/panier', function (Request $request) use ($app){
    	$user = $app['session']->get('user');
            	$id_client = $user['userid'];
    	
        $id_comm = $app['db']->lastInsertId('id_commande');
        $userModel = new usersModels();           
        $panier = $userModel-> recupCommandeProduits($app, $id_comm);// fonction qui recupère les produits de table commande_produits
    	$recupcomm = $userModel-> recupCommande($app, $id_client);// fonction qui récupère les infos de table commande
    	
     	$produitsModel = new produitsModels();
        $MVe_liquides = $produitsModel -> getMVe_liquides($app);
        $MVe_cigs = $produitsModel -> getMVe_cigs($app);
        $MVaccessoires = $produitsModel -> getMVaccessoires($app);
        $MVdiy = $produitsModel -> getMVdiy($app);
        $MVexpert = $produitsModel -> getMVexpert($app);
        $nouveautes = $produitsModel -> getNouveautes($app); 			
                   
     	// Si il y qqch dans les formulaires (infos produits)
            if (isset($_POST)) {
              
                $nom = $_POST['nom_prod'];
                $options = $_POST['options'];
                $quantite = $_POST['quantite'];
                $prix = $_POST['prix'];
                $total = $_POST['total'];
                $fraisdeport = $_POST['fraisdeport'];
                $grandtotal = $_POST['grandtotal'];
    
            //Si l'utilisateur n'a pas de commande
                if(empty($recupcomm)){
                	$user = $app['session']->get('user');
            		$id_client = $user['userid'];
            	  		//on lui crée une commande
                	$userModel = new usersModels();
                	$ajoutcomm = $userModel->ajoutCommande($app, $id_client);//ajoute une commande dans table commande
    
    	          // SI 'utilisateur n'a pas de panier  
                	if (empty($panier)) 
                		{ 
                		  $id_comm = $app['db']->lastInsertId('id_commande');
                    	  $userModel = new usersModels();
                       // on lui crée un panier
                    	  $ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_comm, $_POST);// ajoute les produits dans commande_produits
                    	
                    	  return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcomm' => $ajoutcomm, 'ajoutcommprods' => $ajoutcommprods));               
                    	
            	  // Si l'utilisateur a déja un panier
                	}
                	else
                	{
                	     $id_comm = $app['db']->lastInsertId('id_commande');
     				     $id_prod = $_POST['id_prod'];
     				  //on update le panier
                         $userModel = new usersModels();
                         $updatecommprods = $userModel->updateCommandeProduits($app, $id_comm, $_POST, $id_prod);//met à jour les produits dans commande_produits
    
                        return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcomm' => $ajoutcomm, 'updatecommprods' => $updatecommprods, 'updatecomm' => $updatecomm ));
     
                			}
            //Si l'utilisateur a déja une commande
                }else{
                	$id_commande = $app['db']->lastInsertId('id_commande');
                	$userModel = new usersModels();
                	$updatecomm = $userModel->updateCommande($app, $id_commande);//met à jour la commande dans commande
    
                	//Si l'utilisateur n'a pas de panier
                		if (empty($panier)) { 
                		$id_comm = $app['db']->lastInsertId('id_commande');
                		// on lui crée un panier
                    	$userModel = new usersModels();
                    	$ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_comm, $_POST);// ajoute produits dans commande_produits
                    	
    
                    	return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcomm' => $ajoutcomm, 'ajoutcommprods' => $ajoutcommprods, 'updatecomm' => $updatecomm ));
                    	
    
                    	
            		// Si l'utilisateur a déja un panier	
                	}
                	 else
                	 {
                		$id_comm = $app['db']->lastInsertId('id_commande');
     					$id_prod = $_POST['id_prod'];
     				  // on met à jour le panier
                    	$userModel = new usersModels();
                    	$updatecommprods = $userModel->updateCommandeProduits($app, $id_comm, $_POST, $id_prod);//met à jour produits dans commande_produits
    
                     return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'updatecommprods' => $updatecommprods, 'updatecomm' => $updatecomm ));
     
                			}
    
                }
     	// Si il n'y a rien dans les formulaires (infos produits)
            }else{
            	// pas encore fait
    
            }
     
        return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'updatecomm' => $updatecomm ));
     
    })
        ->bind('panier_check')
    ;

    Bon de toute façon il doit y avoir un probleme quelquepart dans le controller car la fonction upateCommandeProduits n'est pas prise en compte...

    Merci pour votre aide!

    -
    Edité par JulienProd 16 juin 2018 à 10:57:48

    • Partager sur Facebook
    • Partager sur Twitter
      16 juin 2018 à 11:09:48

      Salut,

      Su ton panier tu ne peut pas faire de lastInsetId pour récupéré l'id du panier de l'user car imagine la situation suivante :

      Si A creer un panier, lastInsertId va bien donner son id de panier

      Si B creer un panier, lastInsertId va bien donner son id de panier

      Mais si A souhaite modifier son panier lastInsertId va donner l'id de panier de B car sa sera le dernier id créé

      ;)

      -
      Edité par Infoxp 16 juin 2018 à 11:10:43

      • Partager sur Facebook
      • Partager sur Twitter
      Infoxp ici depuis 2007
        16 juin 2018 à 11:15:05

        Hello,

        Il y a pas mal de chose qui me choquent:

        - l'utilisation de Silex (qui est maintenant déprécié) pour un site de E-commerce alors que Symfony est plus indiqué pour ce genre de chose

        - l'absence d'utilisation d'une classe controller

        - l'absence de l'utilisation du composant formulaire pour gérer les attributs de Request et la validation des données

        - la récupération du dernier ID qui indique une erreur dans la conception du model

        - la présence de fonctions qui devraient appartenir à des repository et qui semblent être présentes à la racine de ton app.php

        - l'utilisation d'Id d'objet alors que le framework est pensé pour faire de l'objet

        Bref, tu utilises silex en codant comme en Php procédural et sans tirer avantage des différents composants de Symfony. Ton code est donc vite devenu lourd et difficile à comprendre.

        Si tu fais du ménages dans ton code, dans le meilleur des cas, tu trouveras surement le problème sinon, tu faciliteras grandement le travail des gens qui veulent t'aider.

        Bon courage.

        • Partager sur Facebook
        • Partager sur Twitter
          16 juin 2018 à 11:15:57

          Merci pour ta réponse @Infoxp.

          Oui tu as raison je n'ai pas pensé à ca. Mais alors comment récupérer l'id_commande de la commande pour chaque utilisateur, un  insert select id_commande

          Dans l'ordre, je crée la commande puis je récupère l'id pour l'insérer dans la table commande_produits

          Merci pour ta réponse @ukusan.

          Oui à la base je voulais utiliser du php pur pour me familiariser avec ce language mais vu la complexité du site et comme c'est le seul sur lequel j'avais déja un peu travaillé je me suis lancé sur Silex.

          C'est vrai que le code est lourd ainsi... Je suis presque au bout du site(et j'ai beaucoup appris), une fois fini je vais essayer d'apprendre Symphony ou Laravel.

          Si tu as des conseils pas trop compliqués à mettre en place je suis preneur ;)

          -
          Edité par JulienProd 16 juin 2018 à 11:27:30

          • Partager sur Facebook
          • Partager sur Twitter
            16 juin 2018 à 11:42:38

            Tu as le choix,

            soit tu fait ton panier via les cookies

            soit tu associe avec ton panier l'id du membre mais ce qui signifie que tu soit connecté pour faire un panier

            soit tu fait un token à validité limité (suppression auto lorsque invalide) que tu associe à ton panier en le stockant dans ta table panier (avec un champ token_lifetime par exemple pour la validité) et un cookie chez l'user et tu récupère et valide le cookie pour récupéré le panier

            • Partager sur Facebook
            • Partager sur Twitter
            Infoxp ici depuis 2007
              16 juin 2018 à 11:50:00

              Ok merci @infoxp je vais me concentrer sur ta deuxième proposition sachant que sur le site l'utilisateur est obligé de se connecter pour commander.
              • Partager sur Facebook
              • Partager sur Twitter
                16 juin 2018 à 14:00:22

                Comme sur la plupart mais pour faire un panier tu peut le faire en anonyme ;)
                • Partager sur Facebook
                • Partager sur Twitter
                Infoxp ici depuis 2007
                  19 juin 2018 à 11:41:53

                  J'ai remanié mon controller et associé mes fonctions seulement à l'id_client pour que ce soit plus simple.

                  Mais je bloque sur qqch. Dans ce cas là , l'utilisateur peut update sa commande(table commande) et ses produits(table commande_produits) si il a déjà une commande en cours(comme çà il peut modifier sa commande si il revient sur les pages précédentes).

                  Mais comme sa commande est uniquement liée à l'id_client(id de session) quand il fera à nouveau une commande cela va update sa dernière commande...Comment faire pour qu'à sa prochaine commande, une nouvelle commande s'enregistre?

                  Voici mon controller :

                  $app->post('/panier', function (Request $request) use ($app){
                  	$user = $app['session']->get('user');
                      $id_client = $user['userid'];
                  	
                      $userModel = new usersModels();           
                      $panier = $userModel-> recupCommandeProduits($app, $id_client);// fonction qui recup les infos de table commande_produits
                  	$recupcomm = $userModel-> recupCommande($app, $id_client);// fonction qui récupère les infos de table commande
                  	
                   	$produitsModel = new produitsModels();
                      $MVe_liquides = $produitsModel -> getMVe_liquides($app);
                      $MVe_cigs = $produitsModel -> getMVe_cigs($app);
                      $MVaccessoires = $produitsModel -> getMVaccessoires($app);
                      $MVdiy = $produitsModel -> getMVdiy($app);
                      $MVexpert = $produitsModel -> getMVexpert($app);
                      $nouveautes = $produitsModel -> getNouveautes($app); 		
                                 
                   	// Si il y qqch dans les formulaires (infos produits)
                          if (isset($_POST)) {
                            
                              $nom = $_POST['nom_prod'];
                              $options = $_POST['options'];
                              $quantite = $_POST['quantite'];
                              $prix = $_POST['prix'];
                              $total = $_POST['total'];
                              $fraisdeport = $_POST['fraisdeport'];
                              $grandtotal = $_POST['grandtotal'];
                  
                          //Si l'utilisateur n'a pas de commande
                              if(empty($recupcomm)){
                              	$user = $app['session']->get('user');
                          		$id_client = $user['userid'];
                          	  		//on lui crée une commande
                              	$userModel = new usersModels();
                              	$ajoutcomm = $userModel->ajoutCommande($app, $id_client);//ajoute une commande dans table commande
                  
                  	          // SI 'utilisateur n'a pas de panier  
                              	if (empty($panier)) 
                              		{ 
                              			$user = $app['session']->get('user');
                          				$id_client = $user['userid'];
                                  	  $userModel = new usersModels();
                                     // on lui crée un panier
                                  	  $ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_client, $_POST);// ajoute les produits dans commande_produits
                                  	 
                                  	
                                  	  return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'), 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcomm' => $ajoutcomm, 'ajoutcommprods' => $ajoutcommprods));               
                                  	
                          	  // Si l'utilisateur a déja un panier
                              	}
                              	else
                              	{
                              		$user = $app['session']->get('user');
                          			$id_client = $user['userid'];
                   				    
                   				  //on update le panier
                                       $userModel = new usersModels();
                                       $deletecommprods = $userModel->deleteCommandeProduits($app, $id_client);
                                       $ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_client, $_POST);
                                       
                  
                                      return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'), 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcomm' => $ajoutcomm,'ajoutcommprods' => $ajoutcommprods, 'deletecommprods' => $deletecommprods ));
                   
                              			}
                          //Si l'utilisateur a déja une commande
                              }else{
                                  $user = $app['session']->get('user');
                                          $id_client = $user['userid'];
                              	$userModel = new usersModels();
                              	$updatecomm = $userModel->updateCommande($app, $id_client);//met à jour la commande dans commande
                  
                              	//Si l'utilisateur n'a pas de panier
                              		if (empty($panier)) { 
                              		$user = $app['session']->get('user');
                          				$id_client = $user['userid'];
                              		// on lui crée un panier
                                  	$userModel = new usersModels();
                                  	
                                  	$ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_client, $_POST);// ajoute produits dans commande_produits
                                  	
                  
                                  	return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'), 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'ajoutcommprods' => $ajoutcommprods));
                                  	
                          		// Si l'utilisateur a déja un panier	
                              	 }
                              	 else
                              	 {
                   				  // on met à jour le panier
                              	 	$user = $app['session']->get('user');
                          				$id_client = $user['userid'];
                                  	$userModel = new usersModels();
                                  	$userModel->deleteCommandeProduits($app, $id_client);
                                  	$ajoutcommprods = $userModel->ajoutCommandeProduits($app, $id_client, $_POST);
                  
                                   return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'), 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm));
                   
                              			}
                  
                              }
                   	// Si il n'y a rien dans les formulaires (infos produits)
                          }else{
                          	// pas encore fait
                  
                          }
                   
                      return $app['twig']->render('commande.html.twig', array('userSession' => $app['session']->get('user'),'panier' => $panier, 'MVe_liquides'=> $MVe_liquides, 'MVe_cigs'=> $MVe_cigs, 'MVaccessoires'=> $MVaccessoires, 'MVdiy'=> $MVdiy, 'MVexpert'=> $MVexpert, 'nouveautes'=> $nouveautes,'panier' => $panier,'recupcomm' => $recupcomm, 'updatecomm' => $updatecomm ));
                   
                  })
                      ->bind('panier_check')
                  ;



                  • Partager sur Facebook
                  • Partager sur Twitter

                  Controller commande de produits

                  × 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