自定义验证规则不适用

时间:2014-02-03 16:57:20

标签: cakephp cakephp-2.4

我想在模型中添加自定义验证规则,以检查两个字段中是否至少有一个不为空。为简单起见,我减少了对此

的验证
public $validate = array(
    'first' => array(
        'oneEmpty' => array(
            'rule' => array('maxOneEmpty', 'second'),
            'message' => 'At least one must be filled'
        )
    ),
    'second' => array(
        'oneEmpty' => array(
            'rule' => array('maxOneEmpty', 'first'),
            'message' => 'At least one must be filled'
        )
    )

还有其他验证,但这些验证工作正常(但不依赖于其他字段)。现在,这不会验证。我甚至修改了自定义函数

public function maxOneEmpty($check, $notEmptyToo) {
    return false;
}
没有运气。如果我尝试保存模型(故意进行错误的验证,实际上没有保存),我在控制器中执行$this->Model->validationErrors时会得到此信息

Array
(
    [House] => Array
        (
            [third] => Array
                (
                    [0] => Enter a valid option
                )
        )
)

如果明确firstsecond也应该是错误。所以模型正在验证,而不是那些领域。

如果我没有在firstsecond字段上添加任何值,就会发生这种情况。如果我在first字段上放置任何内容,它会验证自定义函数(因为返回而给我错误)。但是这对我没用,我需要能够检查至少有一个字段是否有值,但是如果两个字段都是空的(当实际验证应该返回false时)它甚至不会尝试验证。我已经尝试将required => true添加到规则中,但没有运气。添加allowEmpty => false没有意义,所以我甚至没有尝试过。

我能想到的另一个选择是在模型beforeSave中添加一个检查“验证”的函数,但我希望能够通过验证来实现(所以我没有混淆验证数组以输出错误消息,就像我想要的那样。)

我不确定我做错了什么......我用saveAll保存了两个模型,但即使我做了一个简单的save,问题仍然存在。结果表单的结果数组为

Array
(
    [House] => Array
        (
            [first] => 
            [second] => 
            [third] => t
        )
)

万一有任何帮助。不知道其他信息在这里有用,但请告诉我。提前谢谢。

(使用cakephp 2.4.4)

1 个答案:

答案 0 :(得分:1)

设置required => true仅表示必须存在数组键;它根本不检查价值。

请尝试以下代码:

public $validate = array(
    'first' => array(
        'oneEmpty' => array(
            'rule' => array('maxOneEmpty'),
         'message' => 'At least one must be filled'
        )
    ),
    'second' => array(
        'oneEmpty' => array(
            'rule' => array('maxOneEmpty'),
            'message' => 'At least one must be filled'
        )
    )
);

public function maxOneEmpty() {
    if ((empty($this->data['Model']['first'])) && (empty($this->data['Model']['second']))) {
        return false;
    } else {
        return true;
    }
}