我想在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 {
??????
}
}
}
答案 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)
小心使用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;
}