PrestaShop liefert Ihnen Bestelldokumente und einen Drucken-Button im Browser. Was es nicht liefert, ist ein Bon, der in dem Moment im Hinterzimmer erscheint, in dem eine Kundin bezahlt: Dafür muss der Bestellablauf mit einem über das Internet erreichbaren Drucker verbunden werden.
Kurze Antwort: Hängen Sie sich an actionOrderStatusPostUpdate, prüfen Sie, ob der neue Status "bezahlt" bedeutet, bauen Sie den Bon und senden Sie ihn per POST. Ein fertiges Modul erledigt das über Einstellungen statt Code; ein kleines eigenes Modul macht es genau auf Ihre Art. Keines von beiden braucht einen Computer, der im Laden läuft.
Zwei Wege
| Modul | Eigener Hook | |
|---|---|---|
| Einrichtung | Installieren und konfigurieren | Rund 20 Zeilen PHP |
| Kontrolle über das Layout | Template-Einstellungen | Vollständig |
| Multishop | Erledigt | Ihre Aufgabe |
| Am besten für | Die meisten Shops | Spezifisches Routing oder eigene Logik |
Der PrestaShop-Konnektor deckt den ersten Weg ab; die Moduldokumentation führt durch Installation und Bon-Einstellungen.
Der Hook-Weg
PrestaShop feuert actionOrderStatusPostUpdate, nachdem der Bestellstatus geändert und gespeichert wurde. Das ist der richtige Moment: Das frühere actionOrderStatusUpdate feuert, bevor die Änderung festgeschrieben ist.
public function hookActionOrderStatusPostUpdate($params)
{
/** @var OrderState $newStatus */
$newStatus = $params['newOrderStatus'];
$order = new Order((int) $params['id_order']);
// Erst drucken, wenn die Zahlung akzeptiert ist; `paid` deckt die Standardzustände ab.
if (!$newStatus->paid) {
return;
}
$zeilen = [
'BESTELLUNG ' . $order->reference,
date('d.m.Y H:i'),
'',
];
foreach ($order->getProducts() as $product) {
$zeilen[] = (int) $product['product_quantity'] . 'x ' . $product['product_name'];
}
$zeilen[] = '';
$zeilen[] = 'SUMME: ' . 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", $zeilen),
'origin' => 'ps-' . $order->id,
]),
]);
curl_exec($ch);
curl_close($ch);
}
PrestaShop-spezifische Fallstricke
Statuswechsel sind nicht eindeutig. Ein Zahlungsmodul kann denselben Bezahlt-Status zweimal setzen, und ein Händler kann ihn im Backoffice manuell erneut anwenden. Speichern Sie ein Kennzeichen (eine Meta-Zeile an der Bestellung oder eine eigene Tabelle), und steigen Sie früh aus, wenn die Bestellung bereits gedruckt wurde. Ohne das ist jedes erneute Speichern ein weiterer Bon.
newOrderStatus->paid ist der verlässliche Test. Fest verdrahtete Status-IDs brechen an dem Tag, an dem jemand einen eigenen Status anlegt oder Sie in einen anders konfigurierten Shop ausliefern. Das Kennzeichen paid ist das, was Zahlungsmodule tatsächlich setzen.
Multishop braucht einen Drucker je Shop. Lesen Sie in einer Multishop-Installation die Drucker-ID aus dem Shop-Kontext statt aus einem einzigen globalen Konfigurationswert, sonst druckt jeder Shop auf dasselbe Gerät.
Timeouts blockieren die Kundschaft. Der Hook läuft innerhalb des Requests, der die Bestellung bestätigt. Ein CURLOPT_TIMEOUT von fünf Sekunden ist eine Obergrenze dafür, wie lange jemand im Checkout wartet, wenn die API nicht erreichbar ist: Halten Sie ihn niedrig und behandeln Sie Zustellfehler asynchron, statt den Checkout von einem Drucker abhängig zu machen.
Produktnamen enthalten alles. Umlaute sind unproblematisch; Emoji und ungewöhnliche Symbole nicht. Transliterieren Sie, bevor Sie den Bon bauen: Das ist die häufigste Ursache für einen Drucker, der "einfach aufhört".
Bon-Layout
Fette Überschriften, ein Logo, ein QR-Code zur Bestellung, ein Barcode, automatischer Schnitt: All das sind Auszeichnungen innerhalb von printer_msg. Siehe die Layout-Referenz und, für einen rechnungsartigen europäischen Bon, EAN-13-Barcodes.
Beginnen Sie mit einem Testbon
Bevor Sie PrestaShop überhaupt anfassen, legen Sie ein kostenloses Konto an und drucken Sie einen Bon mit einem schlichten curl. Die Druckkette unabhängig zu prüfen bedeutet, dass Sie später bei einer Störung bereits wissen, ob Sie in PrestaShop oder beim Drucker suchen müssen.
Ebenfalls dazu: Shopify und WooCommerce folgen demselben Muster mit anderen Hooks.
FAQ
Welchen PrestaShop-Hook sollte ich zum Drucken einer Bestellung verwenden?
actionOrderStatusPostUpdate, der feuert, nachdem der Statuswechsel gespeichert wurde. Prüfen Sie newOrderStatus->paid, statt Status-IDs fest zu verdrahten, damit eigene Status und anders konfigurierte Shops weiter funktionieren.
Warum wird dieselbe Bestellung zweimal gedruckt?
Zahlungsmodule können denselben Bezahlt-Status mehrfach setzen, und Händler können ihn manuell erneut anwenden. Speichern Sie ein Gedruckt-Kennzeichen an der Bestellung und steigen Sie aus, wenn es bereits gesetzt ist.
Funktioniert das mit einer Multishop-Installation?
Ja, aber lesen Sie die Drucker-ID aus dem Shop-Kontext statt aus einem einzigen globalen Konfigurationswert, sonst druckt jeder Shop auf dasselbe Gerät.
Brauche ich einen Computer im Laden?
Nein. Ein Cloud-Drucker verbindet sich selbst über 4G, WLAN oder Ethernet, und ein vorhandener USB-Drucker ist über einen Raspberry-Pi-Adapter erreichbar.