You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:12:01