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
Réponse acceptée

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
Auteur
Réponse acceptée

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
Réponse acceptée

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
Auteur
Réponse acceptée

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

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

lhapaipai
Réponse acceptée

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
Réponse acceptée

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

just_real
Auteur
Réponse acceptée

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
Auteur
Réponse acceptée

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

lhapaipai
Réponse acceptée

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

just_real
Auteur
Réponse acceptée

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

Un énorme merci à toi lhapaipai !!!!

lhapaipai
Réponse acceptée

:-) cool !!!!