2017-06-30 3 views
0

J'ai 4 attributs dans un tableau; num_a, num_b, num_c, num_d, ceux-ci peuvent être individuellement dans une plage de 0 à 2, par ex. J'ai dans ma $validate propriété dans le modèle:Validation CakePHP2 sur le champ non dans le tableau

'num_a' => [ 
    'numeric' => [ 
    'rule' => 'numeric', 
    'message' => 'Please provide the number of a.', 
    ], 
'isInRange' => [ 
    'rule' => ['range', -1, 3], 
    'message' => 'Must be between 0 and 2.' 
], 

Le problème que je suis face est que la somme de ces doit être supérieure à 0. Je voudrais à retourner une erreur de validation si tel est le cas, par exemple:

'num_all' => [ 
    'rule' => 'returnFalse', 
    'message' => 'There were no a, b, c or d selected.', 
], 

J'ai la fonction returnFalse dans mon modèle qui est tout simplement

public function returnFalse() { 
    return false; 
} 

pour ajouter toujours cette règle.

Dans le beforeValidate je vérifie la somme des num_a par num_d et en supprimant la règle de validation si $sum > 0 comme ceci:

public function beforeValidate($options=array()) 
{ 
    $sum = 0; 
    $sum += (isset($this->data['MyModel']['num_a'])) ? $this->data['MyModel']['num_a'] : 0; 
    $sum += (isset($this->data['MyModel']['num_b'])) ? $this->data['MyModel']['num_b'] : 0; 
    $sum += (isset($this->data['MyModel']['num_c'])) ? $this->data['MyModel']['num_c'] : 0; 
    $sum += (isset($this->data['MyModel']['num_d'])) ? $this->data['MyModel']['num_d'] : 0; 

    if ($sum > 0) { 
    $this->validator()->remove('num_all'); 
    } 
} 

Mais pour une raison que je ne peux pas obtenir ce pour retourner une erreur de validation pour num_all.

J'ai même essayé d'ajouter un champ virtuel alors peut-être l'erreur de validation avait quelque chose à joindre à:

public $virtualFields = [ 
    'num_all' => 'SELECT 0 FROM dual', 
]; 

mais cela ne fonctionne pas non plus. J'utilise CakePHP v2.8.

Répondre

0

OK, donc je l'num_all abandonné dans la propriété $validate et le champ virtuel, etc., et la règle « échoue toujours », et à la place piraté sur une entrée aux modèles tableau validationErrors dans beforeValidate:

public function beforeValidate($options=array()) 
{ 
    $sum = 0; 
    $sum += (isset($this->data['MyModel']['num_a'])) ? $this->data['MyModel']['num_a'] : 0; 
    $sum += (isset($this->data['MyModel']['num_b'])) ? $this->data['MyModel']['num_b'] : 0; 
    $sum += (isset($this->data['MyModel']['num_c'])) ? $this->data['MyModel']['num_c'] : 0; 
    $sum += (isset($this->data['MyModel']['num_d'])) ? $this->data['MyModel']['num_d'] : 0; 

    if ($sum > 0) { 
    $this->validationErrors['num_all'][] = 'There were no a, b, c or d selected.' 
    } 
} 

Et ça marche bien maintenant. J'espère que cela t'aides.