Bonjour, je travaille sur Symfony2.7 un projet e-commerce, dans la partie détails d'un produit j'ai récupérer tout les données liées à cette article avec une liste des couleurs et une liste des tailles disponibles d'un article (chaque liste dans un select) . mon problème est de : 1- récupérer la couleur et la taille sélectionnées par l'utilisateur 2- les envoyer en url pr exemple à la page panier (ou il existe les différents articles ajoutés) .
Ne serait il pas plus simple de faire un formulaire comme dans le cours ? Bien que basique tu pourrais faire tout ce dont tu souhaite en suivant les différentes façons de personnaliser ses formulaires. Utilise les formtype de symfony ça t'éviterai de devoir utiliser plusieurs fois {% for %} dans ton twig. Tu devras modifier ton controller pour aller ton Formtype. Je connais pas ton niveau en symfony mais je crois en toi ça devrait pas te prendre trop de temps à modifier .
Merci OkazakiUshio , En fait les {% for %} c'est pour récupérer les couleurs disponibles de l'article (déja dans ma BD, ajoutés lors de la création d'un article) et déja j'utilise les formtype de symfony :
y'a pas une autre méthode pour lister les couleurs et que l'utilisateur choisit puis au niveau de l'ajout au panier je veux juste mentionner la couleur (idm taille) dans mon panier !
Donc la c'est au niveau de ton controller il faut persister tes données ce que je ne vois pas dans ton controller(à moins que tu l'es pas montrer). De plus ce que tu vas envoyé ne passera pas dans l'url mais bien dans le formtype mais tu dois créer une vue pour lui dans ton controller ce que tu ne fais pas.
ça donne un truc qui pour toi ferai:
return $this->render('TonBundle:Produit:produit.html.twig',array(
'formProduit'=>$formProduit->createView()
));
// il faut appeler ton formulaire dans ton controller et //le persister pour qu'il soit effectif
ok, je vais bien vérifier ce cours, une petite chose c'est dans le select : comment puis je récupérer la couleur et la taille choisit par l'utilisateur
j'ai utilisé un script
<script>
function myFunction() {
var x = document.getElementById("co").value;
document.getElementById("demo").innerHTML = x;
}
</script>
mais par contre j'ai un probleme d'extraire le résultat de ce script pour le mettre dans une variable ou le récupérer !
tu peux faire ça directement avec les fonctionnalités de symfony il suffit d'appelé les couleurs et les tailles depuis une entité, les mettre dans un formtype, puis appelé le formtype (et pas l'entité ) dans ton twig. Tu peux ensuite choisir comment l'utilisateur va les voir et les données seront récupérer automatiquement lorsque l'utilisateur validera. Bon ça c'est pas dans le cours OC et je sais plus où j'ai trouvé comment faire.
mais par contre dans le controleur, j'arrive pas à récupérer la couleur choisi ?
public function ajouterAction($id)
{
$session = $this->getRequest()->getSession();
if (!$session->has('panier')) $session->set('panier',array());
$panier = $session->get('panier');
if (array_key_exists($id, $panier)) {
if ($this->getRequest()->query->get('qte') != null) $panier[$id] = $this->getRequest()->query->get('qte');
$this->get('session')->getFlashBag()->add('success','Quantité modifié avec succès');
} else {
if ($this->getRequest()->query->get('qte') != null)
$panier[$id] = $this->getRequest()->query->get('qte');
else
$panier[$id] = 1;
$this->get('session')->getFlashBag()->add('success','Article ajouté avec succès');
}
$session->set('panier',$panier);
return $this->redirect($this->generateUrl('panier'));
}
Ici j'ai bien mon id du produit récupéré( quand je fais le var_dump($panier[$id]) j'ai bien mon produit), et je veux ajouter à ma session (panier) un autre attribut couleur pour l'utiliser aprés.
resultat du dump : [ idproduit => 1] (1 c'est la quantité récupérer par $panier[$id] = $this->getRequest()->query->get('qte'))
il me faut dans le panier :
[ idproduit => 1]
[ idproduit => rouge(pr exp)]
j'ai tenté $this->getRequest()->query->get('co') mais null .
Aussi comme je l'ai dit dans ton controller tu ne persiste pas ton formulaire à la validation ce qui fait que rien n'est envoyé dans ton panier.
c'est une fonction qui s’utiliserait comme ça
$produit = new Produit(); // tu initialises un produit vide
$formProduit = $this->createForm(new ProduitType(), $produit); // tu appelles ton formulaire
if($formProduit->handleRequest($request)->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($produit);// el famoso persist !!
$em->flush();
$valide = true;
}// avec le if tu vérifie et valide ton formulaire
c'est un exemple mais après pour l'ajouter à ton panier tu pourrais faire appel à un formulaire de produit valider depuis un autre controller que tu appellerais "panier" par exemple.
Je pense que le fait que tu fasse l'ajout du produit directement dans le panier dans le controller du produit fait qu'il galère un peu. Si toutefois tu préfère continuer avec cette méthode un try catch serait sans doute plus simple à utiliser.
Je pense qu'il y a un Malentendu ce sont pas des champs que je remplis (nom, marque, taille, couleur ...) ce sont les caractéristiques du produits qui sont stocké déjà dans ma BD .. avec plusieurs couleur , et plusieurs taille. mon problème est un probleme de session , comment puis-je inserer le choix de l'internaute dans la session pour le récupérer aprés !
Pourquoi Symfony 2.7 ? Tu récupères un projet existant ?
Dans ton cas, tu pourrais vraiment te simplifier les choses en utilisant les formulaires de Symfony. Par exemple, pour la liste des couleurs d'un produit, tu peux utiliser un ChoiceType ou un EntityType (selon comment sont enregistrées tes couleurs en base de donnée).
Quand le formulaire est envoyé (pour ajout au panier) tu récupères dans le controller les informations de ton article dans des variables, puis tu passes ces variables à la vue du panier (il n'y a pas de persistance en base de donnée à cette étape). L'avantage d'un formulaire entièrement géré par symfony, c'est que tu es sûr de retrouver facilement tes informations, que les champs soit des <input> ou des <select>. Il suffit de lui dire quels champs tu veux dans ton formulaire au départ, et il se charge de toute la logistique sous-jacente.
Si c'est possible, je te conseille de passer à la version 3.4 de Symfony, beaucoup de choses ont changé depuis la 2.x. La 4.1 vient de sortir, mais mieux vaut attendre un peu pour l'utiliser...
@usherach mais si j'avais compris que tu voulais faire ça ^^. @HarvestR c'est exactement ce que j'essaie de lui expliquer mais j'ai beaucoup de mal à me faire comprendre :/. Ce que je t'avais montrer aurait justement permis à l'utilisateur de sélectionner uniquement les couleurs ou autre information dans ta BD. Ça t'aurais évité d'avoir à refaire ton formulaire à chaque fois si tu venais à ajouter ou retirer des informations dans un de tes formulaires. Normalement si le premier formulaire est valider tu peux l'appelé dans ton panier sans passer par l'ID mais en récupérant l'entité que l'utilisateur aura créer en validant le formulaire.
@HarvesR, Pour le 2.7 : oui disant j'ai un projet existant et j'ai fais des modifications.
Dés le début j'ai voulu ajouter à un produit plusieurs couleurs et plusieurs tailles c'est pour ça que j'ai fais les relations manytoone et manytomany entre l'entité produit d'un côté et les entités couleur et taille d'autre côté, du coup dans le formtype du produit j'ai :
j’étais en train d'envoyer mon formulaire deux fois (une dans l'action du form et l'autre dans le boutton ) :/ c'est pour ça que j'avais toujours le null.
sauf que maintenant et quand je fais un var_dump du panier j'ai 3 données dans mon panier :
array(size=3)
3 =>
int 1
'co' =>string 'rose' (length=4)
'ta' =>string '10' (length=2)
ce qui cause un problème au niveau du calcul de nbr d'articles dans mon panier (quand j'ajoute un produit : il m'affiche 3 comme nbr d'article alors que j'ai qu'un seul produit)
public function ajouterAction($id) {
$session = $this->getRequest()->getSession();
if (!$session->has('panier'));
$panier = $session->get('panier', array());
if (array_key_exists($id, $panier)) {
if ($this->getRequest()->query->get('qte') != null){
$panier[$id]['qte'] = $this->getRequest()->query->get('qte');
}} else {
$panier[$id] = array('qte'=>1,
'co'=>$this->getRequest()->query->get('co'),
'ta'=>$this->getRequest()->query->get('ta'));
$this->get('session')->getFlashBag()->add('success', 'Article ajouté avec succès');
}
$session->set('panier',$panier);
return $this->redirect($this->generateUrl('panier'));
}
Récuperation de la valeur d'un select
× 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.
Tester c'est douter
Tester c'est douter
Tester c'est douter
Tester c'est douter
Tester c'est douter
Tester c'est douter
Tester c'est douter
Tester c'est douter