Der Bereich Shopware Labs ist die Plattform für alle Entwickler. Hier findet man technische Dokumentationen und zahlreiche Tipps und Tricks rund um das Thema Programmieren. In dieser Rubrik stellen außerdem die Entwickler der shopware AG neue und experimentelle Lösungsansätze vor. Neue Funktionen, die in dieser Rubrik bereitgestellt werden, sind teilweise auch für zukünftige Releases geplant. Die Funktionen können dann ohne Programmierkenntnisse zukünftig direkt im Shopware Backend konfiguriert werden oder werden über Plugins bereitgestellt. Informationen über neue, geplante Funktionen finden Sie in unserer Roadmap.
Bitte beachten Sie, dass die hier bereitgestellten Lösungsansätze nicht offiziell supportet werden und nur eingebaut werden sollten, sofern Sie über das entsprechende, technische Wissen verfügen.
Verwendung Shopware API
0 KommentareVorwort
Im heutigen Tutorial widmen wir uns den Import- und Export-Möglichkeiten der Shopware API.
Folgendes wollen wir realisieren:
Unser Plugin soll neue Bestellungen automatisch, per eMail im XML-Format, an eine frei definierbare Mailadresse schicken
Export Bestellungen
Wie in den vorherigen Tutorials legen wir zunächst das Grundgerüst unseres Plugins an. Heute arbeiten wir im "Local" Namespace des Plugin-Systems, da das Plugin nur für Entwicklungs- und Lernzwecke gedacht ist.
- Legen Sie unterhalb von engine\Shopware\Plugins\Local\Backend\ das neue Verzeichnis TestApi an!
- Erstellen Sie eine neue Datei Bootstrap.php
Um die erste Aufgabe umzusetzen, müssen wir die Methode finden, die die Bestellungen in die Datenbank schreibt. Da das Bestellhandling im Frontend-Controller checkout stattfindet, schauen wir uns dort an, welche Funktionen für das Speichern der Bestellung in die Datenbank verantwortlich sind.
- Öffnen Sie die Datei Shopware/Controllers/Frontend/Checkout.php
- Navigieren Sie zur Methode saveOrder
In der Methode saveOrder wird eine Referenz auf das Objekt Shopware()->Modules()->Order() erzeugt. Ganz zum Ende der Methode wird die Funktion sSaveOrder aufgerufen. Die Frontend-Module liegen im Verzeichnis engine\core\class\ - also wechseln wir in dieses Verzeichnis und schauen uns die Datei sOrder.php genauer an.
(Anmerkung: Das die Namespaces an dieser Stelle unterschiedlich sind, ist beabsichtigt. In Shopware 4 werden die Frontend-Models / Klassen in den Ordner engine\Shopware\Modules\ verschoben)
In der Klasse sOrder finden wir die Methode saveOrder, die die Bestellung in die Datenbank einträgt und die generierte Bestellnummer zurückgibt. Perfekt, genau das haben wir gesucht.
Nun zurück zum Plugin. Wir wissen nun, an welche Funktion wir uns andocken müssen, um über eine neue Bestellung informiert zu werden.
Mit diesem Wissen erstellen wir nun die erste Komponente unseres Plugins, den Export der Bestellung als XML-Datei.
<?php class Shopware_Plugins_Backend_TestApi_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createHook( 'sOrder', 'sSaveOrder', 'onOrder', Enlight_Hook_HookHandler::TypeAfter, 0 ); $this->subscribeHook($event); $form = $this->Form(); $form->setElement('text', 'orderemail', array('label'=>'Bestellung an eMail','value'=>'info@example.com')); $form->save(); return true; } static function onOrder (Enlight_Event_EventArgs $args) { /* Die Funktion saveOrder gibt die Bestellnummer zurück, diese können wir per getReturn() abfangen */ $ordernumber = $args->getReturn(); // Zugriff auf Plugin-Konfiguration $config = Shopware()->Plugins()->Backend()->TestApi()->Config(); // Zugriff auf Export $export = Shopware()->Api()->Export(); // Über die ordernumber die ID der Bestellung auslesen $orderID = Shopware()->Db()->fetchOne("SELECT id FROM s_order WHERE ordernumber=?",array($ordernumber)); // Hauptdaten der Bestellung $order = current($export->sGetOrders(array("orderID"=>$orderID))); // Bestellpositionen $positions = $export->sOrderDetails(array("orderID"=>$orderID)); // Kundendaten $user = $export->sOrderCustomers (array("orderID"=>$orderID)); // XML-Export-Objekt erstellen $xml = Shopware()->Api()->convert->xml; $xml->sSettings['encoding'] = "ISO-8859-1"; // Unsere Bestellung in XML umwandeln $dump = $xml->encode(array("order"=>$order,"position"=>$positions,"user"=>$user)); // Mail verschicken $mail = Shopware()->Mail(); $mail->IsHTML(0); $mail->From = Shopware()->Config()->Mail; // Absender = Mail Shopbetreiber $mail->FromName = Shopware()->Config()->Mail; // Absender = Mail Shopbetreiber $mail->Subject = "Neue Bestellung $ordernumber"; // Betreff $mail->Body = "Neue Bestellung"; // Inhalt $mail->ClearAddresses(); // Vorherige Adressen entfernen // Die in der Plugin-Konfiguration eingetragene Adresse als Empfänger nehmen $mail->AddAddress($config->orderemail, ''); // XML-Datei als Attachment anfügen $mail->createAttachment( $dump, Zend_Mime::TYPE_OCTETSTREAM, Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $ordernumber.".xml" ); // Mail versenden $mail->Send(); } }
Das ging Ihnen zu schnell? Kein Problem, gehen wir den Code Step by Step durch:
$event = $this->createHook( 'sOrder', 'sSaveOrder', 'onOrder', Enlight_Hook_HookHandler::TypeAfter, 0 ); $this->subscribeHook($event);
In den vergangenen Tutorials haben wir hauptsächlich mit dem Event-Objekt gearbeitet, dieses stellt uns einfache Methoden bereit, um uns in bestimmte Ereignisse, die im Shop auftreten, einklinken zu können.
Natürlich kommt es aber auch vor, dass man bestimmte Kernfunktionen verändern will, die nicht an ein bestimmtes Ereignis gebunden sind oder aber es erscheint sinnvoller, bestimmte Funktionen direkt anzupassen.
Für diesen Anwendungsfall stellen wir die so genannten Hooks zur Verfügung. Diese bilden eine Schicht zwischen dem Plugin-System und allen Objekte, die im Shopware-Frontend zur Verfügung stehen.
Zum Beispiel gibt es unterhalb des Verzeichnisses engine\core\class eine ganze Reihe von Klassen, die verschiedene Frontend-Funktionen implementieren. In unserem Beispiel ist es die Klasse "sOrder", die wir erweitern möchten.
Die Parameter von createHook sind schnell erklärt:
- Parameter 1 - Objekt: Zunächst einmal definieren wir, welches Objekt wir manipulieren möchten
- Parameter 2 - Objekt-Methode: Dann legen wir fest, um welche Methode es geht
- Parameter 3 - Wir definieren, wie unsere eigene Methode heißt, mit der wir die Original-Methode beeinflussen möchten
- Parameter 4 - Zum Schluss müssen wir noch definieren, wie genau sich unsere Methode in den Ablauf integrieren soll
- Enlight_Hook_HookHandler::TypeAfter - Unsere Methode wird NACH der Original-Methode aufgerufen und erhält die Rückgabe der Methode als Parameter
- Enlight_Hook_HookHandler::TypeBefore - Unsere Methode wird VOR der Original-Methode aufgerufen, kann auf die Parameter der Original-Methode zugreifen und diese verändern
- Enlight_Hook_HookHandler::TypeReplace - Unsere Methode ersetzt die Originalmethode vollständig
In unserem Fall macht TypeAfter am meisten Sinn, da die Originalmethode die Bestellnummer zurückgibt und wir diese benötigen!
$form = $this->Form(); $form->setElement('text', 'orderemail', array('label'=>'Bestellung an eMail','value'=>'info@example.com')); $form->save();
Wir benötigen ja ein Konfigurationsfeld zur Eingabe der Mailadresse, dieses generieren wir mit dem oben definierten Code.
(Anmerkung: Die Funktionsweise des Config-Objekts ist im "Hello Twitter" Plugin bereits ausführlich beschrieben)
$ordernumber = $args->getReturn();
Über $args->getReturn(); greifen wir den Rückgabewert der Originalmethode zu. In diesem Fall erhalten wir so Zugriff auf die so eben generierte Bestellnummer.
Nun müssen wir noch einige Referenzen auf Objekte erzeugen, die wir gleich benötigen werden:
// Zugriff auf Plugin-Konfiguration $config = Shopware()->Plugins()->Backend()->TestApi()->Config(); // Zugriff auf Export $export = Shopware()->Api()->Export();
$config ist uns bereits bekannt und stellt die Plugin-Konfiguration zur Verfügung. Diese benötigen wir, da wir die Mail ja an eine, in den Einstellungen, definierte Mailadresse verschicken möchten.
Mit Shopware()->Api() greifen wir auf die Import-/Export-Funktionen von Shopware zu, diese bieten uns eine Reihe von Funktionen mit den wir Bestellungen, Kunden, Artikel und Kategorien importieren und exportieren können.
Damit wir nun die kompletten Bestelldaten auslesen können, benötigen wir noch die Datenbank-ID der Bestellung.
Dies erledigt die folgende Zeile für uns:
$orderID = Shopware()->Db()->fetchOne("SELECT id FROM s_order WHERE ordernumber=?",array($ordernumber));
Nun stehen uns alle Daten und Objekte zur Verfügung, die wir zum Abruf der Bestellung benötigen.
// Hauptdaten der Bestellung $order = current($export->sGetOrders(array("orderID"=>$orderID))); // Bestellpositionen $positions = $export->sOrderDetails(array("orderID"=>$orderID)); // Kundendaten $user = $export->sOrderCustomers (array("orderID"=>$orderID)); // XML-Export-Objekt erstellen $xml = Shopware()->Api()->convert->xml; $xml->sSettings['encoding'] = "ISO-8859-1"; // Unsere Bestellung in XML umwandeln $dump = $xml->encode(array("order"=>$order,"position"=>$positions,"user"=>$user));
Zunächst Lesen wir die Hauptdaten, Positionen und Kundendaten der Bestellung aus. Diese Daten kombinieren wir in einem Array und übergeben dieses Array dem API-XML-Objekt. Dieses erstellt automatisch einen XML konformen Export!
Wichtig! Eine vollständige Dokumentation der API finden Sie unter: http://wiki.shopware.de/API-Datenaustausch_cat_437.html
Zum Schluss müssen wir uns noch um den Versand der Mail kümmern, dies ist ebenfalls mit wenigen Zeilen Code erledigt:
$mail = Shopware()->Mail(); $mail->IsHTML(0); $mail->From = Shopware()->Config()->Mail; // Absender = Mail Shopbetreiber $mail->FromName = Shopware()->Config()->Mail; // Absender = Mail Shopbetreiber $mail->Subject = "Neue Bestellung $ordernumber"; // Betreff $mail->Body = "Neue Bestellung"; // Inhalt $mail->ClearAddresses(); // Vorherige Adressen entfernen // Die in der Plugin-Konfiguration eingetragene Adresse als Empfänger nehmen $mail->AddAddress($config->orderemail, ''); // XML-Datei als Attachment anfügen $mail->createAttachment( $dump, Zend_Mime::TYPE_OCTETSTREAM, Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $ordernumber.".xml" ); // Mail versenden $mail->Send();
Zunächst erzeugen wir eine Referenz auf das Shopware Mail - Objekt.
Dieses Objekt implementiert die Funktionen von Zend-Mail, unterstützt aber gleichzeitig auch die Syntax der bekannten PHPMailer-Klasse.
Dem Objekt ordnen wir Absender, Empfänger und Inhalt zu.
Anschließend definieren wir noch die in der Konfiguration hinterlegte Mailadresse als Empfänger und fügen unsere XML-Datei als Attachment hinzu!
Per $mail->send() lösen wir den Versand der eMail aus!
Fertig!
Artikel-PDF erstellen
Artikel bewerten
Kommentare:
Artikel kommentieren
Weitere interessante Artikel:
Bestell-Nr.: SW1415
Lieferzeit ca. 5 Tage
Preise inkl. gesetzlicher
MwSt. zzgl. Versandkosten*
Preise inkl. gesetzlicher
MwSt. + Versandkosten*
Kategorien: