Yii2:如何将ActiveForm字段name属性改为code、name而非Team[code]格式?
解决Yii2表单字段name属性修改后验证报错的问题
首先得搞明白为什么会出现这个验证错误:Yii2的ActiveForm默认会给字段名加上模型类名作为前缀(比如Team[code]),而后台的ActiveRecord::load()方法默认只会读取带这个前缀的参数。当你把字段name改成code和name后,提交的POST数据里没有Team前缀,模型无法获取到这些值,自然触发了必填项为空的验证错误。
下面是具体的修改步骤:
1. 修改视图中的表单字段name属性
在你的View代码里,给每个字段手动指定name属性,覆盖ActiveForm的默认前缀,同时修正你之前ActiveForm初始化的语法错误(第二个参数应该嵌套在数组里):
<?php Pjax::begin(['id' => 'new_team']) ?> <?php $form = ActiveForm::begin(['action' => 'team/create', 'options' => ['data-pjax' => true ]]); ?> <?= $form->field($model, 'code')->textInput(['name' => 'code']) ?> <?= $form->field($model, 'name')->textInput(['name' => 'name']) ?> <div class="form-group"> <?= Html::submitButton(Yii::t('app', 'Create'), ['class' => 'btn btn-success']) ?> </div> <?php ActiveForm::end(); ?> <?php Pjax::end(); ?>
2. 重写Controller的create动作适配无前缀参数
你用的ActiveController默认create动作会调用$model->load(Yii::$app->request->post()),这个方法默认查找带模型类名前缀的参数。所以需要重写create动作,让它能读取不带前缀的POST数据:
class TeamController extends ActiveController { public $modelClass = 'frontend\models\Team'; protected function verbs(){ return [ 'create' => ['POST'], ]; } // 重写create动作 public function actionCreate() { $model = new $this->modelClass(); // 方式一:直接从POST获取参数赋值 $model->code = Yii::$app->request->post('code'); $model->name = Yii::$app->request->post('name'); // 方式二:使用load方法,第二个参数传空字符串,读取无前缀参数 // $model->load(Yii::$app->request->post(), ''); if ($model->validate()) { $model->save(false); // 已验证过,跳过重复验证提升效率 // 若是REST接口,返回成功响应 return $this->asJson([ 'status' => 'success', 'data' => $model ]); // 若是传统页面,可跳转至列表页 // return $this->redirect(['index']); } // 返回验证错误信息 return $this->asJson([ 'errors' => $model->errors ]); } }
额外说明
如果不需要REST接口特性,改用普通Controller会更灵活,但上面的修改完全适配ActiveController的场景。修改完成后,表单提交的code和name参数就能被模型正确接收,验证也能正常通过了。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

