Event VOR deleteArticle?

Hallo, leider hänge ich nun schon einige Zeit an einem (wie ich ursprünglich dachte) recht simplen Problem…

Ich möchte mich mit meinem Plugin (liegt zur Zeit unter httpdocs/custom/plugins/MeinPluginName) genau zwischen das Betätigen des “Position löschen” Buttons und das wirkliche Löschen der Position im Warenkorb hängen, um vor dem Löschen herauszufinden, um welche Artikelnummer es sich hier handelte.

Leider spricht Shopware auf die Hälfte der getesteten SubscribedEvents nicht an oder hat den Artikel bereits gelöscht und die ID für die Warenkorbposition ist nutzlos…

Folgendes habe ich bereits erfolglos getestet:

Enlight_Controller_Action_Frontend_Checkout_PreDispatch
Enlight_Controller_Action_PreDispatch_Frontend_Checkout
Enlight_Controller_Action_PostDispatch_Frontend_Checkout
Enlight_Controller_Action_Frontend_Checkout_DeleteArticle
Enlight_Controller_Action_Frontend_Checkout_DeleteArticle::before
sBasket::sDeleteArticle::before
Enlight_Controller_Action_Checkout::sDeleteArticle::before
Shopware_Controllers_Action_Checkout::sDeleteArticle::before

Und sicher noch viele Weitere… In jegliche Versuche mit “::before” geht er nicht einmal hinein.

Wenn er es doch tut, so ist der Artikel schon gelöscht…

Jemand noch einen Vorschlag?

Morgen versuche ich auf jeden Fall noch mal das Plugin in “engine/Shopware/plugins/etc.etc.etc.” zu verschieben, teils macht das einen riesen Unterschied… Aber dafür muss ich vermutlich die halbe Struktur abändern, weil er da auf eine Indexdatei namens Bootstrap besteht usw…

Alternativ könnte ich alle tpl-Dateien dahingehend abändern, dass er mir die Artikelnummer als zusätzlichen Wert mitschickt, aber mal ehrlich… das muss doch einfacher gehen…

 

Ich gehe da auf Enlight_Controller_Action_PreDispatch_Frontend_Checkout und frage darin auf die action „deleteArticle“ bzw „ajaxDeleteArticleCart“ ab - darin dann „getParam(‚sDelete‘)“ für die Position. Mit der sollte dann eine Abfrage der Artikelnummer via SQL im Basket möglich sein.

1 Like

Danke für die Antwort @sonic‍ aber genau das habe ich auch als allererstes versucht und Shopware geht einfach nicht in die Funktion rein…

...
public static function getSubscribedEvents() {
        return [
            'Enlight_Controller_Action_PostDispatch_Frontend_Listing' => 'showEventBadges',
            'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'showDetailsImage',
            'Enlight_Controller_Action_PostDispatch_Frontend_Account' => 'shopOldOrderFlags',
            'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'remFreeStuffHere',
            'Enlight_Controller_Action_PostDispatch_Frontend_Checkout' => 'addFreeStuffHere',
        ];
}

...
...

public function remFreeStuffHere(\Enlight_Event_EventArgs $arguments) {
        $controller = $arguments->getSubject();
        $request = $controller->Request();
        $action = $request->getActionName();
        $view = $controller->View();
        $tmp_posID = $request->getParam("sDelete");

        if(in_array($action,["deleteArticle","ajaxDeleteArticleCart"])) {
            $queryBuilder = Shopware()->Container()->get('dbal_connection')->createQueryBuilder();
            $queryBuilder->select('sob.ordernumber')
                ->from('s_order_basket', 'sob')
                ->where('sob.id = ?')
                ->setParameter(0, $tmp_posID);
            $tmp_artNr = $queryBuilder->execute()->fetch();
        }
        Shopware()->Container()->get('pluginlogger')->error("Ich war hier und die Artikelnummer war folgende:".$tmp_artNr);

...
}

 

So sieht das im Groben aus, theoretisch müsste er direkt bei Aufruf in die Funktion gelangen und die Artikelnummer auslesen, das passiert aber nicht…

Im Backend erscheint nur der Text und die Artikelnummer ist leer…

 

In der Funktion auf das PostDispatch-Event werden die betroffenen Positionen entfernt und ggf. Aktionsartikel neu erzeugt, evtl. wird das noch einmal angesprochen bevor PreDispatch an die Reihe kommt… aber dann wüsste ich nicht auf welche Actions ich im PostDispatch-Event ich abfragen sollte… gibt es BasketChange oder sowas…?


[EDIT]

Ich bin mir mitlerweile sicher, dass er vor dem Eintritt in die PreDispatch noch mindestens einmal die PostDispatch durchläuft und das zerhaut mir die Ergebnisse, welche ich von PreDispatch erwarte -.-

 

[EDIT2]

Das PostDispatch-Event wird zu oft gestartet… Er ruft das PostDispatch-Event 2 mal auf, beim zweiten mal allerdings so spät, dass die Änderungen gar nicht mehr im Frontend ankommen… Dadurch klickt man auf “Position entfernen” von Positionen, welche gar nicht mehr unter dieser ID existieren…

 

[EDIT3]

Ich habe mein Skript nun noch einmal fast komplett umgeschrieben aber nun geht es endlich !