Shopware bietet über den Plugin-Store einen großen Marktplatz an Erweiterungen, um den Shop an eigene Bedürfnisse anpassen zu können. Um Ihren Kunden die Möglichkeit geben zu können, wann Sie als Händler etwas verschicken sollen, gibt es z.B. das Plugin Wunsch-Lieferdatum. Dieses Plugin erweitert aber nur den Shop – Ihre Kunden können (je nach Einstellung) im Checkout ein eigenes Datum angeben – diese Information wird aber nicht in die für MERCATOR aufbereiteten Bestelldateien übertragen (da es ein zusätzlich erstelltes Datenfeld ist, welches nicht im Standard vorhanden ist). Dieses Tutorial beschreibt Ihnen, wie Sie über eine kleine Erweiterung innerhalb der Shopware Schnittstelle MerWare dieses Feld mit in Bestelldateien aufnehmen und in MERCATOR als „geplantes Lieferdatum“ verwenden können.

Vorbereitung

Wie im Beitrag Plugin-System innerhalb der Shopware Schnittstelle MerWare verfügbar erklärt, kann die Shopware Schnittstelle MerWare über eigene Plugin-Klassen erweitert werden, um eigene Funktionalitäten in der sonst geschlossenen Kommunikation zwischen Warenwirtschaft und Shop nutzen zu können. Nach diesem Schema gehen wir in diesem Tutorial vor, um eine eigene Datei an- und abzulegen, die …

  • das Event onExportOrder abgreift, um Bestellungen vor der finalen Speicherung anzupassen
  • ein Freitextfeld abgreift, in unserem Beispiel deliverydateDate des Plugins Wunsch-Lieferdatum
  • dieses Freitextfeld speichert, um als geplantes Lieferdatum importiert werden zu können

Schritt 1: Plugin Datei

Erstellen Sie eine Datei WunschLieferdatum.php im MerWare Custom-Plugin Verzeichnis auf Ihrem Webserver unter engine/Shopware/Plugins/Community/Backend/TdsMerware/Components/TdsMerware/Plugins. Achten Sie bei solchen Plugin Klassen darauf, identische Klassen- als auch Dateinamen zu verwenden.

Es reicht zunächst, eine leere Plugin-Hülle anzulegen, die erst in den weiteren Schritten konkreter mit Logik und Inhalten gefüllt wird. Folgender Code kann dafür als Start dienen:

<?php

/**
 * MerWare is a plugin to connect the MERCATOR ERP with a Shopware shop.
 */

namespace Shopware\Components\TdsMerware\Plugins;

use Shopware\Components\TdsMerware\Core\Plugin\AbstractPlugin;
use Shopware\Components\TdsMerware\Core\Plugin\PushEvent;

/**
 * Plugin to add (custom) delivery dates to ERP orders.
 *
 * @package Shopware\Components\TdsMerware\Plugins
 */

class WunschLieferdatum extends AbstractPlugin
{

    /**
     * Catch event function to add custom attributes to order objects.
     *
     * @param \Shopware\Components\TdsMerware\Core\Plugin\PushEvent $event
     */

    public function onExportOrder(PushEvent $event)
    {

        

    }

}

Schritt 2: Bestellung abrufen

Mit der fertigen Plugin-Hülle kann nun die eigentliche Verarbeitungslogik folgen, um ein (an sich ein beliebiges) Attribut abzugreifen und einzutragen. Die eigene Event-Funktion onExportOrder wird von MerWare angestoßen, nachdem die Bestellung prinzipiell für MERCATOR programmatisch aufbereitet wurde, aber noch nicht als XML Datei gespeichert wurde. Als Event-Parameter steht die Bestellung als Objekt zur Verfügung (das aufbauende Interface kann unter engine/Shopware/Plugins/Community/Backend/TdsMerware/Components/TdsMerware/Export/Service/OrderInterface.php eingesehen werden).

Um zusätzliche Daten der Bestellung (wie in diesem Tutorial ein Freitextfeld) bearbeiten zu können, müssen diese zunächst geholt werden. Mit Hilfe der lokalen Shopware API Ressourcen in Verbindung mit der Bestellnummer (aus dem Bestell-Objekt) kann die gesammte Bestellung bezogen werden. Um dies zu erreichen, können wir eine eigene Hilfsfunktion im Plugin ablegen, die anhand der Bestellnummer eine Bestellung als array zurückliefert:

/**
 * Helper-function to get full order details.
 *
 * @param string $orderNumber
 *
 * @return array
 */

