gibt es eine einzelne shopware event was ausgeführt wird wenn warenkorb sich ändert?
(es muss auch die geänderte warenkorb haben! bzw. in db schon geändert. aber keine andere darf es schon gelesen haben)
ich hoffe ich muss nicht Enlight_Controller_Action_PostDispatch_Frontend_Checkout benutzen, und erstmal manuell überall in frontend klicken um zu finden was die alle möglichen actions sind die warenkorb ändern… (und bugs finden wie “in den warenkorb” button triggert aktionen “ajaxCart, ajaxCart, ajaxAmount”… wieso 2 mal ajaxCart? wo ist der aktion welche warenkorb ändert?)
ps. ich soll eine “warenkorb combo” implementieren, was ein gutschein in warenkorb manipuliert wenn bestimmte kombinationen von artikeln in warenkorb sind…
dann suchen wir mal... test plugin code: ``` public static function getSubscribedEvents () { return ['Enlight_Controller_Action_PostDispatch_Frontend_Checkout' =\> 'onFrontendCheckout',]; } public function onFrontendCheckout ($args) { $action = $args-\>getSubject()-\>Request()-\>getActionName(); $m = str_pad("action:$action", 24); $m .= "articles:".$this-\>foo($this-\>getCartArticles()); file_put_contents("/tmp/action.log", $m."\n", FILE_APPEND); } private function foo ($cart) { $bar = []; foreach ($cart as $o =\> $q) { array_push($bar, "$o:$q"); } return '['.implode(',', $bar).']'; } private function getCartArticles () { return Shopware()-\>Db()-\>fetchPairs( 'SELECT ordernumber, quantity FROM s_order_basket WHERE sessionID = ? AND s_order_basket.shippingfree != 1', [Shopware()-\>Session()-\>offsetGet('sessionId')] ); } ``` plugin aktivieren und `tail -f /tmp/action.log` vanilla shopware 5.6.4, Demo Data DE, warenkorb leer. 1.: /lebensmittel/suesses/10/hauptartikel-mit-grundpreisberechnung CLICK: "In den Warenkorb" ------------------------------------------------------------------------ action:ajaxCart articles:[SW10010:1] action:ajaxCart articles:[SW10010:1] action:ajaxAmount articles:[SW10010:1] 2.: /lebensmittel/fisch/12/hauptartikel-mit-cross-selling CLICK: "In den Warenkorb" ------------------------------------------------------------------------ action:ajaxCart articles:[SW10010:1,SW10012:1] action:ajaxCart articles:[SW10010:1,SW10012:1] action:ajaxAmount articles:[SW10010:1,SW10012:1] 3.: /lebensmittel/suesses/13/hauptartikel-mit-bewertungen CLICK: "In den Warenkorb" ------------------------------------------------------------------------ action:ajaxCart articles:[SW10010:1,SW10012:1,SW10013:1] action:ajaxCart articles:[SW10010:1,SW10012:1,SW10013:1] action:ajaxAmount articles:[SW10010:1,SW10012:1,SW10013:1] 4.: in der mini-warenkorb ding was von rechts kommt CLICK: [X] für erste artikel ------------------------------------------------------------------------ action:ajaxCart articles:[SW10012:1,SW10013:1] action:ajaxCart articles:[SW10012:1,SW10013:1] action:ajaxAmount articles:[SW10012:1,SW10013:1] 5.: /checkout/cart CLICK: selektiere anzahl 5 für artikel SW10012 ------------------------------------------------------------------------ action:changeQuantity articles:[SW10012:5,SW10013:1] action:cart articles:[SW10012:5,SW10013:1] 6.: /checkout/cart CLICK: [X] für artikel SW10013 ------------------------------------------------------------------------ action:deleteArticle articles:[SW10012:5] action:cart articles:[SW10012:5] 7.: / CLICK: warenkorb knopf oben rechts, wo die mini-warenkorb dann von rechts kommt ------------------------------------------------------------------------ action:ajaxCart articles:[SW10012:1,SW10013:1] - wieso hat "In den Warenkorb" 2 mal aktion ajaxCart? (punkt 4. auch!) - wo/welche ist die "In den Warenkorb" änderung aktion? (punkt 4. auch!) - 7. woher wissen wir das diese ajaxCart aktion keine änderung ist? - gibt es noch mehr frontend wege die warenkorb ändern? - gibt es echt kein einfacheren weg?
hallo und willkommen zu meiner blog! ich durchsuche längst vergessene zeilen von code, und versuche deren geheime bedeutungen zu entschlüsseln. “spannung” für die komplette körper!
dachte ich hätte die perfekte event gefunden: Shopware_Modules_Basket_UpdateCartItems_Updated
es wird bei add, del und mod ausgeführt! *hoffnung steigt*
ABER es wird mehr als nur einmal ausgeführt (FÜR EINE AUFGABE!), aber natürlich…
UUUUND es wird auch bei /checkout/cart ausgeführt (wtf, was gibts da zu aktualisieren!?)
lass mich raten, das *_Updated heißt doch nicht das es was aktualisiert hat (you know, updated!) sondern es wurde lediglich ausgeführt (called)?
dann schauen wir mal was die (undokumentierten) werte in der event beinhalten:
‘subject’ => some memory blowing shit…
‘items’ => die aktuelle warenkorb items? ist aber momentan egal
‘updateableItems’ => tja, keine ahnung, es ist zumindest nicht leer bei /checkout/cart, also können wir es eh nicht benutzen um zu wissen ob Shopware_Modules_Basket_UpdateCartItems_Updated was wirklich aktualisiert hat…
where the fuck is “updatedItems” info?
RAGEQUIT… *tief durchatmen, feierabend ist zumindest noch feierabend*
hab dann mal versucht die gutschein daten (articlename, price) in s_order_basket zu ändern, und gewundert wieso es nichts in frontend geändert hat (query hat gesagt es hat 1 entry geändert!)
dann hab ich es gemerkt…
jeder aufruf von /checkout/cart ändert die id von (nur) gutschein in s_order_basket…
*ruhig blut… es ist bestimmt ne fehler an meine seite*
kann jemand bitte bestätigen das vanilla shopware 5.6.4 bei jeder aufruf von /checkout/cart die id von gutschein in s_order_basket ändert!?