récuperation valeur request

Par med001, il y a 9 ans


Salut, j'ai envoyée un tableau d'objet par ajax ,voici code:

function AjouterPhoto() { // la tu detecte ton dernier id mais tu sais aussi qu'il pars tjrs de 1 donc... var j = $('.trinfo').last().attr('id'); // data n'est plus un objet, mais un tableau d'objet var $data = []; for (var k=1; k<=j; k++){ $data.push({ 'nom': $('#nom'+k).val(), 'prenom':$('#prenom'+k).val(), 'age':$('#age'+k).val(), 'sexe':$('#sexe'+k).val() }); console.log($data); } $.ajax({ type: "POST", url: "{{path('add')}}", data: $data, success: function() { alert("valide"); } }); }

maintenant je peux récuperer les valeurs par symfony,voici code:

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $nom = $request->request->get('nom'); $prenom = $request->request->get('prenom'); $age = $request->request->get('age'); $class = $request->request->get('sexe'); $cop = new Apps(); if ($request->getMethod() == 'POST') { $cop->setAge($age); $cop->setNom($nom); $cop->setPrenom($prenom); $cop->setClass($class); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } return $this->render('TestBundle:Apps:form.html.twig'); }

mais les valeurs du variable $nom,$age,$prenom etc sont null et c'est logique car j'envoyée tableau d'objet et pas une seule objet , quelle est la solution pour récupérer un tableau en symfony

merci d'avance

17 réponses

med001, il y a 9 ans

avec ce code:

$em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $nom = $var['nom']; $prenom = $var['prenom']; $age = $var['age']; $class = $var['class']; $var = json_decode($request->request->get('$data'),true);

je trouve cette erreur:

Notice: Undefined variable: var

Mehdikacim, il y a 9 ans

Moi perso, j'envoye un objet JSON en string, puis je le parse en JSON dans mon controller.

Mehdikacim, il y a 9 ans

Donc là, ton tableau $data :

jsonString = JSON.stringify({data: $data});

Et après, au controller, tu le parse en objet.
Ainsi tu peux récupérer facilement tes données.

EN JSON OBJET => json_decode($request->request->get('$data'));
EN ARRAY => json_decode($request->request->get('$data'),true);

med001, il y a 9 ans

@MehdiKacim

voici code aprés modification:

code js:

function AjouterPhoto() { // la tu detecte ton dernier id mais tu sais aussi qu'il pars tjrs de 1 donc... var j = $('.trinfo').last().attr('id'); // data n'est plus un objet, mais un tableau d'objet var $data = []; for (var k=1; k<=j; k++){ $data.push({ 'nom': $('#nom'+k).val(), 'prenom':$('#prenom'+k).val(), 'age':$('#age'+k).val(), 'sexe':$('#sexe'+k).val() }); console.log($data); } jsonString = JSON.stringify({data: $data}); $.ajax({ type: "POST", url: "{{path('add')}}", data: jsonString, success: function() { alert("valide"); } }); }

code symfony:

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $nom = $request->request->get('nom'); $prenom = $request->request->get('prenom'); $age = $request->request->get('age'); $class = $request->request->get('sexe'); $var = json_decode($request->request->get('$data'),true); $cop = new Apps(); if ($request->getMethod() == 'POST') { $cop->setAge($var['age']); $cop->setNom($var['nom']); $cop->setPrenom($var['prenom']); $cop->setClass($var['class']); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } return $this->render('MedBundle:Apps:form.html.twig'); }

mais toujours la même probléme est que les valeur qui récupérer sont null

Mehdikacim, il y a 9 ans

C'est normal, tu post tes données mais impossible de la récupérer.
Je m'explique...

$.ajax({ type: "POST", url: "{{path('add')}}", data: jsonString, //Cette ligne success: function() { alert("valide"); } });

là où j'ai marque cette ligne, tu envoyes bien tes données mais elle ne sont pas récupérées car tu ne défini pas le non de la variable postée.

essaye :

$.ajax({ type: "POST", url: "{{path('add')}}", data: '$data='+jsonString, success: function() { alert("valide"); } });

Ici, tu remarques l'ajout de ceci: data: '$data='+jsonString,
Au niveau du controller, c'est avec ce non $data que au niveau du request $request->request->get('$data'); tu récupères la valeur. Mais l'idéale, renonnce cette variable pour enleve le $, j'ai peur d'un conflit après avec php...

Ceci sert donc plus à rien :

$nom = $request->request->get('nom'); $prenom = $request->request->get('prenom'); $age = $request->request->get('age'); $class = $request->request->get('sexe');

Et conne tu met en paramètre true, tu as un tableau.
essaye de faire après
$var = json_decode($request->request->get('$data'),true); ceci :

$nom = $var['nom']; //etc...
med001, il y a 9 ans

code js:

jsonString = JSON.stringify({data: $data}); $.ajax({ type: "POST", url: "{{path('add')}}", data: '$data='+jsonString, success: function() { alert("valide"); } });

code symfony:

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $var = json_decode($request->request->get('$data'),true); $nom = $var['nom']; $prenom = $var['prenom']; $age = $var['age']; $class = $var['class']; $cop = new Apps(); if ($request->getMethod() == 'POST') { $cop->setAge($age); $cop->setNom($nom); $cop->setPrenom($prenom); $cop->setClass($class); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } return $this->render('MedBundle:Apps:form.html.twig'); }

probléme:

quelle est la solution maintenant ?

Mehdikacim, il y a 9 ans

Essaye de faire après faire c'est deux lignes:

print_r($var);
die;
Et colle moi ton tableau

med001, il y a 9 ans

avec ce code il reste page blanc :

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $var = json_decode($request->request->get('$data'),true); $nom = $var['nom']; $prenom = $var['prenom']; $age = $var['age']; $class = $var['class']; $cop = new Apps(); if ($request->getMethod() == 'POST') { $cop->setAge($age); $cop->setNom($nom); $cop->setPrenom($prenom); $cop->setClass($class); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } print_r($var); die; return $this->render('MedBundle:Apps:form.html.twig'); }
Mehdikacim, il y a 9 ans

