Yii - 从控制器动态更改规则

Adr*_*wan 7 php yii

假设我有一种可以有颜色的产品.根据产品类型,可能需要也可能不需要色域.

如果总是需要颜色,我会在产品型号中有以下内容

public function rules()
{
    return array(
        array('colour', 'required')
    );
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望这是动态的,具体取决于产品类型.

这应该在控制器中完成吗?我想在控制器中有类似的东西:

public function actionOrder() {
    // ....
    if ($product->HasColour) {
        // set the colour validation to be required
    } else {
        // set the colour validation to be not required
    }
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?

谢谢

Rez*_*mad 15

您可以使用方案.在模型中:

class Model extends CActiveRecord {
    // ....
    public function rules() {
        return array(
            array('colour', 'required', 'on' => 'hasColour')
        );
    }
    // ....
}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

public function actionOrder() {
    // ....
    $model = new Product();
    if ($product->HasColour) {
        $model->setScenario('hasColour');
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当模型的场景是,所需的颜色将被验证 hasColour


小智 9

class LoginForm extends CFormModel
{
    public $username;
    public $password;
}

$form = new LoginForm();
$form->validatorList->add(
    CValidator::createValidator('required', $form, 'username, password')
);
Run Code Online (Sandbox Code Playgroud)

现在$ form有两个必填字段.