A questo punto, dopo aver creato il form per il profilo utente del nostro e-commerce nella lezione precedente, le opzioni di modifica al profilo sono terminate e possiamo dedicarci a mostrare l'elenco degli ordini recenti effettuati dal cliente.
@if(count($customer->orders) > 0)
<table class="table table-bordered table-striped">
<thead>
<tr>
<th scope="col">Date</th>
<th scope="col">Total</th>
<th scope="col">Items</th>
<th scope="col">Invoice</th>
</tr>
</thead>
<tbody>
@foreach($customer->orders as $order)
<tr>
<td>
{{ date('d/m/Y', strtotime($order->created_at)) }}
</td>
<td>
€ {{ $order->total }}
</td>
<td>
@php $cart_data = unserialize($order->cart->items); @endphp
@foreach($cart_data as $item)
{{ $item['name'] }}
@if (!$loop->last),@endif
@endforeach
</td>
<td>
<a href="{{ route('invoice', ['order' => $order->id]) }}" target="_blank"><i class="far fa-file-pdf"></i></a>
</td>
</tr>
@endforeach
</tbody>
</table>
@else
<p class="alert alert-info mt-lg-5">You currently don't have any orders.</p>
@endif
Nella tabella gli ordini vengono mostrati dal più recente al meno recente, con la data, i prodotti acquistati ed il link per scaricare la fattura in formato PDF.
mPDF per la fattura in formato PDF
Per realizzare quest'ultima feature possiamo utilizzare la libreria mPDF. Questa libreria ha la caratteristica di supportare HTML e CSS per generare il file PDF finale. L'installazione è molto semplice:
composer require mpdf/mpdf
Dobbiamo quindi creare il metodo nel nostro controller principale che andrà a generare la fattura partendo dall'ID dell'ordine passato come parametro alla route.
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Product;
use App\Customer;
use App\Order;
use App\CartModel;
use App\VerificationToken;
use App\Country;
use App\Province;
use App\Municipality;
use Illuminate\Http\Request;
use Mpdf\Mpdf;
class ShopController extends Controller
{
public function invoice(Order $order)
{
$customer = Customer::find($order->customer_id);
$cart_items = unserialize($order->cart->items);
$styles = file_get_contents(asset('assets/css/invoice.css') );
$html = '<img src="' . asset('favicon.png') . '">';
$html .= '<h1>Invoice for order n. ' . $order->id . '</h1>';
$html .= '<address>' . $customer->firstname . ' ' . $customer->lastname . '<br>' . $customer->email . '</address>';
$html .= '<hr>';
$html .= '<table><thead><tr><th scope="col">Product</th><th scope="col">Quantity</th><th scope="col">Subtotal</th></tr></thead>';
$html .= '<tbody>';
foreach($cart_items as $item) {
$html .= '<tr><td>' . $item['name'] . '</td><td>' . $item['quantity'] . '</td><td>€ ' . $item['subtotal']. '</td></tr>';
}
$html .= '</tbody>';
$html .= '</table>';
$html .= '<p><strong>Total: </strong>€ ' . $order->total . '</p>';
$pdf_name = 'invoice-' . $order->id . '.pdf';
$mpdf = new Mpdf();
$mpdf->SetTitle('Invoice for order n. ' . $order->id);
$mpdf->WriteHTML($styles,\Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY);
return $mpdf->Output($pdf_name, 'I');
}
}
mPDF ci permette di fatto di aggiungere un nostro foglio di stile CSS che andrà a definire il layout del file PDF finale. In questo caso stiamo usando un file CSS specifico per la fattura. Ci permette inoltre di impostare un titolo per il file PDF e, volendo, anche un footer da ripetere su ogni pagina.
Dato che la nostra route non ha una view ma la view è di fatto l'output restituito dal metodo Output()
della libreria mPDF, dobbiamo necessariamente usare l'istruzione return
per poter visionare nel browser il documento PDF finale.
Il parametro I
del metodo Output()
indica che il file verrà visualizzato nel browser senza forzarne il download. Se al contrario avessimo voluto forzarne il download, avremmo dovuto usare il parametro D
.
Infine per quanto riguarda la wish list con i prodotti preferiti dall'utente, questo sarà trattato nel prossimo capitolo in quanto merita una esposizione separata.
Si noti per il momento come il processo necessario a realizzare la pagina del profilo utente all'interno del nostro e-commerce sia risultato enormemente semplificato grazie alle relazioni tra i modelli di Laravel.