如何在Laravel控制器的store()方法中实现保存后弹出打印对话框
问题修复方案
核心问题梳理
打印对话框不触发的问题不是路由导致的,能正常加载voucher页面和数据说明路由逻辑没问题,问题出在按钮属性、控制器参数获取、模板语法和JS触发逻辑几个地方:
具体修复步骤
1. 修正提交按钮属性
当前的Save and print按钮类型是button,默认不会触发表单提交,改成submit类型才能把action_create参数传到后端:
<button type="submit" id="save-and-print" name="action_create" value="save_and_print">Save and print</button> <button type="submit" name="action_create" value="save">Save</button>
2. 修正控制器参数获取逻辑
store方法里判断提交动作时,不要混用post()和get()方法,统一用input()方法获取参数,避免POST请求下get()拿不到值:
if ($request->input('action_create') == 'save_and_print') { return view('receive-items.voucher', ['receive_items' => $receive_items,'allow_print' => $allow_print])->with($print_notification); } elseif ($request->input('action_create') == 'save') { return redirect()->route('receive-items.index')->with($success_notification); }
(顺便带上之前定义的$print_notification,保存成功的提示可以正常显示)
3. 修复voucher模板的HTML语法错误
模板里有多余的闭合标签,会导致DOM解析异常,进而影响JS执行,找到商品名称对应的行修正:
<td class="pl-0"> <center>{{ $item['product_item_no'] }}</center> <br /> <center>{{ $item['product_name'] }}</center> </td>
4. 调整打印JS的位置和触发逻辑
原来的JS放在</body>和</html>之间不符合HTML规范,且未等待页面资源加载完成就调用打印,可能触发失败,改成如下写法,放到</body>标签之前:
@if($allow_print) <script type="text/javascript"> // 等待页面所有资源加载完成后再触发打印 window.addEventListener('load', function() { window.print(); // 可选配置:打印完成后自动跳转到列表页,符合常规操作逻辑 window.location.href = "{{ route('receive-items.index') }}"; }); </script> @endif </body>
如果需要打印样式和显示样式一致,还可以把style标签的media属性改成media="all",同时覆盖屏幕和打印场景:
<style type="text/css" media="all">
冗余路由清理
你定义的Route::post('/print/voucher')路由实际没有用到,可以直接删除,整个流程是表单提交到store方法后直接返回voucher视图,不需要额外的打印路由。
内容的提问来源于stack exchange,提问作者Jumar Juaton
相关产品推荐
相关产品推荐

