假设我有一种可以带有颜色的产品。根据产品类型,可能需要也可能不需要颜色字段。
如果始终需要颜色,则产品型号中应包含以下内容
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
}
}
解决此问题的最佳方法是什么?
谢谢
您可以使用方案。在模型中:
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
时,所需的颜色将被验证>
class LoginForm extends CFormModel
{
public $username;
public $password;
}
$form = new LoginForm();
$form->validatorList->add(
CValidator::createValidator('required', $form, 'username, password')
);
一种方法是使用自定义验证规则。例如,规则:
如果您要执行更复杂的逻辑,则场景可能无法满足您的需求。然后,您可以覆盖方法init并执行在此定义验证规则的所有逻辑,将结果添加到$ validationRules数组中。而in rules()方法只返回该数组。像这样的东西:
public function setAttributes($values, $safeOnly = true)
{
$result = parent::setAttributes($values, $safeOnly);
if (self::TYPE_PHONE == $this->type) {
$this->validatorList->add(CValidator::createValidator('required', $this, ['phone', 'phonePrefix']));
} elseif (self::TYPE_EMAIL == $this->type) {
$this->validatorList->add(CValidator::createValidator('required', $this, ['email']));
}
return $result;
}