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

问题描述 投票:7回答:5

假设我有一种可以带有颜色的产品。根据产品类型,可能需要也可能不需要颜色字段。

如果始终需要颜色,则产品型号中应包含以下内容

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
    }
}

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

谢谢

php yii
5个回答
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时,所需的颜色将被验证>


9
投票
class LoginForm extends CFormModel
{
    public $username;
    public $password;
}

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

4
投票

一种方法是使用自定义验证规则。例如,规则:


1
投票

如果您要执行更复杂的逻辑,则场景可能无法满足您的需求。然后,您可以覆盖方法init并执行在此定义验证规则的所有逻辑,将结果添加到$ validationRules数组中。而in rules()方法只返回该数组。像这样的东西:


0
投票
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.