Bonjour,
Je suis la formation 'creation d'un e-commerce' de devandclcik avec symfony 3.3.8.J'ai un soucis avec le panier, lorsque je modifie la quantité du premier produit la mise à jour en session ne se fait pas car l'id produit n'est pas transmit à la route.
url est : /panier?qte=4 au lieu de /69?qte=4
Et cela quelque que soit le produit en première ligne.Pourtant l'id du produit est bien affiché pour chaque produit.
Voici mon panier.html.twig
{% for produit in produits %}
<tr>
<form action="{{ path('ajouter', { 'id' : produit.id }) }}" method="get">
<td>{{ produit.nom~' '~produit.id }}</td>
<td>
<select name="qte" class="span1" onChange="this.form.submit()">
{% for i in 1..10 %}
<option value="{{ i }}" {% if i == panier[produit.id] %} selected="selected"{% endif %}>{{ i }}</option>
{% endfor %}
</select>
<a href="{{ path('supprimer',{'id' : produit.id}) }}"><i class="icon-trash"></i></a>
</td>
<td>{{ produit.prix }} €</td>
<td>{{ produit.prix * panier[produit.id] }} €</td>
</form>
</tr>
{% endfor %}
mon controller ajouterAction:
public function ajouterAction($id, Request $request)
{
$session = $request->getSession();
//$panier[id produit] => Quantité
if (!$session->has('panier')) $session->set('panier', array());
$panier = $session->get('panier');
// le produit est déja dans le panier
if (array_key_exists($id, $panier)) {
//on modifie la quantité
if ($request->query->get('qte') != null) $panier[$id] = $request->query->get('qte');
} else {
// on ajoute la quantité
if ($request->query->get('qte') != null) {
$panier[$id] = $request->query->get('qte');
} else {
$panier[$id] = 1;
}
}
$session->set('panier', $panier);
return $this->redirect($this->generateUrl('fred_ecommerce_panier'));
}
et mon indexAction
public function indexAction(Request $request)
{
$session = $request->getSession();
//$session->remove('panier');
var_dump($session->get('panier'));
//die();
if (!$session->has('panier')) $session->set('panier', array());
$em = $this->getDoctrine()->getManager();
$produits = $em->getRepository('FredEcommerceBundle:Produit')->findArray(array_keys($session->get('panier')));
return $this->render('FredEcommerceBundle:Default:panier.html.twig', array('produits' => $produits, 'panier' => $session->get('panier')));
}
si vous voyez une erreur dans mon code, merci de m'aiguiller, je débute sur symfony.
Par définition une session, tu n'as pas besoin de passer ton panier dans la vue. Il est automatiquement passé.
Il faut utiliser app.session.get('panier').
De plus, sous symfony au lieu de te casser la tête avec un var_dump. Il existe une méthode DUMP qui fait le job.
Quand tu dump depuis la controller, en bas du profiler tu as un rond avec une croix comme une cible pour afficher le dump, depuis la vue, {{ dump(app.session.get(''panier)) }} affiche directementle dump sur la page.
Il est vrai que d'utiliser cette longue variable peut être pénible. Mais avec twig tu peux faire ceci..
{% set panier = app.session.get('panier') %} {# ici, tu créer une nouvelle variable panier dans laquelle tu lui stock le panier #}
Merci pour l'info, j'ai fait la modif pour le dump et j'accède directement à la session dans la vue sans passer par le controleur. Par contre j'ai toujours le même soucis, à savoir que lorsque je modifie la quantité du premier produit , l'id produit n'est pas transmit et cela quelque soit le premier produit=>donc impossible de modifier la quantité de ce produit.
Bonjour,
dans le controlleur, quand tu fais un dump de l'id, tu as quoi dedans, du vide, ou autre chose ?
ajouterAction($id, Request $request)
Il me semblait que l'ordre des arguments a son importance, à savoir l'objet request en premier)
Bonjour 00xFox ,
en fait ajouterAction( Request $request, $id) n'est pas appelé si je modifie la quantité du premier produit l'url à la soumission du formulaire est:
"http://ecommerce.app/panier?qte=4"
et si je modifie celle du second produit
"http://ecommerce.app/ajouter/71?qte=5"
Pourquoi alors que j'utilise exactement le même formulaire pour chaque produit l'url est elle différente sur le premier produit ?
L'id du produit est bien présent car je peux supprimer la ligne du panier.