Après ceci....
$var = json_decode($request->request->get('$data'),true);

med001, il y a 9 ans

mon ami c'est la même ligne qui j'ajoute précédement dans mon action

Mehdikacim, il y a 9 ans

Non, car tu génères des erreurs justement :

$nom = $var['nom']; $prenom = $var['prenom']; $age = $var['age']; $class = $var['class'];

il faut mettre avant, ceci et après

$var = json_decode($request->request->get('$data'),true);

car au dessu $var est déclaré.
et le die; stop l'interprétation du code php, donc les erreurs juste en dessou sont pas là pour faire planter ton code.

Mehdikacim, il y a 9 ans

On essaye encore,
Copie et code ce code.

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); $var = json_decode($request->request->get('$data'),true); //C'était ici print_r($var); die; //Fin ici ... $nom = $var['nom']; $prenom = $var['prenom']; $age = $var['age']; $class = $var['class']; $cop = new Apps(); if ($request->getMethod() == 'POST') { $cop->setAge($age); $cop->setNom($nom); $cop->setPrenom($prenom); $cop->setClass($class); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } return $this->render('MedBundle:Apps:form.html.twig'); }
med001, il y a 9 ans

voici la réponse de var_dump($var);

Mehdikacim, il y a 9 ans

Fais un print_r plutôt voir si tout est bien renseigné

Mehdikacim, il y a 9 ans

Je réouvre ton sujet pour savoir où tu en es...

med001, il y a 9 ans

avec ce code la travaille fonctionne bien

code twig et ajax:

<!DOCTYPE> <html> <head> <title></title> <style> td { width:25px; height:25px; } </style> </head> <body> <table id="test" border="1"> <thead> <th>test1</th> <th>test2</th> <th>test3</th> <th>test4</th> <th id="plus">+</th> <th id="moins">-</th> </thead> <tbody id="tbody"> </tbody> </table> <button type="submit" onclick="AjouterPhoto();">Ajouter</button> <script src="https://code.jquery.com/jquery-3.1.1.js"></script> <script> $( document ).ready(function(i) { var i=0; $("#plus").click(function(){ i++; $("#test #tbody").append('<tr class="trinfo" id="'+i+'"><td ><input id="nom'+i+'" type="text" placeholder="nom"></td><td ><input type="text" id="prenom'+i+'" placeholder="prenom"></td><td colspan="2"><input id="age'+i+'" type="text" placeholder="age"></td><td colspan="2"><input type="text" id="sexe'+i+'" placeholder="sexe"></td>'); }); $("#moins").click(function(){ $("tr:last").remove(); if (i>=0) { i--;} }); }) function AjouterPhoto() { // la tu detecte ton dernier id mais tu sais aussi qu'il pars tjrs de 1 donc... var j = $('.trinfo').last().attr('id'); var data={}; for(var k=1;k<=j;k++) { data['nom'+k]= $('#nom'+k).val(), data['prenom'+k]=$('#prenom'+k).val(), data['age'+k]=$('#age'+k).val(), data['sexe'+k]=$('#sexe'+k).val() data['k']= k; } console.log(data); $.ajax({ type: "POST", url: "{{path('add')}}", data: data, success: function($data) { console.log("valide"); } }); } </script> </body> </html>

code controller:

public function addAction() { $em = $this->getDoctrine()->getManager(); $request = $this->getRequest(); if ($request->getMethod() == 'POST') { $x= $request->request->get('k'); var_dump($x); for( $i=1;$i<=$x;$i++){ $nom = $request->request->get('nom'.$i); $prenom = $request->request->get('prenom'.$i); $age = $request->request->get('age'.$i); $class = $request->request->get('sexe'.$i); var_dump($nom.' '.$prenom.' '.$age.' '.$class); $cop = new Apps(); $cop->setAge($age); $cop->setNom($nom); $cop->setPrenom($prenom); $cop->setClass($class); $cop->setPath("path test"); $em->persist($cop); $em->flush(); } } //end for return $this->render('MedBundle:Apps:form.html.twig'); }

merci mon ami

Mehdikacim, il y a 9 ans

N'oublie pas de marque ce sujet comme lu en cliquant sur ce poste m'a aidé.
Et tu oeux supprimer les console.log et var_dump :)