PrestaShop vi dà i documenti dell'ordine e un pulsante Stampa nel browser. Quello che non vi dà è uno scontrino che compare nel retro nel momento in cui il cliente paga: questo richiede di collegare il ciclo di vita dell'ordine a una stampante raggiungibile via internet.
Risposta breve: agganciate actionOrderStatusPostUpdate, verificate che il nuovo stato significhi "pagato", costruite lo scontrino e fate una POST. Un modulo già pronto fa questo con le impostazioni invece che con il codice; un piccolo modulo su misura lo fa esattamente a modo vostro. Nessuno dei due richiede un computer acceso in negozio.
Due strade
| Modulo | Hook su misura | |
|---|---|---|
| Messa in opera | Installare e configurare | Circa 20 righe di PHP |
| Controllo sull'impaginazione | Impostazioni del template | Totale |
| Multinegozio | Gestito | A vostro carico |
| Ideale per | La maggior parte dei negozi | Instradamento o logica specifici |
Il connettore PrestaShop copre la prima strada; la documentazione del modulo illustra installazione e impostazioni dello scontrino.
La strada dell'hook
PrestaShop lancia actionOrderStatusPostUpdate dopo che lo stato dell'ordine è cambiato ed è stato salvato. È il momento giusto: il precedente actionOrderStatusUpdate scatta prima che la modifica sia confermata.
public function hookActionOrderStatusPostUpdate($params)
{
/** @var OrderState $newStatus */
$newStatus = $params['newOrderStatus'];
$order = new Order((int) $params['id_order']);
// Stampare solo a pagamento accettato; `paid` copre gli stati standard.
if (!$newStatus->paid) {
return;
}
$righe = [
'ORDINE ' . $order->reference,
date('d/m/Y H:i'),
'',
];
foreach ($order->getProducts() as $product) {
$righe[] = (int) $product['product_quantity'] . 'x ' . $product['product_name'];
}
$righe[] = '';
$righe[] = 'TOTALE: ' . number_format($order->total_paid, 2) . ' ' . $this->context->currency->iso_code;
$ch = curl_init('https://www.expedy.fr/api/v2/printers/' . Configuration::get('MYMOD_PRINTER_UID') . '/print');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_HTTPHEADER => [
'Authorization: ' . Configuration::get('MYMOD_API_SID') . ':' . Configuration::get('MYMOD_API_TOKEN'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'printer_msg' => implode("\n", $righe),
'origin' => 'ps-' . $order->id,
]),
]);
curl_exec($ch);
curl_close($ch);
}
Trappole specifiche di PrestaShop
I cambi di stato non sono unici. Un modulo di pagamento può impostare due volte lo stesso stato pagato, e un commerciante può riapplicarlo a mano dal back office. Salvate un flag (una riga di meta sull'ordine o una tabella dedicata), e uscite subito se l'ordine è già stato stampato. Senza, ogni nuovo salvataggio è un altro scontrino.
newOrderStatus->paid è il test affidabile. Cablare gli id di stato si rompe il giorno in cui qualcuno aggiunge uno stato personalizzato o installate su un negozio configurato diversamente. Il flag paid è ciò che i moduli di pagamento impostano davvero.
Il multinegozio richiede una stampante per negozio. In un'installazione multinegozio, leggete l'id della stampante dal contesto del negozio invece che da un unico valore globale di configurazione, altrimenti tutti i negozi stampano sulla stessa macchina.
I timeout bloccano il cliente. L'hook gira dentro la richiesta che conferma l'ordine. Un CURLOPT_TIMEOUT di cinque secondi è un tetto a quanto un acquirente potrebbe aspettare se l'API non risponde: tenetelo basso, e trattate i fallimenti di consegna in modo asincrono invece di far dipendere il checkout da una stampante.
I nomi dei prodotti contengono di tutto. I caratteri accentati vanno bene; emoji e simboli insoliti no. Traslitterate prima di costruire lo scontrino: è la causa più comune di una stampante che "si ferma senza motivo".
Impaginazione dello scontrino
Intestazioni in grassetto, un logo, un QR code verso l'ordine, un codice a barre, taglio automatico: è tutto markup dentro printer_msg. Vedete il riferimento di impaginazione e, per uno scontrino in stile fattura europea, i codici a barre EAN-13.
Partite da uno scontrino di prova
Prima ancora di toccare PrestaShop, aprite un account gratuito e stampate uno scontrino con un semplice curl. Verificare la catena di stampa in modo indipendente significa che, quando più avanti qualcosa non va, sapete già se guardare in PrestaShop o alla stampante.
Da leggere anche: Shopify e WooCommerce seguono lo stesso schema con hook diversi.
FAQ
Quale hook di PrestaShop devo usare per stampare un ordine?
actionOrderStatusPostUpdate, che scatta dopo che il cambio di stato è stato salvato. Verificate newOrderStatus->paid invece di cablare gli id di stato, così stati personalizzati e negozi configurati diversamente continuano a funzionare.
Perché lo stesso ordine viene stampato due volte?
I moduli di pagamento possono applicare più volte lo stesso stato pagato, e i commercianti possono riapplicarlo a mano. Salvate un flag di stampa sull'ordine e uscite quando è già impostato.
Funziona con un'installazione multinegozio?
Sì, ma leggete l'id della stampante dal contesto del negozio invece che da un unico valore globale di configurazione, altrimenti tutti i negozi stampano sulla stessa macchina.
Serve un computer in negozio?
No. Una stampante cloud si collega da sola via 4G, Wi-Fi o Ethernet, e una stampante USB già presente si raggiunge con un adattatore Raspberry Pi.