4.1.5 Règles personnalisées de validation des données

Si ce qui précède ne vous convient pas, vous pouvez toujours créer vos propres règles de validation. Il y a deux moyens de réaliser cela : en définissant des expressions régulières ou en créant des méthodes de validation personnalisées.

4.1.5.1 Validation avec Expression Régulière personnalisée

Si la technique de validation dont vous avez besoin peut être complétée par l'utilisation d'une expression régulière, vous pouvez définir une expression personnalisée comme une règle de validation de champ.

var $validate = array(
    'login' => array(
        'rule' => array('custom', '/^[a-z0-9]{3,}$/i'),  
        'message' => 'Seulement des lettres et des entiers, minimum 3 caractères'
    )
);
  1. var $validate = array(
  2. 'login' => array(
  3. 'rule' => array('custom', '/^[a-z0-9]{3,}$/i'),
  4. 'message' => 'Seulement des lettres et des entiers, minimum 3 caractères'
  5. )
  6. );

L'exemple ci-dessus vérifie que le login contient seulement des lettres et des entiers et qu'il a au minimum trois caractères.

L'expression régulière dans rule doit être délimitée par des slashes (/). Le "i" final optionnel après le dernier slash signifie que l'expression régulière est insensible à la casse.

4.1.5.2 Ajouter vos propres méthodes de validation

Parfois, la vérification des données par un motif d'expression régulière ne suffit pas. Par exemple, si vous voulez vous assurer qu'un coupon de réduction (code promo) n'est pas utilisé plus de 25 fois, vous devez ajouter votre propre méthode de validation, comme indiqué ci-dessous :

<?php
class Utilisateur extends AppModel {
    var $name = 'Utilisateur';
  
    var $validate = array(
        'code_promo' => array(
            'rule' => array('limiteUtilisations', 25),
            'message' => 'Ce code promo a dépassé son nombre maximal d\'utilisation.'
        )
    );
 
    function limiteUtilisations($check, $limit){
    //$check aura comme valeur : array('code_promo' => 'une valeur')
   //$limit aura comme valeur : 25
        $compteur_code_actuel = $this->find( 'count', array('conditions' => $data, 'recursive' => -1) );
        return $compteur_code_actuel < $limit;
    }
}
?>
  1. <?php
  2. class Utilisateur extends AppModel {
  3. var $name = 'Utilisateur';
  4. var $validate = array(
  5. 'code_promo' => array(
  6. 'rule' => array('limiteUtilisations', 25),
  7. 'message' => 'Ce code promo a dépassé son nombre maximal d\'utilisation.'
  8. )
  9. );
  10. function limiteUtilisations($check, $limit){
  11. //$check aura comme valeur : array('code_promo' => 'une valeur')
  12. //$limit aura comme valeur : 25
  13. $compteur_code_actuel = $this->find( 'count', array('conditions' => $data, 'recursive' => -1) );
  14. return $compteur_code_actuel < $limit;
  15. }
  16. }
  17. ?>

Le champ en cours de validation est passé à la fonction comme premier paramètre, sous la forme d'un tableau associatif avec le nom du champ comme clé et les données postées comme valeur.

Si vous voulez passer des paramètres supplémentaires à votre fonction de validation, ajoutez des éléments dans le tableau 'rule' et manipulez-les comme des paramètres supplémentaires (après le paramètre principal $check) dans votre fonction.

Votre fonction de validation peut être dans le modèle (comme dans l'exemple) ou dans un comportement (behavior) que votre modèle implémente. Ceci inclus les méthodes mappées.

Les méthodes des modèles/comportements sont vérifiées en premier, avant de chercher pour une méthode dans la class Validation. Cela veut dire que vous pouvez écraser les méthodes de validation existantes (telle que alphaNumeric()) au niveau de l'application (en ajoutant la méthode dans AppModel) ou au niveau du modèle.

Quand vous écrivez une règle de validation qui peut être utilisée par plusieurs champs, prenez soin d'extraire la valeur du champ du tableau $check. Le tableau $check est passé avec le nom du champ comme clé et la valeur du champ comme valeur. Le champ complet qui doit être validé est stocké dans une variable de $this->data.

<?php
class Message extends AppModel {
    var $name = 'Message';
    var $validate = array(
        'pseudo' => array(
            'rule' => 'alphaNumericDashUnderscore',
            'message' => 'Le pseudo ne peut contenir que des lettres, des nombres, des tirets ou des underscores.
        )
    );

    function alphaNumericDashUnderscore($check) {
        // le tableau $check est passé en utilisant le nom du champ de formulaire comme clé
        // nous devons extraire la valeur pour rendre la fonction générique
        $valeur = array_values($data);
        $valeur = $valeur[0];

        return preg_match('|^[0-9a-zA-Z_-]*$|', $valeur);
    }
}
?>
  1. <?php
  2. class Message extends AppModel {
  3. var $name = 'Message';
  4. var $validate = array(
  5. 'pseudo' => array(
  6. 'rule' => 'alphaNumericDashUnderscore',
  7. 'message' => 'Le pseudo ne peut contenir que des lettres, des nombres, des tirets ou des underscores.
  8. )
  9. );
  10. function alphaNumericDashUnderscore($check) {
  11. // le tableau $check est passé en utilisant le nom du champ de formulaire comme clé
  12. // nous devons extraire la valeur pour rendre la fonction générique
  13. $valeur = array_values($data);
  14. $valeur = $valeur[0];
  15. return preg_match('|^[0-9a-zA-Z_-]*$|, $valeur);
  16. }
  17. }
  18. ?>