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

Laravel 7选中商品ID打印PDF条码异常:总是输出全部条码

Laravel 7 商品条码打印异常问题

需求:选中部分商品ID时打印对应条码PDF,未选中任何商品则打印全部商品条码,但目前选中部分商品后,返回的PDF仍包含全部商品条码。


1. 商品列表页多选框代码

<td> <input style="width:20px" type="checkbox" class="form-control select55" id="check-{{ $product->id }}" name="selected[]" value="{{ $product->id }}"></td>

<script>
        $(".select55").on('click', function() {
            let productIdss = [];
            $("tbody input[type='checkbox']").each((index, input) => {
                if(input.checked) {
                    productIdss.push($(input).val());
                }
            })
            $(".input_productss").val(productIdss);
        });
</script>

2. 控制器条码请求处理代码

if($request->has('barcode') && $request->barcode == 'true') {
    $mpdf = new Mpdf();
    $mpdf->autoScriptToLang = true;
    $mpdf->autoLangToFont = true;

    if($request->has('product_idss')) {
        // Create mpdf for selected product ID
        $productIds = explode(',', $request->input('product_idss'));
        $products = Product::whereIn('id', $productIds)->with('variants')->get();
        $currentLang = Language::where('regional','like', '%' . app()->getLocale() . '%')->first();
        Carbon::setLocale(app()->getLocale());

        foreach ($productIds as $productId) {
            $product = $products->where('id', $productId)->first();
            if($product) {
                if($product->price_of_currency) {
                    $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl, 'productIds' => $productIds])->render();
                    $mpdf->WriteHTML($html);
                } else {
                    if($product->variants && $product->variants->count() > 0) {
                        foreach ($product->variants as $variant) {
                            $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl, 'variant' => $variant, 'productIds' => $productIds])->render();
                            $mpdf->WriteHTML($html);
                        }
                    } else {
                        $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl, 'productIds' => $productIds])->render();
                        $mpdf->WriteHTML($html);
                    }
                }
                $mpdf->AddPage();
            }
        }
    } else {
        // Create mpdf for all products
        $products = $products->with('variants')->get();
        $currentLang = Language::where('regional','like', '%' . app()->getLocale() . '%')->first();
        Carbon::setLocale(app()->getLocale());

        foreach ($products as $product) {
            if($product->price_of_currency) {
                $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl])->render();
                $mpdf->WriteHTML($html);
            } else {
                if($product->variants && $product->variants->count() > 0) {
                    foreach ($product->variants as $variant) {
                        $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl, 'variant' => $variant])->render();
                        $mpdf->WriteHTML($html);
                    }
                } else {
                    $html = view('categories.products.barcodes', ['product' => $product,'rtl' => $currentLang->rtl])->render();
                    $mpdf->WriteHTML($html);
                }
            }
            $mpdf->AddPage();
        }
    }

    $mpdf->Output('invoices/products_barcodes.pdf', \Mpdf\Output\Destination::FILE);
    return redirect()->to(asset('invoices/' . 'products_barcodes' . '.pdf'));
}

3. 条码视图模板代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>{{ $product->id }}</title>
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=Cairo&display=swap" rel="stylesheet">
        <style>
            .invoice-box {
                width: 188.97637795px;
                height: 100%;
                padding: 20px 0;
                font-size: 16px;
                font-family: "Cairo", sans-serif;
            }

        </style>
    </head>

    <body>
        <div class="invoice-box @if($rtl) rtl @endif">
            <table>
                <tr>
                    <td colspan="2"  style="text-align: center">
                        <span>{{ $product->name . '-' . $product->sku }}</span>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        @if($variant)
                            <img style="width: 100%; height: 50px" src="{{ asset('products_barcodes/' . $variant->barcode) }}" alt="">
                        @else
                            <img style="width: 100%; height: 50px" src="{{ asset('products_barcodes/' . $product->barcode) }}" alt="">
                        @endif
                    </td>
                </tr>

                @if(isset($variant))
                    <tr>
                        <td colspan="2"  style="text-align: center">
                            <span>{{ $variant->variant . '-' . $variant->price->price_after_discount }}</span>
                        </td>
                    </tr>
                @else
                    <tr>
                        <td colspan="2"  style="text-align: center">
                            <span>{{ $variant->variant . '-' . $products->price_of_currency->price_after_discount }}</span>
                        </td>
                    </tr>
                @endif
            </table>
        </div>
    </body>
</html>

问题修复方案

1. 前端参数传递校验

  • 确保页面存在用于存储选中ID的隐藏输入框:
    <input type="hidden" name="product_idss" class="input_productss">
    
  • 优化多选框事件处理,确保选中ID以逗号分隔存入输入框:
    $(".select55").on('change', function() {
        let productIdss = $(".select55:checked").map(function() {
            return $(this).val();
        }).get().join(',');
        $(".input_productss").val(productIdss);
    });
    

2. 控制器逻辑修正

  • 修改选中商品的判断条件,避免空参数进入选中分支:
    // 原判断
    if($request->has('product_idss')) {
    // 修改为
    if($request->has('product_idss') && !empty(trim($request->input('product_idss')))) {
    }
    
  • 未选中商品分支中,初始化全量商品查询:
    // 原代码
    $products = $products->with('variants')->get();
    // 修改为
    $products = Product::with('variants')->get();
    

3. 视图模板错误修复

修正未选中变体时的变量引用错误:

@else
    <tr>
        <td colspan="2"  style="text-align: center">
            <span>{{ $product->price_of_currency->price_after_discount }}</span>
        </td>
    </tr>
@endif

内容的提问来源于stack exchange,提问作者Yehia Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:47:01