[Symfony2] update des champs dans mon entité avec editAddAction() de mon controller ne fonctionne pas
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):
Code:
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> |
Voici la route pour cette vue:
Code:
1 2 3 4 5
| manage_parcs:
path: /manageparcs
defaults: { _controller: MySpaceMyBundleBundle:MyController:indexParcs }
requirements:
methods: GET |
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:
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'); |
Maintenant, voici le code de mon entité concerné:
Code:
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 |
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:
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> |
et la route le correspondant (affichage du form en GET, puis une fois validation envoi des données en POST):
Code:
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 |
Mon controller concernant cette action, donc cette vu est celui ci:
Code:
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));
}
} |
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).
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 ;)