Contrôleur : une seule action pour l’ajout et la modification
Un Contrôleur contient typiquement les actions classiques pour l’ajout, la modification, la suppression et la lecture d’un enregistrement. Il nous apparaît inutile de faire deux actions différentes pour l’ajout et la modification d’un enregistrement. Cela oblige à faire deux vues, alors qu’une seule suffit : soit nous affichons un formulaire vide pour un ajout, soit un formulaire prérempli pour une modification.
Voyons le Contrôleur :
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 | function edit($id = null) { if(isset($this->data)) { $this->Exemple->set($this->data); if (!$this->Exemple->validates()) { $this->Session->setFlash( 'Corrigez la saisie.', 'message_notice' ); return; } $this->Exemple->save($this->data, false); $this->Session->setFlash( 'Opération effectuée.', 'message_ok' ); $this->redirect(array('action' => 'index'), null, true); } $this->data = $this->Exemple->read(null, $id); } |
Décrivons ce qui se produit pas à pas. Si aucun paramètre $id n’est passé à la fonction edit, il s’agit de l’ajout d’un nouvel enregistrement :
1 | function edit($id = null) |
Nous regardons si le formulaire a été envoyé :
3 | if(isset($this->data)) |
Si oui, les données du formulaire sont affectées au Modèle avant validation et enregistrement :
5 | $this->Exemple->set($this->data); |
Si les données saisies ne satisfont pas les règles de validation définies dans le Modèle, on affiche un avertissement et la page est réaffichée avec les données présaisies :
7 8 9 10 11 12 13 14 | if (!$this->Exemple->validates()) { $this->Session->setFlash( 'Corrigez la saisie.', 'message_notice' ); return; } |
On sauvegarde l’enregistrement. Le deuxième paramètre, false, sert à court-circuiter la validation des données, que l’on vient de tester plus haut. Inutile de faire un test de succès de la fonction save, si l’on utilise la méthode décrite dans cet article : Gestion des erreurs de base de données :
16 | $this->Exemple->save($this->data, false); |
On prévient l’utilisateur que l’opération s’est bien déroulée et on renvoie sur la liste des enregistrements :
17 18 19 20 21 | $this->Session->setFlash( 'Opération effectuée.', 'message_ok' ); $this->redirect(array('action' => 'index'), null, true); |
Si le formulaire n’a pas encore été envoyé, on va chercher les données existantes. Si $id est absent (nouvel enregistrement), $this->data ne contient rien et un formulaire vierge sera affiché :
24 | $this->data = $this->Exemple->read(null, $id); |
Attention à la création du formulaire dans la Vue, où nous forçons l’action « edit » :
1 2 3 | e($form->create('Exemple', array('action' => 'edit'))); e($form->input('id')); // etc... |
Commentaires
28 septembre 2008 à 20:43
Bonjour, cakephp me parait être une bonne alternative à la routine de mes scripts PHP. J’ai parcouru avec intérêt le sujet sur l’internationalisation, et celui sur l’amin. Je suis prêt à prendre le virage cakephp je pense… Seulement une question me vient à l’esprit: Comment procède t’on lorsque l’on souhaite afficher ou éditer plusieurs tables?
merci pour vos lanternes.
3 octobre 2008 à 8:42
Pour afficher et éditer des enregistrements venant de plusieurs tables, on va définir les relations qui existent entre les tables, et Cake se charge du reste. Je vous conseille fortement de commencer par bien lire le manuel officiel : le Cook Book