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
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');
}
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 :)
Moi perso, j'envoye un objet JSON en string, puis je le parse en JSON dans mon controller.
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);
@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
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...
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 ?
Essaye de faire après faire c'est deux lignes:
print_r($var);
die;
Et colle moi ton tableau
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');
}
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.
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
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