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 : 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>
Voici la route pour cette vue:
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
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
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 : 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
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
<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 : 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
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
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