Partage

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

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
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

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.

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

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

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.
16 juin 2018 à 14:00:22

Comme sur la plupart mais pour faire un panier tu peut le faire en anonyme ;)
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')
;



Controller commande de produits

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown