假设我有一种可以有颜色的产品。根据产品类型,可能需要也可能不需要色域。
如果总是需要颜色,我会在产品型号中有以下内容
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
}
}
最好的方法是什么?
由于
答案 0 :(得分:15)
您可以使用方案。在模型中:
class Model extends CActiveRecord {
// ....
public function rules() {
return array(
array('colour', 'required', 'on' => 'hasColour')
);
}
// ....
}
在控制器中:
public function actionOrder() {
// ....
$model = new Product();
if ($product->HasColour) {
$model->setScenario('hasColour');
}
}
因此,当模型的场景为hasColour
答案 1 :(得分:9)
class LoginForm extends CFormModel
{
public $username;
public $password;
}
$form = new LoginForm();
$form->validatorList->add(
CValidator::createValidator('required', $form, 'username, password')
);
现在$ form有两个必填字段。
答案 2 :(得分:4)
一种方法是使用自定义验证规则。例如,规则:
array('colour', 'requiredOnHasColour'),
然后是同一模型类中的验证器方法:
public function requiredOnHasColour($attribute, $params) {
if ($this->hasColour && $this->$attribute == null)
$this->addError($attribute, 'Colour is required.');
}
答案 3 :(得分:1)
如果您想要执行更复杂的逻辑,那么场景可能无法满足您的需求。然后,您可以覆盖方法init并执行在那里定义验证规则的所有逻辑,将结果添加到$ validationRules数组。而在rules()方法中,您只需返回该数组。这样的事情:
class Person extends CActiveRecord
{
public function init(){
if( TRUE){
$this->validationRules[] = array('first_name','required');
$this->validationRules[] = array('last_name','required');
}
}
public $validationRules = array(
array('email', 'required'),
array('email, email1, email2, email3', 'email', 'message'=>'Email format is invalid'),
array('email, address, email1, email2, email3', 'length', 'max'=>255),
);
public function rules()
{
return $this->validationRules;
}
}