2013-08-11 6 views
0

J'essaye de configurer la validation de Modèle sur un champ qui doit seulement être vérifié si un autre champ est égal à une valeur particulière.cakephp: validation de modèle basée sur un autre champ

Mon premier champ est une requête qui est une liste déroulante avec beaucoup de valeurs, une valeur est 'Autre' si cela est sélectionné alors j'ai besoin que le deuxième champ 'query_other' ne soit pas vide.

Je cette configuration dans mon article Modèle:

public $validate = array(
    'query' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'THE QUERY IS REQUIRED', 
      //'allowEmpty' => false, 
      //'required' => false, 
      //'last' => false, // Stop validation after this rule 
      //'on' => 'create', // Limit validation to 'create' or 'update' operations 
     ), 
    ), 
    'query_other' => array(
     'notempty' => array(
      'rule' => array('if_query_other', 'query'), 
      'message' => 'REASON IS REQUIRED', 
      //'allowEmpty' => false, 
      //'required' => false, 
      //'last' => false, // Stop validation after this rule 
      //'on' => 'create', // Limit validation to 'create' or 'update' operations 
     ), 
    ), 
); 

J'ai alors cette fonction personnalisée qui est appelée ci-dessus.

function if_query_other(&$data, $check, $query_field) { 

    if($this->data[$this->name][$query_field] == 'Other' && $check == NULL) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
    } 

Il ne fonctionne pas, je reçois actuellement cette erreur: Paramètre 1 à la rubrique :: if_query_other() devrait être une référence, valeur donnée

CakePHP Version 2.3.6

Merci

+0

Où se situe la fonction de validation, dans le modèle lui-même, ou dans un comportement? Aussi, vous devriez toujours mentionner votre version exacte de CakePHP! – ndm

+0

Merci, la validation est dans le Modèle d'Objet, j'utilise la version 2.3.6 de cakePHp. – sluggerdog

Répondre

2

Le message d'erreur est assez clair, le paramètre 1 est passé par valeur, pas by reference comme exige votre signature de méthode. Il n'y a rien à passer en référence à une méthode de validation personnalisée, il suffit donc de supprimer le &, en supprimant respectivement le premier paramètre de la signature.

Le premier paramètre transmis à une méthode de validation personnalisée sera toujours les données du champ à valider (au format key => value), suivies des paramètres possibles définis dans le tableau rule, comme par exemple votre nom de champ. Donc $check n'aurait jamais été null sauf si vous auriez défini null dans le tableau rule, soit 'rule' => array('if_query_other', null), par conséquent votre troisième paramètre n'aurait jamais été le nom de champ.

En bref, vous devez définir deux paramètres seulement, le premier contiendra les données du champ à valider, le second la valeur supplémentaire définie dans le tableau rule.

Voici un exemple, il vérifie si le champ passé en $query_field existe et si sa valeur est égale à Other, si elle ne retourne si la valeur du champ courant n'est pas vide (je suppose le Validation::notEmpty() intégré est assez suffisant pour votre "pas vide" vérifier les besoins). Si la valeur du champ $query_field n'est pas égale à Other, cette règle sera toujours validée avec succès, c'est-à-dire que la valeur n'est pas obligatoire pour être vide.

... 

App::uses('Hash', 'Utility'); 
App::uses('Validation', 'Utility'); 

class Item extends AppModel 
{ 
    ... 

    public function if_query_other($check, $query_field) 
    { 
     if(Hash::get($this->data[$this->alias], $query_field) === 'Other') 
     { 
      return Validation::notEmpty(current($check)); 
     } 

     return true; 
    } 
} 
+0

Un grand merci, il ne semble pas y avoir de coup de pied mais je me demande si je l'appelle correctement (comme ci-dessus?) Je ne reçois pas d'erreurs maintenant, mais si le champ est vide, il va quand même. – sluggerdog

+0

Je l'ai testé avec vos règles de validation exactes, et cela fonctionne comme prévu pour moi, si 'query' est' Other' et 'query_other' est vide, il génère une erreur. Après avoir relu votre question, j'ai remarqué que vous avez mentionné 'other' ainsi que' Other', alors assurez-vous d'utiliser la valeur de comparaison correctement mise en forme.A part cela, il est assez difficile de dire ce qui pourrait être faux dans votre configuration, vous devrez faire du débogage, vérifier si 'if_query_other' est réellement appelé, vérifier le contenu des valeurs passées, le résultat de' Hash :: get 'et' Validation :: notEmpty', etc ... – ndm

+0

Merci, je me demande si ma règle $ validate ci-dessus n'appelle pas correctement votre fonction? – sluggerdog

Questions connexes