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...
Pierre-Emmanuel Fringant

Participez