private function getOrderByNumber($orderNumber)
{

    $order = [];

    try {

        $shopResource = \Shopware\Components\Api\Manager::getResource('Order');

        $order = $shopResource->getOneByNumber($orderNumber);

    } catch (\Exception $e) {

        // unable to load order object

    }

    return $order;

}

Schritt 3: Lieferdatum eintragen

Mit der gerade angelegten Funktion kann nun die gesamte Bestellung von Shopware abgerufen werden. Nach dem Bezug der Bestellung kann das Freitextfeld deliverydateDate im Bereich attribute gelesen und geprüft werden. Falls der Kunde ein Datum im Checkout angegeben hat und dieses gespeichert wurde, soll dieses nun in der Bestellung hinterlegt werden. Dafür nutzen wir die set Methode setDeliveryDate, um das Attribut der Shopware Bestellung in das Bestell-Objekt für MERCATOR zu hinterlegen. Folgend die aktualisierte Variante der onExportOrder Methode:

public function onExportOrder(PushEvent $event)
{

    /**
     * @var \Shopware\Components\TdsMerware\Export\Service\OrderInterface $order
     */

    $order = $event->getData();

    if (isset($order)) {

        $orderNumber = $order->getOrderNumber();

        if (!empty($orderNumber)) {

            $apiOrder = $this->getOrderByNumber($orderNumber);

            if (!empty($apiOrder)) {

                $deliveryDate = $apiOrder['attribute']['deliverydateDate'];

                if (!empty($deliveryDate)) {

                    $order->setDeliveryDate($deliveryDate);

                }

            }

        }

    }

}

Wir können im genannten Code den Ablauf noch einmal verfolgen: Prüfung der Bestellung als Parameter (Zeile 10), Bezug der Bestellnummer (Zeile 12), Bezug der Bestellung anhand der Bestellnummer (Zeile 16) und die Abfrage und Speicherung des Datums in das Objekt der MERCATOR Bestellung (Zeile 24).

Nach einer Speicherung und Aktualisierung der Plugin-Datei kann die Funktionalität getestet werden, indem Sie eine Bestellung mit einem Wunsch-Lieferdatum im Shop absetzen. Zum einen sollte die XML-Bestelldatei Ihr angegebenes Lieferdatum enthalten (im Feld LIEFERDATUM), zum anderen sollte nach einem Import in MERCATOR dieses Datum im Datenfeld geplantes Lieferdatum enthalten sein. Falls Sie andere Plugins einsetzen, lässt sich das hier genannte Beispiel übertragen lassen: Passen Sie dafür das zum Plugin passende Freitextfeld im Code an (beachten Sie die passende Formatierung!).

Fazit

Mit diesem Beispiel haben Sie kennengelernt, wie einfach strukturierter Code Bestellungen für MERCATOR anpassen kann – updatesicher und ohne Änderungen am Schnittstellen-Core. Folgend das behandelte Beispiel als vollständiger Code:

<?php

/**
 * MerWare is a plugin to connect the MERCATOR ERP with a Shopware shop.
 */

namespace Shopware\Components\TdsMerware\Plugins;

use Shopware\Components\TdsMerware\Core\Plugin\AbstractPlugin;
use Shopware\Components\TdsMerware\Core\Plugin\PushEvent;

/**
 * Plugin to add (custom) delivery dates to ERP orders.
 *
 * @package Shopware\Components\TdsMerware\Plugins
 */

class WunschLieferdatum extends AbstractPlugin
{

    /**
     * Catch event function to add custom attributes to order objects.
     *
     * @param \Shopware\Components\TdsMerware\Core\Plugin\PushEvent $event
     */

    public function onExportOrder(PushEvent $event)
    {

        /**
         * @var \Shopware\Components\TdsMerware\Export\Service\OrderInterface $order
         */

        $order = $event->getData();

        if (isset($order)) {

            $orderNumber = $order->getOrderNumber();

            if (!empty($orderNumber)) {

                $apiOrder = $this->getOrderByNumber($orderNumber);

                if (!empty($apiOrder)) {

                    $deliveryDate = $apiOrder['attribute']['deliverydateDate'];

                    if (!empty($deliveryDate)) {

                        $order->setDeliveryDate($deliveryDate);

                    }

                }

            }

        }

    }

    /**
     * Helper-function to get full order details.
     *
     * @param string $orderNumber
     *
     * @return array
     */

    private function getOrderByNumber($orderNumber)
    {

        $order = [];

        try {

            $shopResource = \Shopware\Components\Api\Manager::getResource('Order');

            $order = $shopResource->getOneByNumber($orderNumber);

        } catch (\Exception $e) {

            // unable to load order object

        }

        return $order;

    }

}