Hello !
Je sèche sur un soucis de formulaires sous Symfony 2... je pense que ma logique n'est pas la bonne alors je vais vous présenter le soucis de la façon la plus exhaustive possible :
Je bosse sur une galerie photo. Il y a donc des entités Image et des entités Galerie (Galerie OneToMany Image).
Dans mon panneau d'administration, j'ai une vue qui affiche la liste des images présentent dans la galerie avec sous chacune d'elles, un formulaire pour update l'image. Puis en bas de cette vue, j'ai un formulaire pour créer une nouvelle image.
Présentement, le formulaire pour créer fonctionne. Mais le formulaire pour mettre à jour ne fonctionne pas. La page est rechargée mais les données ne sont pas persistées. Pourtant, il y a bien eu une requête POST avec les bonnes datas (vérifié dans le Profiler de SF2)...
Voici la partie de la vue qui nous intéresse ici :
Route de cette vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <div class="thumbnails"> {% for i in images %} {% render controller ('MoonkeyGalleryBundle:Admin:adminUpdateImage', { 'id' : i.getId }) %} {% endfor %} </div> <div style="clear: both;"></div> <h3>Ajouter une nouvelle image :</h3> <form method="post" {{ form_enctype(form_create) }}> {{ form_widget(form_create) }} {{ form_errors(form_create) }} </form>
Méthode de cette vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 moonkey_admin_galerie: path: /galerie/{slug} defaults: { _controller: MoonkeyGalleryBundle:Admin:adminGalerie }
Alors, comme vous l'avez vu, dans le template j'appelle avec une boucle {% for %} une autre méthode de mon controller, qui lui, rend une vue avec toutes les images de la galerie ainsi que mon formulaire de update à chaque fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public function adminGalerieAction($slug) { $repo = $this->repoGalerie(); //méthode perso pour récupérer le repository de mon entité Galerie $galerie = $repo->getGalleryBySlug($slug); $idGalery = $galerie->getId(); $images = $galerie->getImages(); if($galerie == null){ throw $this->createNotFoundException("Galerie inexistante"); } elseif ($images == null){ throw $this->createNotFoundException("Aucune image dans la galerie"); } // préparation de ma nouvelle image pour le formulaire de création $imageCreate = new Image; $imageCreate->setImagePath('path'); //pour tester $imageCreate->setGalerieId($galerie); $formCreate = $this->createForm(new CreateImageType, $imageCreate); $request = $this->get('request'); if($this->getRequest()->request->has("create_image")) { if ($request->getMethod() == 'POST') { $formCreate->handleRequest($request); if ($formCreate->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($imageCreate); $em->flush(); } } } return $this->render("MoonkeyGalleryBundle:Admin:admin_galerie.html.twig", array( 'slug' => $slug, 'images' => $images, 'galerie' => $galerie, 'form_create' => $formCreate->createView() )); }
Voici la méthode pour l'update :
Voici le template associé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public function adminUpdateImageAction($id){ $em = $this->getDoctrine()->getManager(); $repository = $em->getRepository('MoonkeyGalleryBundle:Image'); $image = $repository->find($id); if (!$image) { throw $this->createNotFoundException( 'No news found for id ' . $id ); } $form = $this->createForm(new ImageType, $image); $form->add('id', 'hidden', array('data' => $id )); $request = $this->get('request'); if($this->getRequest()->request->has('update_image')) { if ($request->getMethod() == 'POST') { $form->submit($request); if ($form->isValid()) { $em->flush(); } } } return $this->render('MoonkeyGalleryBundle:Admin:admin_galerie_update_image.html.twig', array( 'form' => $form->createView(), 'image' => $image, 'id' => $id )); }
J'ai tenté de virer le if (isValid()) ainsi que le if (request = POST) mais ça ne change rien. Je n'ai aucune erreur en sortie, ni pour mon formulaire ni pour les enfants... J'ai aussi tenté le classique handleRequest au lieu du submit(), rien n'y fait... J'ai aussi dans mon formType un champs hidden avec l'id de l'image... mais toujours rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <div class="thumbnails update"> <a class="galerie" title="{{ image.getImageNom }}" href="{{ asset(image.getImagePath~image.getImageTitre~".jpg") }}"> <img class="thumb" alt="{{ image.getImageNom }}" title="{{ image.getImageNom }}" src="{{ asset(image.getImagePath~image.getImageTitre~".jpg") }}"/> </a> <form method="post" action="" {{ form_enctype(form) }}> {{ form_widget(form) }} {{ form_errors(form) }} </form> </div>
Dans le Profiler, j'ai donc bien une request d'envoyée mais aucune query UPDATE générée.
Je pense que ça vient du fait que l'action de mon formulaire d'update n'étant pas défini, c'est la route de mon template général qui est pris en compte. Alors dans mon formulaire d'update, j'y mettrai bien un action="path{'nom_de_route'}" mais je vois mal comment faire sans casser tout ce que j'ai mis en place jusque là...
Avez-vous une idée pour m'aiguiller ?
Dim
Partager