#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. Таким образом, он покажет индекс, а также должен иметь возможность печатать