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
相关产品推荐
相关产品推荐

