Yii2点击提交按钮设置model属性区分存草稿与发布的实现咨询
最优方案推荐(Yii原生规范实现)
首推你提到的思路a,这是Yii框架最标准的实现方式,不需要依赖JS运行,即使用户禁用浏览器JS也能正常工作,适配性最强,修改成本也最低。
实现步骤
1. 给提交按钮新增name和value属性
两个按钮使用同一个name参数,用不同的value区分提交类型:
<?= Html::submitButton(Yii::t('OfferModule.form', 'Save as draft'), [ 'class' => 'btn btn-outline btn-submit', 'id' => 'draft-btn', 'name' => 'submit_action', 'value' => 'draft' ]) ?> <?= Html::submitButton(Yii::t('OfferModule.form', 'Submit'), [ 'disabled' => 'disabled', 'class' => 'btn btn-primary btn-submit', 'id' => 'submit-btn', 'name' => 'submit_action', 'value' => 'publish' ]) ?>
2. 控制器内接收参数赋值给模型
在处理表单提交的控制器方法中,直接读取提交类型参数,给draft字段赋值即可:
// 正常加载表单提交的模型数据 if ($model->load(Yii::$app->request->post())) { // 读取提交类型,默认值可根据业务需求调整 $submitAction = Yii::$app->request->post('submit_action', 'draft'); $model->draft = $submitAction === 'draft' ? 1 : 0; // 后续正常走保存逻辑即可 if ($model->save()) { return $this->redirect(['index']); } }
其他思路的实现方案
如果你更习惯用JS处理交互,也可以选择思路b的实现,代码也很简洁:
思路b实现(JS动态赋值)
首先在表单内加一个draft字段的隐藏表单项:
<?= Html::activeHiddenInput($model, 'draft', ['id' => 'draft_field']) ?>
之后加JS监听两个按钮的点击事件,动态给隐藏字段赋值后再提交表单:
const draftBtn = document.getElementById('draft-btn'); const publishBtn = document.getElementById('submit-btn'); const draftField = document.getElementById('draft_field'); draftBtn.addEventListener('click', e => { e.preventDefault(); draftField.value = 1; e.target.form.submit(); }); publishBtn.addEventListener('click', e => { e.preventDefault(); draftField.value = 0; e.target.form.submit(); });
该方案依赖JS运行,兼容性略低于第一种原生方案。
思路c不推荐,逻辑冗余绕弯,没有前两种方案简洁高效。
内容的提问来源于stack exchange,提问作者Younica
相关产品推荐
相关产品推荐

