在Cakephp

时间:2015-09-01 18:54:13

标签: php validation cakephp

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

规则:

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

discount_percent
discount_amount

如果input_amount输入为0,则应保存NULL,然后discount_percent必须为> 1但是< = 100。

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

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

模态代码:

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 {

            ??????
        }
    }

}

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分: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;
}