Как я могу выполнить функцию сохранения и печати в хранилище laravel в контроллере?

#jquery #ajax #laravel #printing #routes

Вопрос:

У меня есть кнопка, которая выполняет сохранение и печать. Я уже могу выполнить store() функцию сохранения, но не печать. Когда я имел в виду печать, это означает открытие диалогового окна печати переданных данных.

Вот моя кнопка:

 <button type="button" 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>
 

ReceiveItemsController.php

 public function index() {
        return view('receive-items.index', ['has_id' => false]);
    }

    public function indexWithId($product_id) {
        return view('receive-items.index', ['product_id' => $product_id, 'has_id' => true]);
    }

    public function create() {
        return view('receive-items.index');
    }

    public function store(Request $request) {  
        $allow_print = true;
        $product_ids = array_map('intval', $request->product_id);
        $qty_per_item = array_map('intval', $request->qty);

        ReceiveItems::create([
            'created_at' => Carbon::now()->timestamp,
            'type' => 'Receiving',
            'product_id' => $product_ids,
            'no_of_items' => $request->no_of_items,
            'qty_per_item' => $qty_per_item,
            'total' => $request->total,
            'payment' => 'Already paid'
        ]);


        $print_notification = array(
            'message' => 'Saved successfully! Printing now...',
            'alert-type' => 'success'
        );

        $success_notification = array(
            'message' => 'New products has been added successfully!',
            'alert-type' => 'success'
        );

        $receive_items = $this->printVoucher($product_ids, $qty_per_item);

        if ($request->post('action_create') == 'save_and_print') {
            return view('receive-items.voucher', ['receive_items' => $receive_items,'allow_print' => $allow_print]);
        } elseif ($request->get('action_create') == 'save') {
            return redirect()->route('receive-items.index')->with($success_notification);
        }
    }

public function printVoucher($product_ids, $qty_per_item) {
        $items = [];
        foreach($product_ids as $product_item_no => $product_id) {
            $products = Product::where('id', '=', $product_id); 
            $voucher_cost = $products->value('cost');

            $items[] = array(
                'product_item_no' => $product_item_no   1,
                'product_id' => $product_id,
                'product_name' => $products->value('name'),
                'size' => $products->value('size'),
                'qty_addend' => $qty_per_item[$product_item_no],
                'voucher_cost' => $voucher_cost,
                'ext_cost' => number_format($voucher_cost * $qty_per_item[$product_item_no], 2),

            );
        }
        return $items;
    }
 

маршрут:

  Route::post('/print/voucher', function() { return view('receive-items.voucher'); });
 

voucher.blade.php

  <!DOCTYPE html>
