Bonjour à tous,
voilà en gros mon soucis: j'ai une page d'index qui m'affiche dans un tableau tous les champs d'une entité dans ma base. Dans ce tableau, ce trouve un bouton edit qui me récupère le champ spécifique (ici le nom), pour ensuite le modifier dans un formulaire. Une fois le formulaire remplit, je le valide et normalement le nom doit être modifié.
Voici le code de cette vue (template Twig):
Voici la route pour cette vue:
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 <div class="table"> <table class="table table-hover"> <thead> <tr> <th>Ref/id</th> <th>Parc's name</th> <th>property's number</th> <th>Buildings number</th> <th></th> </tr> </thead> <tbody> {% for parcsproperty in parc %} <tr> <td>{{ parcsproperty.id }}</td> <td>{{ parcsproperty.nom }}</td> <td>{{ parcsproperty.ecnt }}</td> <td>{{ parcsproperty.bcnt }}</td> <td><a href="{{ path('editParcs', {'name': parcsproperty.name}) }}"><button class="btn btn-warning btn-xs">Edit</button></a></td> </tr> {% endfor %} </tbody> </table> </div>
ecnt et bcnt sont juste des alias que j'ai écrit pour faire un count en DQL, ce n'est pas très important ici mais voilà la requête présente dans le controleur de cet vue si vous le souhaitez:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 manage_parcs: path: /manageparcs defaults: { _controller: MySpaceMyBundleBundle:MyController:indexParcs } requirements: methods: GET
Maintenant, voici le code de mon entité concerné:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $query = $em->createQuery('SELECT p.id, p.nom, count(distinct b.id) AS bcnt, count(distinct e.id) AS ecnt FROM MySpaceDatabaseBundle:Parcsproperty p LEFT OUTER JOIN MySpaceDatabaseBundle:Properties e WITH p.id = e.parcsproperty LEFT OUTER JOIN MySpaceDatabaseBundle:Buildings b WITH e.id = b.ensembles GROUP BY p.id');
Comme vous avez pu le voir dans ma première vue (index avec le tableau), j'ai un bouton edit, qui renvoit sur un formulaire en GET, voici son code:
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 use Doctrine\ORM\Mapping as ORM; /** * Parcsproperty * * @ORM\Table(name="parcsproperty") * @ORM\Entity */ class Parcsproperty { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=150, nullable=false) */ private $name; //Continue to //The getters and the setters and the FK
et la route le correspondant (affichage du form en GET, puis une fois validation envoi des données en POST):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <form action="{{ path('editParcs_process', {'name': name}) }}" method="POST"> <div> {{ form_label(form.name, "Change the name's parc", {'label_attr': {'class': 'control-label'}}) }} <div> {{ form_widget(form.name, {'attr': {'class': 'form-control'}}) }} </div> </div> <input type="submit" value="Edit" class="btn btn-success"/> </form>
Mon controller concernant cette action, donc cette vu est celui ci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 editParcs: path: /manageparcs/edit/{name} defaults: { _controller: MySpaceMyBundleBundle:MyController:editAdd } requirements: methods: GET editParcs_process: path: /manageparcs/edit/process/{name} defaults: { _controller: MySpaceMyBundleBundle:MyController:editAdd } requirements: methods: POST
Comme vous pouvez le constatez, cette métode du controller editAddAction($nom) {} permet à l'utilisateur de modifier le nom d'un parc selectionné, et si le parc n'existe pas, d'en ajouter/créer un nouveau (bon je suis d'accord, je vais devoir optimiser mon code mieux que ça).
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 public function editAddAction($name) { $message=""; $em = $this->getDoctrine()->getManager(); $form = $this->createForm(new ParcspropertyType()); $parc = $em->getRepository('MySpaceDatabaseBundle:Parcsproperty')->findAll(); if (isset($name)) { $parc = $em->getRepository('MySpaceDatabaseBundle:Parcsproperty')->find($name); if (!$parc) { $message='no parcs found'; } } else { // add one $parc = new Parcspropertyr(); } $request = $this->get('request'); if ($request->isMethod('POST') | ($form->isValid())) { $form->bind($request); $parc = $form->getData(); $parc -> setNom($nom); $em->flush(); return $this->redirect($this->generateUrl('manage_parcs')); } else { return $this->render('MySpaceMyBundle:MyFolder:editParcs.html.twig', array('form' => $form->createView(), 'parc' => $parc, 'name' => $name)); } }
Toutefois, mon réel problème concernant mon code est celui-ci: symfony me génère aucune erreur mais n'effectue pas l'update. Pourtant dans mon url, concernant mes route, j'ai bien le paramètre en plus affiché {name} comme ceci par exemplelocalhost/MyFolder/MySpace/..//manageparcs/edit/nameOfMySelectedparc.
Je vous avouerai être un peu perdu là.
Est ce je m'y prends bien pour l'update? Pourquoi ça ne fonctionne pas?
(à ce titre, j'ai posté ce problème sur stackoverflow ici si vous préférez)
Bien à vous
Partager