我想在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;
}