<html lang="en">
    <head>
        <title>Voucher</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style type="text/css" media="screen">
            * {
                font-family: Arial, Helvetica, sans-serif;
            }
            html, body{
                box-sizing: border-box;
                margin: 0;
                padding: 20px;
                height: 100%;
                font-size: 13px;
                font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
                line-height: 1.5;
            }
            h4 {
                 margin-top: 0;
                 margin-bottom: 0.5rem;
            }
            p {
                 margin-top: 0;
                 margin-bottom: 1rem;
            }
            strong {
                 font-weight: bolder;
            }
            img {
                 vertical-align: middle;
                 border-style: none;
            }
            table {
                 border-collapse: collapse;
            }
            th {
                 text-align: inherit;
            }
            h4, .h4 {
                 margin-bottom: 0.5rem;
                 font-weight: 500;
                 line-height: 1.2;
            }
            h4, .h4 {
                 font-size: 1.5rem;
            }
            .table {
                 width: 100%;
                 margin-bottom: 1rem;
                 color: #212529;
            }
            .table th, .table td {
                 padding: 0.75rem;
                 vertical-align: top;
                 border-top: 1px solid #dee2e6;
            }
            .table thead th {
                 vertical-align: bottom;
                 border-bottom: 2px solid #dee2e6;
            }
            .table tbody  tbody {
                 border-top: 2px solid #dee2e6;
            }
            /**
            * =utils
            **/
            .border-0 {
                border: none !important;
            }
            .mt-5 {
                 margin-top: 3rem !important;
            }
            .pr-0, .px-0 {
                 padding-right: 0 !important;
            }
            .pl-0, .px-0 {
                 padding-left: 0 !important;
            }
            .text-right {
                 text-align: right !important;
            }
            .text-center {
                 text-align: center !important;
            }
            .text-uppercase {
                 text-transform: uppercase !important;
            }
            /**
            * =layout
            **/
            .coupon {
                position: relative;
                display:  inline-block;
                overflow:  hidden;
                border-radius: 10px;
            }

            .coupon-con {
                position: relative;
                width: 324px;
                height: 210px;
            }

            .coupon-con::before {
                content: '';
                position: absolute;
                left: -210px;
                display: block;
                width: 20px;
                height: 20px;
                border-radius: 50%;
                border: 200px solid #eee;
                clip: rect(0, auto, 210px, auto);
            }

            .coupon-con::after {
                content: '';
                position: absolute;
                right: -210px;
                display: block;
                width: 20px;
                height: 20px;
                border-radius: 50%;
                border: 200px solid #eee;
                clip: rect(0, auto, 210px, auto);
            }

            .cover-top {
                background-color: #eee;
                position: absolute;
                top: 0;
                width: inherit;
                height: 75px;
                border-top-left-radius: 10px;
                border-top-right-radius: 10px;
            }

            .coupon-btm {
                position: relative;
                width: 324px;
                height: 110px;
            }

            .coupon-btm::before {
                content: '';
                position: absolute;
                top: -210px;
                left: -210px;
                display: block;
                width: 20px;
                height: 20px;
                border-radius: 50%;
                border: 200px solid #eee;
                clip: rect(210px, auto, auto, auto);
            }

            .coupon-btm::after {
                content: '';
                position: absolute;
                top: -210px;
                right: -210px;
                display: block;
                width: 20px;
                height: 20px;
                border-radius: 50%;
                border: 200px solid #eee;
                clip: rect(210px, auto, auto, auto);
            }

            .cover-btm {
                background-color: #eee;
                position: absolute;
                bottom: 0;
                width: inherit;
                height: 75px;
                border-bottom-left-radius: 10px;
                border-bottom-right-radius: 10px;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="coupon">
                <div class="coupon-con">
                    <div class="cover-top"></div>
                    <div style="position: absolute; z-index: 9999; width: 100%;">
                        <img src="{{ asset('custom') }}/img/logo.png" alt="logo" width="150" />
                        <table class="table">
                            <thead>
                                <th>Item</th>
                                <th>Qty.</th>
                                <th>Cost</th>
                                <th>Ext. Cost</th>
                            </thead>
                            <tbody>
                                {{-- Items --}}
                                @foreach($receive_items as $item)
                                <tr>
                                    <td class="pl-0">
                                        <center>{{ $item['product_item_no'] }}</center>
                                        <br />
                                        <center></center>{{ $item['product_name'] }}</center>
                                    </td>
                                    <td>
                                        <center>{{ $item['qty_addend'] }}</center>
                                    </td>
                                    <td>
                                        <center>{{ $item['voucher_cost'] }}</center>
                                    </td>
                                    <td>
                                        <center>{{ $item['ext_cost'] }}</center>
                                    </td>
                                </tr>
                                @endforeach
                            </tbody>
                            <tfoot>
                                <tr>
                                    <td><strong>Total</strong></td>
                                    <td><strong></strong></td>
                                </tr>
                            </tfoot>
                        </table>
                    </div>
                </div>
                <div class="coupon-btm">
                    <div style="position: absolute; z-index: 9999; width: 100%;">
                        <table class="table">
                            <tbody>
                                <tr>
                                    <td class="border-0 pl-0" width="50%">
                                        <center><p><strong>Receiving Voucher</strong></p></center>
                                        <center><p>{{ $receive_items[0]['product_item_no'] }}</p></center>
                                    </td>
                                    <td class="border-0 pl-0" width="50%">
                                        <p><center><strong>Voucher Date</strong></center></p>
                                        <p><center></center></p>
                                    </td>
                                </tr>      
                            </tbody>
                        </table>
                    </div>
                    <div class="cover-btm"></div>
                </div>
            </div>
        </div>
    </body>
    @if($allow_print)
    <script type="text/javascript">
        (function() {
          window.print()
        })();
    </script>
    @endif
</html>
 

Этот код просто открывается voucher.blade.php вместе с $received_items данными, но не открывает диалоговое окно печати. Может быть, что-то не так с маршрутом?

Мы очень ценим любую помощь.

Ответ №1:

Похоже, что вы используете два блейд-файла. Так что просто добавьте window.print() в receive-items.voucher.blade.php , как показано ниже

 <script>
(function() {
  window.print()
})();
</script>
 

Так что после загрузки dom откроется окно печати.

Дополнительная информация

Вы также можете сократить свой лайк ниже

 if ($request->post('action_create') == 'save_and_print')
    return view('receive-items.voucher', ['receive_items' => $receive_items]);

  return redirect()->route('receive-items.index');
    
 

Обновить
С тех пор, как меня попросили напечатать в index.blade.php

Передайте дополнительную переменную в index.blade, чтобы вы могли использовать для этого опцию печати. Что-то вроде ниже

 public function index() {
   
$allowPrint = true; // Your logic goes here
        return view('receive-items.index', ['receive_items' => $receive_items,'allowPrint' => $allowPrint]);
   
}
 

index.blade.php

 @if($allowPrint)
<script>
(function() {
  window.print()
})();
</script>
@endif
 

Комментарии:

1. Теперь это работает. Спасибо @Nipun Tharuksha. Как я могу сделать так, чтобы это не открывало voucher.blade.php и просто остается на index.blade.php страница, но все равно откроется диалоговое окно печати?

2. Если это сработает, надеюсь, вы сможете принять мой ответ, спасибо

3. Я обновил ответ для печати через index.blade.php

4. Спасибо @Nipun Tharuksha. Я имею в виду, что я все еще хочу, чтобы он сохранял данные в функции store (), но вместо этого все равно будет отображаться страница индекса. Как я могу это сделать?

5. Таким образом, он покажет индекс, а также должен иметь возможность печатать