【问题标题】:Create a dynamic conditional validation in Cakephp在 Cakephp 中创建动态条件验证
【发布时间】:2015-09-02 03:57:23
【问题描述】:

我想在 CakePHP 中设置这些验证规则

规则:

其中一个字段是必需的,但不能同时填写。

discount_percent
discount_amount

如果 discount_amount 输入为 0,则应保存 NULL,然后要求 discount_percent > 1 但

如果 discount_percent 输入 0,则应保存 NULL,然后要求 discount_amount > 0 但

我已经尝试过但没有找到正确的方法来执行此验证。

模式代码:

App::uses('AppModel', 'Model');

class Code extends AppModel {

    public $validate = array(

        'discount_amount' => array(
            'rule' => array('checkLimit'),
            'message' => 'Please supply a valid discount_amount'
        ),
        'discount_percent' => array(
            'rule' => array('checkLimit'),
            'message' => 'Please supply a valid discount_percent'
        )
    );

    public function checkLimit($field) {
        $passed = true;

        if (isset($this->data[$this->alias]['discount_amount']) && empty($this->data[$this->alias]['discount_amount'])) {

            ??????

        } else {

            ??????
        }
    }

}

【问题讨论】:

    标签: php validation cakephp


    【解决方案1】:

    验证规则不应更改任何数据!

    因此,验证规则中不允许使用“if 0, save null”。 您应该在 beforeSave() 回调中实现该逻辑。

    关于验证,提供了第二个参数,其中包含所有 $data,您可以使用它来验证其他字段(并从数据库中提取额外的必需数据 - 可能是您的产品价格)。

    好的文档在http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods

    【讨论】:

    • 很好的电话提到beforeSave() 来操作您的数据,验证规则只验证
    【解决方案2】:

    小心使用emptyisset,它们并不完全相反。 empty('0') 返回 true,而 isset('0') 也返回 true。我想你想改用isset!isset

    public function checkLimit($field) {
        if ((!isset($this->data[$this->alias]['discount_amount']) && isset($this->data[$this->alias]['discount_percent'])) {
            //only percent is set
            if ($this->data[$this->alias]['discount_percent'] >= 1 && $this->data[$this->alias]['discount_percent'] <= 100) {
                //percent is in correct range
                return true;
            }
        } else if ((isset($this->data[$this->alias]['discount_amount']) && !isset($this->data[$this->alias]['discount_percent'])) {
            //only amount is set
            if ($this->data[$this->alias]['discount_amount'] >= 0 && $this->data[$this->alias]['discount_amount'] <= $products.price) {
                //amount is in correct range
                return true;
            }
        }
        //either neither or both fields are set, or values aren't in correct range
        return false;
    }
    

    【讨论】:

    • 这假定$this-&gt;data[$this-&gt;alias]['discount_amount'] 为您提供了您正在寻找的正确值,我之前从未使用过$this-&gt;alias
    • $products.price 不是有效的 php 变量名
    • 我觉得不错!只需要设置产品价格,或者现在从数据库或其他地方获取它......
    • 这有点伪代码,不知道products.price 使用的是什么,所以我只是将它添加为变量。假设此时它不是一个变量,他们会得到一个错误并且应该能够从那里调试......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2017-01-24
    • 2015-07-22
    • 2015-04-11
    • 2015-11-26
    相关资源
    最近更新 更多