2011-10-13 3 views
0

J'ai écrit une méthode de validation personnalisée dans mon modèle de soumission qui permet essentiellement un champ de saisie vide, mais une fois que quelqu'un entre quelque chose, il va valider les données saisies.Règle de validation personnalisée dans CakePHP ne fonctionnant pas comme prévu

La validation dans mon modèle de soumission ressemble à ceci (Toutes les autres règles de validation fonctionnent à l'exception de « description »):

var $validate = array(
    'title' => array(
     'title' => array(
      'rule' => 'notEmpty', 
      'required' => true, 
      'allowEmpty' => false, 
      'message' => 'Please enter a title' 
     ), 
     'minLength' => array(
      'rule' => array('minLength', 5), 
      'message' => 'Please make your title longer' 
     ), 
     'maxLength' => array(
      'rule' => array('maxLength', 300), 
      'message' => 'Your title needs to be shorter' 
     ), 
    ), 
    'description' => array(
     'checkDescription' => array(
      'rule' => array('validateDescription'), 
      'message' => 'Description must be greater than 5 characters' 
     ), 
    ), 
    'source' => array(
     'source' => array(
      'rule' => 'notEmpty', 
      'required' => true, 
      'allowEmpty' => false, 
      'message' => 'Enter a valid source URL' 
     ), 
     'website' => array(
      'rule' => 'url', 
      'message' => 'Please enter a valid source URL' 
     ), 
    ) 
); 

Ma méthode qui est aussi dans mon modèle de soumission (ci-dessous le code ci-dessus) est :

public function validateDescription($data) { 
    if(empty($data['Submission']['description'])) 
     return true; 

    if((strlen($data['Submission']['description'])) <= 5) 
     return false; 
} 

Je ne sais pas pourquoi cela ne fonctionne pas du tout. À mon avis, j'ai cette option pour afficher l'erreur:

if ($form->isFieldError('Submission.description')) 
    echo ($form->error('Submission.description', null, array('class' => 'error'))); 

La seule raison pour laquelle je suis en train de le faire, est parce que l'utilisation de la validation normale avec required => false et allowEmpty => true avec une règle de validation minLength et maxLength ne se comportaient pas comme je l'avais prévu.

Toute aide serait grandement appréciée! :)

Répondre

1

La variable $data transmise à la méthode de validation contient uniquement array($fieldname => $value). Vous aussi ne pas retourner true pour les chaînes sur une longueur de 5. Votre méthode devrait ressembler à ceci:

public function validateDescription(array $data) { 
    $value = current($data); 
    return !$value || strlen($value) > 5; 
} 
+0

qui l'a fait. Je vous remercie! Si je devais ajouter une autre règle de validation à cela, comment suggéreriez-vous que je renvoie un 'message' personnalisé au tableau 'description' dans la propriété $ validate? Je pensais faire peut-être 3 conditions et changer le $ message = 'doit être supérieur à 5 caractères' ou $ message = 'doit être inférieur à 10k caractères' et le retourner. –

+2

Je combinerais cela en un seul message ("doit être entre x et y") ou faire des règles distinctes que chacun a son propre message. – deceze

+0

notez également qu'il vous manque la partie cruciale "last" => true – mark

Questions connexes