einzelne event für warenkorb geändert?

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*

 ich finde nichts besseres... dann vielleicht ne hässliche workaround: ``` private $session_id; private $db; public static function getSubscribedEvents () { return ['Shopware_Modules_Basket_UpdateCartItems_Updated' =\> 'afterBasketChanged',]; } public function afterBasketChanged ($args) { $this-\>db = Shopware()-\>Db(); $this-\>session_id = Shopware()-\>Session()-\>offsetGet('sessionId'); $this-\>basket = $this-\>getBasketComboArticles(); $hash = $this-\>generateBasketHash(); $korb = $this-\>foo(); file_put_contents('/tmp/action.log', "$hash $korb\n", FILE_APPEND); return true; } private function foo () { $bar = []; foreach ($this-\>basket as $item) { array_push($bar, "$item[ordernumber]:$item[quantity]"); } return '['.implode(',', $bar).']'; } private function generateBasketHash () { $string = ""; foreach ($this-\>basket as $item) { $string .= $item['ordernumber'].':'.$item['quantity'].';'; } return hash('sha256', $string); } private function getBasketComboArticles () { return $this-\>db-\>fetchAll(' SELECT ordernumber, quantity, price FROM s_order_basket WHERE sessionID = ? AND s_order_basket.shippingfree != 1 ',[$this-\>session_id]); } ``` (setup wie bei vorherigen test) 1.: /lebensmittel/suesses/10/hauptartikel-mit-grundpreisberechnung CLICK: "In den Warenkorb" ------------------------------------------------------------------------ 485c0cb241217039950e77c3d8fdf8a8d962be16afae76a1a035ae8d352c49dc [SW10010:1] 485c0cb241217039950e77c3d8fdf8a8d962be16afae76a1a035ae8d352c49dc [SW10010:1] 2.: /lebensmittel/fisch/12/hauptartikel-mit-cross-selling CLICK: "In den Warenkorb" ------------------------------------------------------------------------ 6d3b71caa45c26231756c473f4a19eab1e703345447b022393bf670abd11f993 [SW10010:1,SW10012:1] 6d3b71caa45c26231756c473f4a19eab1e703345447b022393bf670abd11f993 [SW10010:1,SW10012:1] 3.: /lebensmittel/suesses/13/hauptartikel-mit-bewertungen CLICK: "In den Warenkorb" ------------------------------------------------------------------------ 342302eee7e3477fec37b4ea49d309abfb16961798ec9eb1bb445cf4bf22ee73 [SW10010:1,SW10012:1,SW10013:1] 342302eee7e3477fec37b4ea49d309abfb16961798ec9eb1bb445cf4bf22ee73 [SW10010:1,SW10012:1,SW10013:1] 4.: in der mini-warenkorb ding was von rechts kommt CLICK: [X] für erste artikel ------------------------------------------------------------------------ 90921490ecdba0a941a2aef932142e9ac0f443abeb2586a88a7b664253c8e4c4 [SW10012:1,SW10013:1] 5.: /checkout/cart 90921490ecdba0a941a2aef932142e9ac0f443abeb2586a88a7b664253c8e4c4 [SW10012:1,SW10013:1] CLICK: selektiere anzahl 5 für artikel SW10012 ------------------------------------------------------------------------ 21ac583eeb1d582502b9fea96b2d45d76b2abdd12a781a75f19346a185c07b32 [SW10012:5,SW10013:1] 21ac583eeb1d582502b9fea96b2d45d76b2abdd12a781a75f19346a185c07b32 [SW10012:5,SW10013:1] 6.: /checkout/cart 21ac583eeb1d582502b9fea96b2d45d76b2abdd12a781a75f19346a185c07b32 [SW10012:5,SW10013:1] CLICK: [X] für artikel SW10013 ------------------------------------------------------------------------ 62b0c8af43a680e936df5fd7f51276ee726ce76a30bfc7ae925b8fbe81350c08 [SW10012:5] 7.: / CLICK: warenkorb knopf oben rechts, wo die mini-warenkorb dann von rechts kommt ------------------------------------------------------------------------ 62b0c8af43a680e936df5fd7f51276ee726ce76a30bfc7ae925b8fbe81350c08 [SW10012:5] und die hash immer mit gespeicherten hash vergleichen...

hmmm…

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!?