Yii2 - 动态切换模型中设置的规则

时间:2017-11-19 22:47:58

标签: ajax yii2 active-form

我想根据表单上的切换值动态替换模型中的规则。

在视图中:

<?php
    $form = ActiveForm::begin([
        'enableAjaxValidation' => true,
        'validationUrl' => Url::toRoute('anounce/validation')
    ]);
?>

在控制器中:

public function actionValidation()
{
    $model = new Anounce();
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->
        request->post())) {
        Yii::$app->response->format = 'json';
        return ActiveForm::validate($model);
    }
}

摘自模特:

class Anounce extends \yii\db\ActiveRecord
{
    private $currentRuleSet;    // Current validation set
    // Here are arrays of rules with assignment
    private $fullRuleSet;  // = [...];
    private $shortRuleSet; // = [...];
    private $minRuleSet;   // = [...];

    public function init()
    {
        parent::init();
        $this->currentRuleSet = $this->fullRuleSet;
    }

    public function rules()
    {
        return $this->currentRuleSet;
    }

    public function beforeValidate()
    {
        if ($this->idanounce_type === self::FULL) {
            $this->currentRuleSet = $this->fullRuleSet;
        } else if ($this->idanounce_type === self::SHORTER) {
            $this->currentRuleSet = $this->shortRuleSet;
        } else if ($this->idanounce_type === self::MINIMAL) {
            $this->currentRuleSet = $this->minRuleSet;
        }
        return parent::beforeValidate();
    }
}

变量idanounce_type是规则之间的切换。 遗憾的是,尽管已将init值分配给*RuleSet,但根据完整规则集(或currentRuleSet中使用的规则集)进行了验证。

如何编写规则的动态切换?

1 个答案:

答案 0 :(得分:2)

您想要的是根据用户的输入更改验证。您可以通过在模型中定义方案来实现此目的。

首先设置方案,在其中放入要验证的字段。例如,如果您有usernamepasswordemail字段,并且您定义了两个方案,则SCENARIO_FIRSTusernamepassword将获得验证。

public function scenarios()
{
    return [
        self::SCENARIO_FIRST => ['username', 'password'],
        self::SCENARIO_SECOND => ['username', 'email', 'password'],
    ];
}

然后在您的控制器中,根据输入设置场景:

public function actionValidation()
{
    $model = new Anounce();

    //example
    if($condition == true) 
    {
       $model->scenario = Anounce::SCENARIO_FIRST;
    }

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->
        request->post())) {
        Yii::$app->response->format = 'json';
        return ActiveForm::validate($model);
    }
}

在此处阅读有关方案的更多信息以及如何在验证中使用它们:

http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios