eingelösten Gutschein-Code- Ende d. Bestellvorgangs ausgeben

Hallo, ich schreibe aktuell an einem kleinen Plugin, das einen eingelösten Gutschein an ein externes System übertragen soll. Der Gutschein-Code wird jedoch nur in der Tabelle „s_emarketing_voucher_codes“ entsprechend als eingelöst markiert und ist sonst nicht mit den entsprechenden Bestelldaten verknüpft. Meine Frage ist nun, wie ich an den entsprechenden Gutschein-Code komme. Natürlich könnte ich diesen auch in die $_SESSION schreiben, fragt sich nur wie „sauber“ bzw. „üblich“ das ist. Eine Erweiterung an der Datenstruktur soll nicht vorgenommen werden. Bin für jeden Tipp dankbar! LG Patrick

Hi, dies über die Session zu lösen geht zwar am schnellsten ist aber nicht ganz so sauber. Besser wäre es hier wenn du über ein Plugin einfach eine neu Spalte in der Tabelle s_emarketing_voucher_codes anlegst. Dies Spalte solltest du am besten mit einem Bezug zu deinem Plugin benennen. Zum Beispiel: pluginnamen_ordernumber. Dann besteht die Gefahr nicht, dass wir ein Update veröffentlichen mit dem gleichen Spaltennamen und dies dann fehlschlägt oder dein Plugin nicht mehr funktioniert. Dann hängst du dich einfach in das Event(falls verfügbar sonst hook) welches beim Bestellabschluss den Gutschein Code auf Cashed setzt und setzt zusätzlich die Bestellnummer oder orderID. Dann kannst du im Nachhinein immer ein Bezug zu einer Bestellung und den Gutscheincodes herstellen. Hoffe das hilft dir ein wenig. Grüße, Marcel

1 „Gefällt mir“

Hallo, also es ist so gedacht, dass der in Shopware eingetragene Gutschein-Code eine Kampagnen-ID eines externen Affiliate-Systems ist. Diese ist mehrfach einlösbar. Wenn nun der Käufer einen Gutschein-Code im Warenkorb eingibt, so ist dieser nicht in Shopware vorhanden. Das Plugin erfragt in dem Fall die Kampagnen-ID über einen Request bei dem externen Affiliate-System. Übermittelt wird dabei der Gutschein-Code, den der Käufer eingegeben hat. Dieser muss ebenfalls bei Bestell-Abschluss an das Affiliate-System übergeben werden, damit dieser dort entsprechend abgezeichnet wird. Also schleife ich in diesem Fall den Original Gutschein-Code durch den Bestellvorgang in der SESSION, da dieser sonst nicht mehr vorhanden ist. Andernfalls müsste der Shopware-Betreiber z.B. 10.000 Gutschein-Codes selber per Hand eingeben oder importieren. Hier mein entsprechender Code - fragt sich nur, ob mein Vorgehen so richtig ist: <?php class Shopware_Plugins_Backend_MyPluginbonus_codeextends Shopware_Components_Plugin_Bootstrap { public function install() { /* HOOK fuer das Einloesen von Gutschein-Codes im Warenkorb */ $hook = $this->createHook( 'sBasket', 'sAddVoucher', 'onAddVoucher', Enlight\_Hook\_HookHandler::TypeBefore, 0 ); $this-\>subscribeHook($hook); /\* Event fuer das Loeschen der eingegebenen Gutschein-Codes aus der SESSION \*/ $event\_on\_basket = $this-\>createEvent( 'Shopware\_Modules\_Basket\_UpdateArticle\_Start', 'onUpdateArticle' ); $this-\>subscribeEvent($event\_on\_basket); /\* Event fuer das Einloesen der eingegebenen Gutschein-Codes aus der SESSION \*/ $event\_on\_checkout = $this-\>createEvent( 'Shopware\_Modules\_Order\_SaveOrder\_ProcessDetails', 'onOrder\_SaveOrderProcessDetails' ); ... return true; } static function onUpdateArticle(Enlight\_Event\_EventArgs $args) { /\* wird der Gutschein-Code geloescht, loesche ihn auch aus der SESSION \*/ if($\_GET['sDelete'] == 'voucher') { unset($\_SESSION['bonus\_code']); } ... return true; } static function onOrder\_SaveOrderProcessDetails(Enlight\_Event\_EventArgs $args) { $basket = $args-\>getSubject(); $order\_number = "Bestellung Nr.: " . $basket-\>sOrderNumber; $amount = $basket-\>sBasketData['AmountNetNumeric']; /\* Beziehe Gutschein-Code aus der SESSION \*/ $bonus\_code = $\_SESSION['bonus\_code']; ... return true; } static function onAddVoucher(Enlight\_Hook\_HookArgs $args) { $param = $args-\>getArgs(); $bonus\_code = $param[0]; /\* Setze Gutschein-Code in der SESSION wenn noch nicht vorhanden \*/ if(!isset($\_SESSION['bonus\_code'])) { $\_SESSION['bonus\_code'] = $bonus\_code; } ... return true; } }