Validation des données avec CakePHP (5981 lectures)

200821/03

cakephpLa validation des données issues de formulaires est un point stratégique du développement d'un projet web.

Cette validation nécessite toujours un effort très particulier et se révèle souvent coûteuse en terme de temps et de tests.

Avec CakePHP 1.2, la validation des données devient (enfin) simple.

Valider les données avec CakePHP 1.2

 Un des points forts de CakePHP est la validation des données. Avant la version 1.2, seul 4 constantes étaient disponibles par défaut :

  • VALID_NOT_EMPTY : vérifie si un champ est non vide
  • VALID_NUMBER : vérifie si une donnée est de type numérique
  • VALID_EMAIL : vérifie si une donnée respecte la logique syntaxique d'un email
  • VALID_YEAR : vérifie si une donnée est de type YEAR

Pour toute autre donnée, il fallait faire soi-même son gateau. Avec la version 1.2 (beta à la rédaction de cet article), on apporte une belle cerise sur le gateau.

La nouvelle Class de validation  de CakePHP permet d'utiliser plus de méthodes et également de customiser ses méthodes.

Utilisation 

Afin d'utiliser le modèle de validation de données, il faut déclarer dans le modèle la variable $validate et lui passer tous les champs et règles qu'on souhaite voir appliquer à ce modèle.

Ainsi, pour valider une donnée de type url (http://), on va écrire :

  1. public $validate = array('siteweb' => array('rule' => array('url)));

 Où 'siteweb' est le champ ciblé et 'rule' indique qu'on va employer une méthode qui est ici la méthode 'url'. CakePHP se charge du reste.

Oui, mais s'il faut renvoyer un message d'erreur ? On passera alors en paramètre 'message' tel que :

  1. public $validate = array('siteweb' => array('rule' => array('url'),
  2.                               'message' => 'Veuillez saisir une url valide'
  3.                              )
  4.       );

 Ensuite, il n'est pas nécessaire dans notre vue de déclarer la variable message qui est transmise automatiquement par le controlleur à la vue.

Validation avec une méthode personnalisée

Le principe est strictement le même :

  1. public $validate = array('field' => array('rule' => array('la_methode_a_utiliser', 'param1', 'param2')));

Si cette méthode est générale, on la placera dans app_model.php, sinon dans le modèle qui en a besoin uniquement.

Par exemple, on souhaite vérifier qu'une donnée n'est pas déjà présente en base afin que le champ soit unique, comme un login, un email, etc.

Dans la class AppModel, on va déclarer la méthode suivante :

  1. function validateUnique($value, $params = array()) {
  2.         if (!empty($this->id)) {
  3.             $conditions = array($this->primaryKey => '!= '.$this->id, $params['field'] => $value);
  4.         } else {
  5.             $conditions = array($params['field'] => $value);
  6.         }
  7.         return !$this->field($this->primaryKey, $conditions);
  8.     }

Et dans notre modèle qui doit recevoir cette règle, on aurait :

  1. public $validate = array('email' =>
  2.             array(
  3.                 'rule' => 'validateUnique',
  4.                 'field' => 'email',
  5.                 'message' => 'Cet email est déjà utilisé, veuillez en choisir un autre.'
  6.             ));

 

 

 

Dernière modification : 01/10/2008

Catégorie : Développement PHP/MySQL - Framework - CakePHP - Web -

A découvrir également :

 

JQuery, une librairie javascript performante

Internet, la justice, la loi, et la liberté d'expression

Commentaires

3.  posté le 17/01/2009 par julien

ok, mais il manque la partie vue... Comment sont gérés les messages ?

4.  posté le 17/01/2009 par Fred

Comme je l'ai dit, "il n'est pas nécessaire dans notre vue de déclarer la variable message qui est transmise automatiquement par le controlleur à la vue."
C'est "automagique".
Le message d'erreur sera placé dans une balise div juste après le champ ciblé qui aura pour class CSS error-message, permettant de le mettre en forme facilement.

Si on utilisait pas 'message' dans le modèle, il faudrait alors dans la vue définir le message comme par exemple :
echo $form->error('Contact.message',__('Entrer un message',true));
Ce dernier exemple présente l'avantage de proposer la régionalisation (localization).

Plus d'infos ici :
http://book.cakephp.org/fr/view/125/Validation-des-donn%C3%A9es

Ajouter un commentaire

Les champs en gras sont obligatoires.

Commentaire:

Anti-spam :
Veuillez répondre à la question suivante avant de valider votre commentaire.

La somme de 7 plus 14 est égale à