2013-01-08 13 views
9

Mi chiedo se è possibile con le regole di convalida CakePHP convalidare un campo in base a un altro.Convalida CakePHP in base all'altro campo

Ho letto il documentation about custom validation rules ma il parametro $check contiene solo il valore del campo corrente da convalidare.

Ad esempio. Vorrei definire il campo verify_password come richiestosolo se il new_password campo non è vuoto. (Nel caso in cui

avrei potuto farlo con JavaScript in ogni caso, ma mi chiedo se è possibile farlo direttamente con CakePHP.

risposta

13

Quando si convalida i dati su un modello, i dati sono già set(). Ciò significa che è è possibile accedervi sulla proprietà $data del modello L'esempio seguente controlla il campo che si sta verificando per assicurarsi che sia uguale ad altri campi definiti nelle regole di convalida (ad esempio un campo di conferma password)

La regola di convalida sarebbe simile a questa:

var $validate = array(
    'password' => array(   
     'minLength' => array(
      'rule' => array('minLength', 6), 
      'message' => 'Your password must be at least 6 characters long.' 
     ), 
     'notempty' => array(
      'rule' => 'notEmpty', 
      'message' => 'Please fill in the required field.' 
     ) 
    ), 
    'confirm_password' => array(
     'identical' => array(
      'rule' => array('identicalFieldValues', 'password'), 
      'message' => 'Password confirmation does not match password.' 
     ) 
    ) 
); 

La nostra funzione di convalida esamina quindi i dati del campo passato (confirm_password) e li confronta con quelli che abbiamo definito nella regola (passati a $compareFiled).

function identicalFieldValues(&$data, $compareField) { 
    // $data array is passed using the form field name as the key 
    // so let's just get the field name to compare 
    $value = array_values($data); 
    $comparewithvalue = $value[0]; 
    return ($this->data[$this->name][$compareField] == $comparewithvalue); 
} 

Questo è un semplice esempio, ma si poteva fare tutto quello che vuoi con $this->data.

L'esempio nel tuo post potrebbe essere simile a questa:

function requireNotEmpty(&$data, $shouldNotBeEmpty) { 
    return !empty($this->data[$this->name][$shouldNotBeEmpty]); 
} 

E la regola:

var $validate = array(
    'verify_password' => array(
    'rule' => array('requireNotEmpty', 'password') 
) 
); 
+0

Grazie per la spiegazione :) – Alvaro

+0

spero che cancellato alcune cose su! – jeremyharris

+1

In CakePHP 2.4 non sembra che tu possa passare per riferimento alla funzione, non sembra funzionare per me, ma usando l'esempio nei documenti e cambiandolo in $ check funzionava. – mtpultz

Problemi correlati