假设我有一个可以有颜色的产品。根据产品类型,颜色字段可能需要,也可能不需要。
如果总是需要颜色,我会在产品模型中包含以下内容
public function rules()
{
return array(
array('colour', 'required')
);
}
但是,我希望这是动态的,取决于产品类型。
这应该在控制器中完成吗?我会想象在控制器中有如下的东西:
public function actionOrder() {
// ....
if ($product->HasColour) {
// set the colour validation to be required
} else {
// set the colour validation to be not required
}
}
解决这个问题的最佳方法是什么?
谢谢
5条答案
按热度按时间sxissh061#
您可以使用案例。在模型中:
而在控制器中:
因此,当模型的场景为
hasColour
时,将验证所需的颜色ff29svar2#
现在,$form有两个必填字段。
hpxqektj3#
一种方法是使用自定义验证规则。例如,规则:
然后是同一模型类中的验证器方法:
更多信息:Create your own validation rule
gxwragnw4#
如果你想做更复杂的逻辑,那么场景可能不能满足你的需要。然后你可以覆盖init方法,并在那里做所有定义验证规则的逻辑,将结果添加到$validationRules数组中。而in rules()方法只返回该数组。类似于:
ijxebb2r5#
在ActiveRecord中,您可以在任何地方添加动态验证器。例如,我覆盖父方法setAttributes并添加$this-〉validatorList-〉add(),这取决于$this-〉type属性中的选定值。官方文档:https://www.yiiframework.com/doc/api/1.1/CValidator