2013-01-08 181 views
9

我想知道CakePHP驗證規則是否可以根據其他字段驗證字段。根據其他字段的CakePHP驗證

我一直在閱讀documentation about custom validation rules,但$check param只包含當前字段的值來驗證。

例如。我想定義verify_password字段需要只有NEW_PASSWORD字段不爲空。 (萬一

我可以用javascript做吧,但我不知道是否有可能直接與CakePHP的做到這一點。

回答

13

當您驗證的模型數據,該數據已經是set()。這意味着你可以在模型的$data屬性中訪問它,下面的示例檢查我們正在驗證的字段,以確保它與驗證規則中定義的某個其他字段(例如密碼確認字段)相同

驗證規則看起來像這樣:

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

我們的驗證函數然後查看傳遞的字段的數據(confirm_password)並將其與規則中定義的一個(傳遞給$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); 
} 

這是一個簡單的例子,但是你可以做你想要什麼$this->data

在您的文章中的例子可能是這個樣子:

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

和規則:

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

感謝您的解釋:) – Alvaro

+0

希望它可以清除一些東西了! – jeremyharris

+1

在CakePHP 2.4中,它看起來並不像你可以通過引用來傳遞函數,它似乎並不適用於我,但使用文檔中的示例並將其更改爲$ check工作。 – mtpultz

相關問題