Bonjour à tous.

Aujourd'hui j'ai pas mal galéré pour que dans une même page, j'ai accès à plusieurs méthodes POST (chacune ajoutant/modifiant/supprimant des tables différentes).

Premièrement je voulais savoir s'il était propre/possible de faire cela ? A savoir, faire appel à plusieurs méthodes POST dans une fonction d'un controlleur.

Si ça ne l'est pas, comment puis-je sur une même page avoir 3 formulaires utilisant la méthode POST?

Si ça l'est, comment s'y prendre pour que cela fonctionne comme il faut ? Actuellement, il y a des interférences entre mes diverses méthodes POST, et je m'arrange comme je peux à l'aide de conditions et d'une variable de session...

Merci de m'éclairer et, au besoin, je peux poster ma fonction de mon controlleur :)

3 réponses


Lartak
Réponse acceptée

Bonjour.
Il est tout à fait possible de faire pointer plusieurs formulaires sur la même fonction d'un controlleur.
À savoir si ça fera propre dans ton cas, il nous faudrait plus de précisions concernant le cas.
Pour ce qui est de différencier les différents formulaires au sein de la fonction, tu peux par exemple, créer un champ en hidden ayant le même nom dans chacun des formulaires (par exemple : method) et leur donner une valeur différente dans chaque formulaire et au niveau de la fonction du controller, faire quelque chose comme :

if ($this->request->is('post')) {
    $method = $this->request->data['method'];
    switch($method) {
        case "une_methode":
            /* code pour cette methode */
            break;
        case "une_autre_methode":
            /* code pour cette autre methode */
            break;
         /* etc ... */
    }
}
/* suite du code */
Marien
Auteur

Yop !

J'ai suivi ton idée et voilà le résultat :

        $user = $this->Objets->Users->newEntity();
        $objet = $this->Objets->get($arg);
        $client = $this->Objets->Clients->get($arg);

        if ($this->request->is(['post', 'put'])) {
            $method = $this->request->data['method'];

            switch($method){
                case "ajouter_user":
                    $user = $this->Objets->Users->patchEntity($user, $this->request->data);
                    if ($this->Objets->Users->save($user)) {
                        $this->Flash->success(__("L'utilisateur a été ajouté."));
                        return $this->redirect(['controller'=>'Objets','action' => 'fichePanne', $arg]);
                    }
                    $this->Flash->error(__("Impossible d'ajouter l'utilisateur."));
                    break;
                case "changer_objet":
                    $objet = $this->Objets->patchEntity($objet, $this->request->data);
                    if ($this->Objets->save($objet)) {
                        $this->Flash->success(__("L'objet a été modifié."));
                        return $this->redirect(['controller'=>'Objets', 'action'=>'fichePanne', $arg]);
                    }
                    $this->Flash->error(__("Impossible de modifier l'objet."));
                    break;
                case "supprimer_client":
                    $client = $this->Objets->Clients->patchEntity($client, $this->request->data);
                    if ($this->Objets->Clients->save($client)) {
                        $this->Flash->success(__("Le client a été supprimé."));
                        return $this->redirect(['controller'=>'Objets', 'action'=>'fichePanne', $arg]);
                    }
                    $this->Flash->error(__("Impossible de supprimer le client."));
                    break;                  
            }
        }
        $this->set('user', $user);  
        $this->set('objet', $objet);
        $this->set('client', $client);

Tout fonctionne comme il faut :D

Merci et à bientôt !

De rien, avec plaisir. :)