我想根据表单上的切换值动态替换模型中的规则。
在视图中:
<?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
中使用的规则集)进行了验证。
如何编写规则的动态切换?
答案 0 :(得分:2)
您想要的是根据用户的输入更改验证。您可以通过在模型中定义方案来实现此目的。
首先设置方案,在其中放入要验证的字段。例如,如果您有username
,password
和email
字段,并且您定义了两个方案,则SCENARIO_FIRST
仅username
和password
将获得验证。
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