2013-01-08 13 views
9

Zastanawiam się, czy jest to możliwe z zasadami sprawdzania poprawności CakePHP do sprawdzania poprawności pola w zależności od innego.Walidacja CakePHP w zależności od innego pola

Przeczytałem documentation about custom validation rules, ale parametr $check zawiera tylko wartość bieżącego pola do sprawdzenia poprawności.

Na przykład. Chciałbym do zdefiniowania pola verify_password jak wymaganetylko jeśli new_password pole nie jest pusta. (W przypadku

mogę to zrobić z JavaScript i tak, ale zastanawiam się, czy jest możliwe, aby to zrobić bezpośrednio z CakePHP.

Odpowiedz

13

Podczas sprawdzania poprawności danych w modelu danych jest już set(). Oznacza to, że można uzyskać do niego dostęp za pomocą właściwości modelu $data. Poniższy przykład sprawdza sprawdzane przez nas pole, aby upewnić się, że jest taki sam jak inne pole zdefiniowane w regułach sprawdzania poprawności (np. pole potwierdzenia hasła). wyglądałby tak:

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.' 
     ) 
    ) 
); 

Nasza funkcja walidacji następnie analizuje dane przekazanego pola (confirm_password) i porównuje je z tym, który zdefiniowaliśmy w regule (przekazywany do $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); 
} 

Jest to prosty przykład, ale można zrobić cokolwiek chcesz z $this->data.

Przykład w post może wyglądać tak:

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

a reguła:

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

Dzięki za wyjaśnienie :) – Alvaro

+0

Mam nadzieję, że zdaje się pewne rzeczy się! – jeremyharris

+1

W CakePHP 2.4 nie wygląda na to, że możesz przekazać odwołanie do funkcji, nie sprawdziło się to dla mnie, ale użycie przykładu w dokumentach i zmiana go na $ check działało. – mtpultz

Powiązane problemy