im Rahmen eines Plugins (Shopware 5.2.27) will ich Folgendes umsetzen:
Es beginnt damit, dass man von extern auf die Detail-Seite eines Artikels verlinkt wird (mit Zusatz eines ?code=MYCODE Parameters). Dieser Parameter wird dann beim Verarbeiten des Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail Events dazu verwendet, um zu überprüfen, ob der Gutschein auf den aufgerufenen Artikel zutrifft oder nicht. Je nach dem wird dann unter dem eigentlichen Preis des Artikels der Preis des Artikels inklusive Gutschein dargestellt.
Bis hierhin ist alles kein Problem.
Nun möchte ich aber auch, wenn der Benutzer auf “In den Warenkorb” klickt, dass dieser Gutschein als Item in dem rechts eingeblendeten Warenkorb aufgelistet wird.
Das eigentliche Hinzufügen in den Warenkorb habe ich schon durchführen können, allerdings nur hard-coded (im Shopware_Modules_Basket_AddArticle_Added Event):
public function onBasketAddArticleAdded(\Enlight_Event_EventArgs $args)
{
$this->basket = Shopware()->Modules()->Basket();
$code = 'MYCODE';
$this->basket->sAddVoucher($code);
$this->basket->sRefreshBasket();
}
Das hat dann zur Folge, dass das Gutschein-Item wie gewünscht rechts im Warenkorb angezeigt wird und es auch im Checkout dann korrekt angezeigt wird.
Das Probem hierbei ist, dass ich in dem Shopware_Modules_Basket_AddArticle_Added keinen Zugriff auf den GET-Parameter code habe, weil das Hinzufügen des Artikels über einen AJAX-Call geschieht (…\engine\Shopware\Controllers\Frontend\Checkout.php->ajaxAddArticleCartAction()).
An dieser Stelle habe ich einfach keine Idee, wie man hier vorgehen könnte.
Eine Möglichkeit wäre nach durchgeführter Prüfung in dem Event Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail den Code in die Session zu schreiben. Dann in onBasketAddArticleAdded prüfen, ob Code in der Session vorhanden ist und wenn zutreffend, sAddVoucher aufrufen und den Code aus der Session löschen.
Problem war ja, dass beim Klick auf In den Warenkorb ein AJAX-Call stattfindet, der meinen code-Parameter nicht mit übergeben bekommt. Dieser Button befindet sich innerhalb eines Forms. Dessen Template habe ich einfach überschrieben und hier kommt dann das Smarty URL Plugin ins Spiel. Dadurch hat man die Möglichkeit für die action (data-addArticleUrl), die den AJAX-Call processed Folgendes zu machen:
Man setzt also einfach ein custom Parameter (der wird dann einfach dem Template assigned), und shopware tut dies auch an vielen Stellen, wenn auch nur an den Standard Form action-Attributen. Der AJAX-Call sieht dann so aus:
Was mich hierbei noch wundert ist, dass der custom Paramter in der Route auftaucht anstatt als Parameter. Dennoch habe ich dann die Möglichkeit in der onBasketAddArticleAdded mit $_GET[‘code’] den code abzufragen.
Ich hatte auch schon an die Session gedacht, aber ich hatte schon eine Vermutung, dass shopware hier etwas parat hat.