2013-01-08 31 views
9

Tôi tự hỏi nếu có thể với các quy tắc xác thực CakePHP để xác thực một trường tùy thuộc vào trường khác.Xác thực CakePHP tùy thuộc vào trường khác

Tôi đã đọc số documentation about custom validation rules nhưng thông số $check chỉ chứa giá trị của trường hiện tại để xác thực.

Ví dụ: Tôi muốn xác định trường verify_passwordyêu cầuchỉ khi trường new_password không trống. (Trong trường hợp

tôi có thể làm điều đó với Javascript anyway nhưng tôi tự hỏi nếu nó có thể làm điều đó trực tiếp với CakePHP.

Trả lời

13

Khi bạn xác nhận dữ liệu trên một mô hình, dữ liệu đã là set(). Điều này có nghĩa rằng bạn Ví dụ dưới đây kiểm tra trường chúng tôi đang xác thực để đảm bảo rằng trường này giống với một số trường khác được xác định trong các quy tắc xác thực (chẳng hạn như trường xác nhận mật khẩu) (

Quy tắc xác thực này sẽ trông giống như sau:

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

Chức năng xác thực của chúng tôi sau đó xem xét dữ liệu của trường được truyền (confirm_password) và so sánh nó với dữ liệu mà chúng tôi đã xác định trong quy tắc (được chuyển đến $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); 
} 

Đây là ví dụ đơn giản, nhưng bạn có thể làm bất cứ điều gì bạn muốn với $this->data.

Ví dụ trong bài viết của bạn có thể trông như thế này:

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

Và quy tắc:

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

Cảm ơn lời giải thích :) – Alvaro

+0

Hy vọng nó xóa một số nội dung lên! – jeremyharris

+1

Trong CakePHP 2.4 nó không có vẻ như bạn có thể vượt qua bằng cách tham chiếu đến chức năng, nó dường như không làm việc cho tôi, nhưng sử dụng ví dụ trong tài liệu và thay đổi nó để $ kiểm tra làm việc. – mtpultz

Các vấn đề liên quan