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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:30:00