【问题标题】:Custom validation rule not applying自定义验证规则不适用
【发布时间】:2014-02-03 16:57:20
【问题描述】:

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

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)。但这对我没有用,我需要能够检查至少一个字段是否有值,但如果两者都是空的(并且当实际验证应该返回 false 时)它甚至不会尝试验证.我尝试将required => true 添加到规则中,但没有运气。添加allowEmpty => false 没有意义,所以我什至没有尝试过。

我能想到的另一个选择是在模型的beforeSave 中添加一个检查“验证”的函数,但我希望能够通过验证来做到这一点(所以我不必搞砸使用验证数组来输出我想要的错误消息)。

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

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

以防万一。不确定这里还有哪些其他信息有用,但请告诉我。提前致谢。

(使用 cakephp 2.4.4)

【问题讨论】:

    标签: cakephp cakephp-2.4


    【解决方案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;
        }
    }
    

    【讨论】:

    • 感谢您的回答。不幸的是,它不起作用,当firstsecond 为空时它仍然无法验证:( 认为删除函数中的变量可能会奏效,即使它使其不可重用,但不,同样的结果...
    • 很奇怪。我刚刚在我的网站上对其进行了测试,它运行良好(在我更正括号以匹配上面的编辑之后)。将firstsecond 留空会导致在两个字段中显示“必须至少填写一个” 的错误消息。填写任何一个都会验证表单。
    • 这对我来说也很奇怪,这就是我发布问题的原因。您的答案看起来不错,我认为它会起作用,但是没有......我缺少配置吗?我不这么认为,但也许?如果我获得有关问题的更多信息,我会更新问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2017-04-11
    • 2018-02-18
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多