在Cakephp中创建一个动态条件验证


Create a dynamic conditional validation in Cakephp

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

规则:

其中一个字段是必需的,但不是两个都必需的。

discount_percent
discount_amount

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

如果discount_percent输入为0,则应保存NULL,然后要求discount_amount> 0但<= products。所选产品的价格

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

模态代码:

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 {
            ??????
        }
    }
}

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

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

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

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

小心使用empty和isset,它们不是完全相反的。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;
}