CakePHP验证取决于其他字段

Alv*_*aro 9 cakephp cakephp-2.0 cakephp-2.1 cakephp-2.2

我想知道CakePHP验证规则是否可以根据另一个验证字段.

我一直在阅读有关自定义验证规则文档,但该$check参数仅包含要验证的当前字段的值.

例如.我想new_password字段不为空时才require_password字段定义为必需 .(如果

我无论如何都可以使用Javascript,但我想知道是否有可能直接使用CakePHP.

jer*_*ris 14

验证模型上的数据时,数据已经存在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.'
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

然后,我们的验证函数查看传递的字段数据(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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但你可以做任何你想做的事情$this->data.

帖子中的示例可能如下所示:

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

规则:

var $validate = array(
  'verify_password' => array(
    'rule' => array('requireNotEmpty', 'password')
  )
);
Run Code Online (Sandbox Code Playgroud)