Auf Detail Seite einen Gutschein zum Warenkorb hinzufügen

Hallo liebe Shopware Community,

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.

Ich bin für jeden Hinweis dankbar :slight_smile:

Vielen Dank im Voraus!

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. 

1 „Gefällt mir“

Man müsste ebenfalls wenn der Parameter übergeben wird den HttpCache ausstellen, sonst passiert nach dem ersten Request nix mehr.

1 „Gefällt mir“

Du meinst, wenn https://www.muster.de/detailseite?code=MYCODE aufgerufen wird? Wenn es unterschiedliche Codes sind, dann aber nicht?

1 „Gefällt mir“

Danke erstmal für die Vorschläge.

Aber ich habe eine recht simple Lösung gefunden.

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:

data-addArticleUrl="{url controller=checkout action=ajaxAddArticleCart code=$code}"

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:

.../checkout/ajaxAddArticleCart/code/TEST2?callback=jQuery21408800079466597899_1508746020110&sActionIdentifier=&sAddAccessories=&sAdd=SW10054&sQuantity=1&__csrf_token=1IO3d1UyaMKgHwaDX9IWYA1cEZq1de&isXHR=1&_=1508746020117

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.