Validation d'un formulaire sous Symfony

Par just_real, il y a 5 ans


Bonjour,

Je récupère des données soumises par 'un formulaire sur une page qui s'occupe de les lister sous forme de tableau HTML simple, et je souhaites avoir la possibilité de modifier le statut de ces soumissions via un bouton "valider" présent sur chacune des lignes du tableau. (status passe de l'état 1 à 2 en BDD)

J'utilise pour cela le code suivant sur le controller et le fichier twig :

CONTROLLER :

/** * @Route("/Test/edit/{to}", name="app_change") */ public function update(string $to,Request $request, EntityManagerInterface $entityManager) { $modifstatus = $this->getDoctrine()->getRepository(Test::class)->findOneBy([ 'status' => '1']); $modifstatus->setStatus ($to); $entityManager->flush(); return $this->redirectToRoute('test_liste'); }

TWIG (je ne laisse que le TD qui pose problème le reste c'est juste un tableau qui liste de la récupération de data du formulaire :

{% for test in listTest %} <tr> <td>Data</td> <td>Data</td> <td>Data</td> <td class='has-text-centered is-vcentered'> <a type="button" class="btn btn-primary btn-xs " href= "{{ path('app_change', {'status': test.status, 'to': '2'}) }}">Valider</a> </td> </tr> {% endfor %}

Ce que je veux

Changer le statut et donc valider une ligne spécifique du formulaire via la liste en cliquant sur valider .

Ce que j'obtiens

Lorsque j'ai par exemple 5 ou 6 lignes de formulaires dans le tableau , lorsque je clique sur valider, cela valide la première ligne du tableau et non pas la ligne sur laquelle j'ai cliquer sur le bouton valider.

Thank's

11 réponses

lhapaipai, il y a 5 ans

Salut je ne suis pas sûr d'avoir tout suivi mais d'après ce que je vois la route "app_change" sait dans quel état mettre ton item mais ne sait pas lequel. il n'y aurait pas quelque chose comme ça à faire

/** * @Route("/Test/edit/{id}/{to}", name="app_change") */ public function update(string $to,Request $request, EntityManagerInterface $entityManager) { $modifstatus = $this->getDoctrine()->getRepository(Test::class)->findOneBy([ 'id' => $id]); $modifstatus->setStatus ($to); $entityManager->flush(); return $this->redirectToRoute('test_liste'); } {% for test in listTest %} <tr> <td>Data</td> <td>Data</td> <td>Data</td> <td class='has-text-centered is-vcentered'> <a type="button" class="btn btn-primary btn-xs " href= "{{ path('app_change', {'id': test.id, 'to': '2'}) }}">Valider</a> </td> </tr> {% endfor %}
just_real, il y a 5 ans

en fait le nom du champs en BDD est bien status du coup si je fais ça ce serait pour changer l'ID non ?

dans l'entitée concernée j'ai ça concernant le status :

const STATUT_DEMANDE_EN_COURS = 1; const STATUT_DEMANDE_VALIDEE = 2; const STATUT_DEMANDE_REFUSEE = 3; private $status = []; public const StatusTestTranslation = [ 1 => 'Demande en cours de traitement', 2 => 'Demande validée', 3 => 'Demande refusée' ]; public function setStatus(string $status): self { $this->status = $status; return $this; }

en gros le problème est que dans le tableau HTML, il va piocher la première ligne (td) qu'il trouve avec le statut "1" et la valider alors que je clique par exemple sur la 6ème ou 7ème ligne.

C'est lié au fait que je ne filtre que via le ->findOneBy([ 'status' => '1']); mais je ne trouve pas la soluce hélas

lhapaipai, il y a 5 ans

as tu essayé ce que je t'ai proposé ?
ce que tu me décris c'est le code que tu as écrit, mais pas ce que je te propose :-)

just_real, il y a 5 ans

Effectivement sorry :) je viens d'essayer , ça me donne :

No route found for "GET /Test/edit/2" (from "http://localhost/test_liste")

lhapaipai, il y a 5 ans

oui il faut que tu réactualises ta page de liste pour ensuite suivre un bon lien car les liens sont maintenant de la forme /test/edit/:id/:status .

lhapaipai, il y a 5 ans

tu as du probablement cliquer sur actualiser alors que tu venais de changer la route qui redirigeait vers la méthode update

just_real, il y a 5 ans

oui c'est bien ça, par contre du coup là il m'indique que la variable Id n'est pas définie , pourtant l'ID remonte bien dans l'URL : http://localhost/Test/edit/14/2

Warning: Undefined variable $id

just_real, il y a 5 ans

l'erreur pointe sur cette ligne
$modifstatus = $this->getDoctrine()->getRepository(Test::class)->findOneBy(['id' => $id]);

lhapaipai, il y a 5 ans

ah oui j'ai oublié de le mettre dans la méthode
public function update(string $to, $id, Request $request, EntityManagerInterface $entityManager)

just_real, il y a 5 ans

Oh punaise ça marche !!!!!!!!

Un énorme merci à toi lhapaipai !!!!

lhapaipai, il y a 5 ans

:-) cool !!!!