formulaire Symfony 2 et ajax

Par android38, il y a 11 ans


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

android38, il y a 11 ans

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

Grafikart, il y a 11 ans

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

android38, il y a 11 ans

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

Mikachu, il y a 11 ans

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

android38, il y a 11 ans

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

Mikachu, il y a 11 ans

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

android38, il y a 11 ans

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

Grafikart, il y a 11 ans

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

android38, il y a 11 ans

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())); } }
romainfan, il y a 11 ans

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, il y a 11 ans

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.