Symfony表单确认提交后getClickedButton()返回null问题求助
问题原因
你手动调用form.submit()提交表单时,浏览器不会把点击的提交按钮的name和value参数一起发送给后端。而Symfony正是依靠这些参数识别哪个按钮被点击的,所以$form->getClickedButton()会返回null,进而触发报错。
解决方案
有两种简单的修复方式:
方式一:触发按钮原生点击事件
不用手动提交表单,用户确认后直接触发按钮的原生点击行为,浏览器会自动带上按钮参数:
$(document).on('click', '[data-button-confirm]', function (e) { e.preventDefault(); var $this = $(this); alertify.confirm('Confirmation', $(this).data('button-confirm'), function () { // 触发按钮原生click事件,代替手动提交表单 $this.get(0).click(); }, function () { $(this).blur(); } ).set('labels', { ok: '<i class="fa fa-check"></i> Confirm', cancel: '<i class="fa fa-times"></i> Cancel' }).set('defaultFocus', 'cancel'); });
方式二:添加隐藏字段传递按钮信息
如果不想触发原生点击,可以在表单里动态添加隐藏字段,把按钮的name和value传递给后端:
$(document).on('click', '[data-button-confirm]', function (e) { e.preventDefault(); var $this = $(this); var $form = $this.parents('form'); alertify.confirm('Confirmation', $(this).data('button-confirm'), function () { // 移除可能存在的同名隐藏字段 $form.find('input[name="' + $this.attr('name') + '"]').remove(); // 添加隐藏字段携带按钮信息 $form.append($('<input>', { type: 'hidden', name: $this.attr('name'), value: $this.attr('value') })); // 提交表单 $form.submit(); }, function () { $(this).blur(); } ).set('labels', { ok: '<i class="fa fa-check"></i> Confirm', cancel: '<i class="fa fa-times"></i> Cancel' }).set('defaultFocus', 'cancel'); });
验证
修改后,后端Symfony代码里的$form->getClickedButton()->getName()就能正常获取按钮名称,不会再出现Call to a member function getName() on null的错误。
内容的提问来源于stack exchange,提问作者Lolo
相关产品推荐
相关产品推荐

