Bonsoir,

Je n 'arrive pas a soumettre un formulaire symfony 2 en ajax.Auriez vous une piste ?
Lorsque je le fait en POST normal j ai bien Form Data qui est renseigné dans la request mais en ajax Form Data n'existe pas .

12 réponses


romainfan
Réponse acceptée

Bonjour android38.
En lisant ton code, c'est tout à fait normal que seul le premier enregistrement soit modifié.
Lorsque tu soumets ton formulaire, regardons ce qui se passe dans ton controleur :

$balises = $em->getRepository('GeoGeoBundle:Balises')->getAllBalisesAvecParametre($user);

Tout d'abord, tu récupères toutes tes balises.
Ensuite, tu parcours toutes tes balises.
Lors du premier passage dans la boucle, tu instancies ton formulaire en donnant comme paramètre la première balise :

$form = $this->createForm(new BalisesType, $value, array('action' => $this->generateUrl('geo_voirBalises')));

(new BalisesType, $value)

Et ensuite, tu fais ton handlerequest pour founir à ton formulaire les données de la request (donc du formulaire). Cet handlerequest va donc faire tous les changements de données, à l'exception de l'ID, qui sera donc toujours celui de ton objet initial, soit ta première balise issue de la première boucle ! De ce fait, ta balise que tu as envoyée à ton createform va être altérée, et non l'objet que tu souhaites (l'objet avec l'ID xxx que tu voulais changer à la base).

Il faut donc que tu récupères avant tout le bon objet (avec le bon id) pour faire le createform et ensuite le handlerequest. Je te laisse regarder, il y a plusieurs solutions, les CRUD generators utilisent notamment la méthode GET.

android38
Auteur
Réponse acceptée

Bonjour romainfan,

Merci pour ta réponse, j'avais tellement le nez dans mon problème que je n'avais pas vu cette évidence ;).
J'ai résolu mon problème en appelant l'action de mon controller en lui passant l'ID de ma balise ensuite j'ai été récupérer les info concernant cet enregistrement et je l'ai soumis au formulaire.

Merci beaucoup à tous, je passe donc le sujet en résolu.

Merci c 'est gentil mais j ai déjà fais ces recherches.

Comment soumet tu le formulaire en Ajax ? avec une librairie spéciale ou tu envois les données à la main avec un $.post(...) ?

Bonjour Grafikart

                $.ajax({
                    type: $form.attr('method'),
                    url: $form.attr('action'),
                    data: values,
                    success: function (data) {
                       console.log(data);
                    }
                });

Le probleme n 'est pas la car je recois bien le formulaire maintenant mais c est lorsque je veux le lier à l entité rien ne se passe

je ne sais si tu connais ce site, mais il a fait une suite de tuto sur Symfony2 dont Comment utiliser Ajax avec symfony2.

Voici le lien EPISODE 33 - UTILISER L'AJAX AVEC SYMFONY2 PARTIE 1

j'espere que cela pourra t aider. Je suis en train de la suivre, il explique plutot bien les choses

Bonjour mikachu,

Oui je connais ce site mais dans la video il explique comment relier un champ en ajax mais moi je veux soumettre tout un formulaire en ajax

Oki. je ne suis pas encore arrivé a cette partie, je pensais que cela aurait pu aider. dsl

C'est sympas d'essayer merci. Et joyeuse fête.

Dans ton appel ajax values à la même structure que les valeur (name) des champs ?

J'ai un peu pres trouvé pour l ajax le seule problème c est que mon controleur envoie plusieur formulaire dans ma vue et lorsque je valide n importe quel formulaire c 'est toujours l enregistrement 1 de la base de donnée qui est modifié . Quelqu 'un a une idée ?

ci-dessous le code de mon controller

public function voirAction(Request $request) {

        //$request = $this->getRequest();
        $em = $this->getDoctrine()->getManager();
        $recupForm = array();
        $user = $this->getUser()->getId();

        //$idParam = $request->request->get('idParam');

        $balises = $em->getRepository('GeoGeoBundle:Balises')->getAllBalisesAvecParametre($user);

        foreach ($balises->getResult() as $key => $value) {
            $form = $this->createForm(new BalisesType, $value, array('action' => $this->generateUrl('geo_voirBalises')));
            $recupForm[] = $form->createView();
            $form->handleRequest($request);

            if ($form->isValid()) {
                //$em->flush();
                ladybug_dump('ff');

                $em->flush();
            }
        }

        if ($request->isXmlHttpRequest()) {

            $json['balises'] = $balises->getArrayResult();
//            $json['balisesTwig'] = $this->renderView('GeoGeoBundle:Partials:listeBalises.html.twig', array("balises" => $balises,"form" =>$form->createView()));
            $json['balisesTwig'] = $this->renderView('GeoGeoBundle:Partials:listeBalises.html.twig', array('recupForm' => $recupForm, 'balises' => $balises->getResult()));

            $response = new Response(json_encode($json));

            return $response;
        } else {
            return $this->render('GeoGeoBundle:Partials:listeBalises.html.twig', array('recupForm' => $recupForm, 'balises' => $balises->getResult()));
        }
    }