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


Mehdikacim
Réponse acceptée

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');

        }
Mehdikacim
Réponse acceptée

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);

med001
Auteur

@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...
med001
Auteur

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

med001
Auteur

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');

        }

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

med001
Auteur

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

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.

med001
Auteur

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

med001
Auteur

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

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

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

med001
Auteur

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