Websites und Anwendungen

Den Status einer Bestellung je nach Zahlungsart in PrestaShop ändern

Geprüft am 7 Min. Lesezeit Bestellungen PrestaShop

In PrestaShop entscheidet jedes Zahlungsmodul, welchen Status die Bestellung bei der Bestätigung erhält. Bei Nachnahme steht sie zum Beispiel auf „Warten auf Bestätigung Nachnahme“ und bei Überweisung auf „Warten auf Zahlungseingang Überweisung“. Wenn sie mit einem anderen Status eingehen soll, müssen Sie das zweite Argument des Aufrufs von validateOrder() im Zahlungsmodul ändern.

Wenn Sie nur den Namen, die Farbe oder die gesendete E-Mail ändern möchten, müssen Sie keinen Code anfassen: Bearbeiten Sie den Status unter Bestellungen > Status.

Wo der Status festgelegt wird

Er steht in der Datei controllers/front/validation.php jedes Zahlungsmoduls:

Modul Datei Zugewiesener Status
Nachnahme modules/ps_cashondelivery/controllers/front/validation.php PS_OS_COD_VALIDATION (in den 1.x-Versionen des Moduls PS_OS_PREPARATION)
Banküberweisung modules/ps_wirepayment/controllers/front/validation.php PS_OS_BANKWIRE
Scheck modules/ps_checkpayment/controllers/front/validation.php PS_OS_CHEQUE

Darin sehen Sie einen Aufruf wie diesen (Nachnahme-Modul 2.x und 3.x):

$this->module->validateOrder(
    (int) $this->context->cart->id,
    (int) Configuration::getGlobalValue(Ps_Cashondelivery::CONFIG_OS_CASH_ON_DELIVERY),
    (float) $this->context->cart->getOrderTotal(true, Cart::BOTH),
    $this->module->displayName,
    null,
    [],
    (int) $this->context->currency->id,
    false,
    $customer->secure_key
);

Das zweite Argument ist der Status. CONFIG_OS_CASH_ON_DELIVERY entspricht PS_OS_COD_VALIDATION. Damit die Bestellung zum Beispiel als „Bestellung in Bearbeitung“ eingeht, muss dieses Argument (int) Configuration::get('PS_OS_PREPARATION') lauten.

Das sind die Status, die PrestaShop mitbringt:

Schlüssel Status
PS_OS_CHEQUE Warten auf Zahlungseingang Scheck
PS_OS_PAYMENT Zahlung eingegangen
PS_OS_PREPARATION Bestellung in Bearbeitung
PS_OS_SHIPPING Versandt
PS_OS_DELIVERED Zugestellt
PS_OS_CANCELED Storniert
PS_OS_REFUND Erstattet
PS_OS_ERROR Zahlungsfehler
PS_OS_OUTOFSTOCK_PAID (oder PS_OS_OUTOFSTOCK) Lieferrückstand (bezahlt)
PS_OS_OUTOFSTOCK_UNPAID Lieferrückstand (nicht bezahlt)
PS_OS_BANKWIRE Warten auf Zahlungseingang Überweisung
PS_OS_WS_PAYMENT Remote-Zahlung eingegangen
PS_OS_COD_VALIDATION Warten auf Bestätigung Nachnahme

Beachten Sie, dass ein als bezahlt markierter Status (zum Beispiel PS_OS_PAYMENT) dazu führt, dass PrestaShop die Rechnung erzeugt und die Bestellung als bezahlt zählt. Bei Nachnahme oder Überweisung verwendet man normalerweise PS_OS_PREPARATION oder einen eigenen Status.

Wenn Sie unter Bestellungen > Status einen eigenen Status angelegt haben, verwenden Sie seine Nummer, die in der Spalte ID der Liste steht: zum Beispiel (int) 15.

Mit einem Override ändern (empfohlen)

Wenn Sie die Datei des Moduls direkt bearbeiten, geht die Änderung beim nächsten Update des Moduls verloren. Seit PrestaShop 1.7 können Sie den Controller des Moduls mit einem Override überschreiben, der außerhalb des Modulordners liegt.

Legen Sie für das Nachnahme-Modul die Datei override/modules/ps_cashondelivery/controllers/front/validation.php mit diesem Inhalt an:

<?php

class Ps_CashondeliveryValidationModuleFrontControllerOverride extends Ps_CashondeliveryValidationModuleFrontController
{
    public function postProcess()
    {
        $cart = $this->context->cart;
        $orderStep1 = $this->context->link->getPageLink('order', true, (int) $this->context->language->id, ['step' => 1]);

        if (!Validate::isLoadedObject($cart) || !$cart->id_customer || !$cart->id_address_delivery || !$cart->id_address_invoice || $cart->isVirtualCart()) {
            Tools::redirect($orderStep1);
        }

        $customer = new Customer($cart->id_customer);
        if (!Validate::isLoadedObject($customer)) {
            Tools::redirect($orderStep1);
        }

        $this->module->validateOrder(
            (int) $cart->id,
            (int) Configuration::get('PS_OS_PREPARATION'), // Status, mit dem die Bestellung eingeht
            (float) $cart->getOrderTotal(true, Cart::BOTH),
            $this->module->displayName,
            null,
            [],
            (int) $this->context->currency->id,
            false,
            $customer->secure_key
        );

        Tools::redirect($this->context->link->getPageLink('order-confirmation', true, (int) $this->context->language->id, [
            'id_cart' => (int) $cart->id,
            'id_module' => (int) $this->module->id,
            'id_order' => (int) $this->module->currentOrder,
            'key' => $customer->secure_key,
        ]));
    }
}

Ersetzen Sie PS_OS_PREPARATION durch den Schlüssel des gewünschten Status. Danach:

  1. Prüfen Sie, dass unter Erweiterte Einstellungen > Leistung die Option Alle Overrides deaktivieren auf Nein steht.
  2. Löschen Sie die Datei var/cache/prod/class_index.php (in PrestaShop 1.6 cache/class_index.php) oder klicken Sie auf derselben Seite auf Cache leeren, damit PrestaShop den Override erkennt.

Für Überweisung oder Scheck ist das Vorgehen dasselbe: Kopieren Sie die validation.php des Moduls nach override/modules/<módulo>/controllers/front/validation.php, benennen Sie die Klasse um, indem Sie Override ans Ende anhängen, und lassen Sie sie die ursprüngliche erweitern. Ändern Sie nur den Status im Aufruf von validateOrder(). Wenn der ursprüngliche Controller private-Methoden verwendet, kopieren Sie sie ebenfalls in Ihre Klasse, denn aus dem Override lassen sie sich nicht aufrufen.

In PrestaShop 1.6

In 1.6 gibt es keine Overrides für Modul-Controller. Bearbeiten Sie direkt modules/cashondelivery/controllers/front/validation.php (oder die Datei des Zahlungsmoduls, das Sie verwenden) und ändern Sie das zweite Argument von validateOrder(), das im Nachnahme-Modul Configuration::get('PS_OS_PREPARATION') lautet. Notieren Sie die Änderung: Sie müssen sie wiederholen, wenn Sie das Modul aktualisieren.

Prüfen, ob es funktioniert

Geben Sie mit dieser Zahlungsart eine Testbestellung auf und öffnen Sie sie unter Bestellungen > Bestellungen: Im Verlauf muss der neue Status als erster Status erscheinen. Wenn weiterhin der vorherige erscheint, leeren Sie erneut den Cache aus Schritt 2.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.