使用Yii确认对话框时,如何在POST请求中传递提交按钮的名称和值?
解决Yii确认对话框提交时丢失按钮name和value的问题
问题原因
当你给提交按钮添加data-confirm和data-method="post"时,Yii的内置JS不会直接提交原表单,而是动态创建一个新的隐藏表单来发送POST请求。这个新表单不会自动包含原按钮的name和value,所以POST参数里就找不到对应的键值对。
解决方案
方案1:利用data-params传递参数
Yii的data-method支持通过data-params传递额外参数,把按钮的name和value作为参数传入即可:
<?= Html::submitButton('name', [ 'name' => 'action', 'value' => 'submitButtonValue', 'data' => [ 'confirm' => 'Are you sure?', 'method' => 'post', 'params' => [ 'action' => 'submitButtonValue' ] ], ]); ?>
动态生成的隐藏表单会自动包含action=submitButtonValue参数,POST请求里就能拿到对应值。
方案2:手动触发原表单提交(多按钮场景推荐)
如果页面存在多个提交按钮,更推荐这种方式:去掉data-method,自己绑定点击事件,确认后直接提交原表单。这样原按钮的name和value会被正常包含在POST请求中:
<?= Html::submitButton('name', [ 'name' => 'action', 'value' => 'submitButtonValue', 'class' => 'confirm-submit' // 自定义类用于绑定事件 ]); ?> <?php $this->registerJs(<<<JS $('.confirm-submit').on('click', function(e) { if (!confirm('Are you sure?')) { e.preventDefault(); // 取消默认提交行为 return false; } // 确认后原表单正常提交,按钮参数会被自动携带 }); JS ); ?>
这种方式完全保留原生表单提交逻辑,多个按钮的name/value都能被正确识别,适合区分不同操作按钮的场景。
方案3:全局修改Yii默认JS行为
如果需要让所有带data-confirm和data-method的按钮都自动携带自身参数,可以覆盖Yii的yii.confirm方法:
// 覆盖Yii默认的confirm方法 yii.confirm = function(message, okCallback, cancelCallback) { if (confirm(message)) { if (okCallback) { // 获取触发事件的按钮 var button = $(this); // 重写回调,添加按钮参数到动态表单 var originalCallback = okCallback; okCallback = function() { var form = originalCallback.call(this); if (form && button.attr('name')) { $('<input>').attr({ type: 'hidden', name: button.attr('name'), value: button.attr('value') }).appendTo(form); } return form; }; } okCallback(); } else if (cancelCallback) { cancelCallback(); } };
将这段JS放入全局JS文件中,所有符合条件的按钮都会自动带上自身的name/value参数。
内容的提问来源于stack exchange,提问作者Alexander Smirnov
相关产品推荐
相关产品推荐

