Yii2中按钮触发表单间数据传递问题求助
我来帮你搞定这个Yii2里表单数据传递的问题!针对你做的车辆零件申请系统——获批后要把客户申请的数据转到录入表单的需求,这里有几种实用的实现方案,你可以根据自己的场景选择:
方案1:通过URL GET参数传递(适合少量非敏感数据)
这种方式最简单,直接把需要的字段拼到跳转URL里,目标页面接收参数后自动填充表单。
按钮代码示例:
<?php if($model->status == "Approved") { echo Html::a('Insert into Parts', [ '/parts/create', // 替换成你录入表单的实际路由 'application_id' => $model->id, 'customer_name' => $model->customer_name, 'part_name' => $model->part_name // 按需添加其他需要传递的字段 ], ['class' => 'btn btn-success']); } ?>
目标动作(比如PartsController的create)接收参数:
public function actionCreate() { $model = new Parts(); // 接收并赋值传递过来的参数 if (Yii::$app->request->get('application_id')) { $model->application_id = Yii::$app->request->get('application_id'); $model->customer_name = Yii::$app->request->get('customer_name'); $model->part_name = Yii::$app->request->get('part_name'); // 其他字段同理 } if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); }
方案2:通过Session传递数据(适合多字段/敏感数据)
如果要传递的数据较多,或者不想暴露在URL里,用Session存储数据更合适。我们可以用表单提交的方式把数据存到Session,再跳转到录入页面。
按钮替换为表单提交:
<?php if($model->status == "Approved") { ?> <?php $form = ActiveForm::begin([ 'action' => ['/parts/prepare-create'], // 新增一个中间动作存Session 'method' => 'post' ]); ?> <?= Html::hiddenInput('application_id', $model->id) ?> <?= Html::hiddenInput('customer_name', $model->customer_name) ?> <?= Html::hiddenInput('part_name', $model->part_name) ?> <!-- 其他需要传递的隐藏字段 --> <?= Html::submitButton('Insert into Parts', ['class' => 'btn btn-success']) ?> <?php ActiveForm::end(); ?> <?php } ?>
新增中间动作prepare-create:
public function actionPrepareCreate() { if (Yii::$app->request->isPost) { // 把POST数据存入Session Yii::$app->session->set('part_application_data', [ 'application_id' => Yii::$app->request->post('application_id'), 'customer_name' => Yii::$app->request->post('customer_name'), 'part_name' => Yii::$app->request->post('part_name'), // 其他字段 ]); // 跳转到录入表单页面 return $this->redirect(['create']); } return $this->redirect(['index']); }
在create动作读取Session数据:
public function actionCreate() { $model = new Parts(); // 从Session读取数据并赋值 $sessionData = Yii::$app->session->get('part_application_data'); if ($sessionData) { $model->load($sessionData, ''); // 第二个参数为空,适配Session数组格式 // 用完及时删除Session,避免重复填充 Yii::$app->session->remove('part_application_data'); } if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); }
方案3:关联模型查询传递(最优雅,推荐)
如果你的零件申请模型和录入模型有关联(比如PartApplication和Parts),其实只需要传递申请ID,然后在目标动作里通过ID查询完整数据,再赋值给录入模型,这种方式最安全也最简洁。
按钮代码:
<?php if($model->status == "Approved") { echo Html::a('Insert into Parts', [ '/parts/create', 'application_id' => $model->id ], ['class' => 'btn btn-success']); } ?>
create动作查询关联数据:
public function actionCreate() { $model = new Parts(); $applicationId = Yii::$app->request->get('application_id'); if ($applicationId) { // 假设你的申请模型是PartApplication $applicationModel = PartApplication::findOne($applicationId); if ($applicationModel && $applicationModel->status == "Approved") { // 把申请数据赋值给零件模型 $model->customer_name = $applicationModel->customer_name; $model->part_name = $applicationModel->part_name; $model->application_id = $applicationId; // 其他字段 } } if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); }
注意事项
- 一定要验证申请的状态:比如在目标动作里再次检查申请是否为
Approved,避免未获批的数据被非法传递。 - 如果用GET传递参数,注意URL长度限制,数据较多时优先选择Session或关联查询方案。
内容的提问来源于stack exchange,提问作者user5469526
相关产品推荐
相关产品推荐

