Yii - dynamically change rules from controller

php, yii

Solution

You can use scenario. In the model:

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

And in the controller:

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

So, required colour will be validated when the model's scenario is `hasColour`

Problem

Let's say I have a product which can have a colour. Depending on the product type, the colour field may or may not be required. If colour is always required, I would have the following in the product model ``` public function rules() { return array( array('colour', 'required') ); } ``` However, I want this to be dynamic depending on the product type. Should this be done in the controller? I would imagine having something like the following in the controller: ``` public function actionOrder() { // .... if ($product->HasColour) { // set the colour validation to be required } else { // set the colour validation to be not required } } ``` What is the best way to approach this? Thanks

Original source