hi zusammen, im standard werden artikel mit selber nummer im warenkorb zusammen geführt. macht ja auch sinn. nun möchte ich zusatzinformationen (textfeld) einem artikel zuordnen. das wird brav in den attr geschrieben. nehm ich mir nun den selben artikel mit anderer zusatzinformation, wird alles überschrieben. das will ich verhindern. also soll jeder artikel einzeln im warenkorb landen. hat jemand ein tipp für mich, danke.
[quote=„pino“]hi zusammen, im standard werden artikel mit selber nummer im warenkorb zusammen geführt. macht ja auch sinn. nun möchte ich zusatzinformationen (textfeld) einem artikel zuordnen. das wird brav in den attr geschrieben. nehm ich mir nun den selben artikel mit anderer zusatzinformation, wird alles überschrieben. das will ich verhindern. also soll jeder artikel einzeln im warenkorb landen. hat jemand ein tipp für mich, danke.[/quote] Nabend, lass die Arbeit SW machen. AddArticle Hooks Before -> Artikelnummer manipulieren, hinten -temp dran hängern. AddArticle Hooks After -> Artikelnummer wieder korrigieren! spricht -temp entfernen. Schon hast du für jeden Artikel eine eigene Besttellposition, da shopware immer eine eigene Position macht, wenn der Artikel noch nicht vorhanden ist (Artikelnummer)
gute idee. mein before will noch nicht so recht. so siehen meine hooks aus: $this-\>subscribeEvent( 'sBasket::sAddArticle::before', 'onAddArticleActionBefore' ); // rückgabe leer :( public function onAddArticleActionBefore (Enlight\_Hook\_HookArgs $args){ $result = $args-\>getReturn(); $this-\>diePhp($result); } // $this-\>subscribeEvent( 'sBasket::sAddArticle::after', 'onAddArticleActionAfter' ); // basket id public function onAddArticleActionAfter (Enlight\_Hook\_HookArgs $args){ $basketID = $args-\>getReturn(); }
Vor dem Aufruf (bzw hook) einer Methode existiert noch gar kein return Wert. Siehe: http://wiki.shopware.de/Shopware-4-Even … efore_Hook Viele Grüße
wie manipuliere ich den die ordernumber? seh in der methode, das zuerst nach dem artikel anhand von ordernumber gesucht wird. ein $param = $args-\>getArgs(); $args-\>set('id', $param[0].'\_tmp');
brint mir da ja nix; // edit hab’s nun mal mit event-filter versucht, leider auch ohne erfolg $this-\>subscribeEvent( 'Shopware\_Modules\_Basket\_AddArticle\_FilterSql', 'onAddArticleFilterSql' ); public function onAddArticleFilterSql (Enlight\_Event\_EventArgs $arguments){ $sql = $arguments-\>getReturn(); $article = $arguments-\>getArticle(); $article['ordernumber'] = $article['ordernumber'].'\_tmp'; $sql = " INSERT INTO s\_order\_basket ( id, sessionID, userID, articlename, articleID, ordernumber, shippingfree, quantity, price, netprice, datum, esdarticle, partnerID, config )VALUES ( ?, ?, ?, ?, ?, '".$article['ordernumber']."', ?, ?, ?, ?, ?, ?, ?, ? ) "; return $sql; }
kein fehler kein garnix. wird irgendwie ignoriert. // edit nachdem ich mal mein 100 artikel im warkorb gelöscht habe. ist mir dann doch das sql um dir ohren geflogen. also hat das ganze schonmal einen effekt. ich frag mich dabei nur, warum kann ich die params nicht ändern? die sql ist mir eigentlich egal. naja, ich warte mal was ottscho morgen zeigt.
Wenn ich morgen im Büro bin, poste ich dir den Code. Du frägst in den parm die ordernumber ab und änderst per SQL im Warenkorb Tabelle die ordernumber. Und in der After änderst du die Nummer wieder zurück.
Morgen Pino, probier das mal. Sollte klappen: $this-\>subscribeEvent( 'sBasket::sAddArticle::before', 'onBasket\_AddArticle\_Before' ); $this-\>subscribeEvent( 'sBasket::sAddArticle::after', 'onBasket\_AddArticle\_After' );
public function onBasket\_AddArticle\_Before(Enlight\_Hook\_HookArgs $args) { $params = $args-\>getArgs(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; $orderNumber = isset($params[0]) ? $params[0] : ''; if (empty($orderNumber)) { return; } $orderNumberTmp = $orderNumber . '\_OttTemp'; $sql = 'UPDATE s\_order\_basket ob SET ob.ordernumber=? WHERE ob.ordernumber=? AND ob.sessionID=? AND ob.modus=0'; Shopware()-\>Db()-\>query($sql,array( $orderNumberTmp, $orderNumber, $session )); } public function onBasket\_AddArticle\_After(Enlight\_Hook\_HookArgs $args) { $params = $args-\>getArgs(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; $orderNumber = isset($params[0]) ? $params[0] : ''; if (empty($orderNumber)) { return; } $orderNumberTmp = $orderNumber . '\_OttTemp'; $sql = 'UPDATE s\_order\_basket ob SET ob.ordernumber=? WHERE ob.ordernumber=? AND ob.sessionID=? AND ob.modus=0'; Shopware()-\>Db()-\>query($sql,array( $orderNumber, $orderNumberTmp, $session )); }
ottscho, das ist der hammer. warum auch immer das funktioniert, es funktioniert. heißt dass, das ::before permanent ausgeführt wird, und erst wenn return wird ::after ausgeführt? wenn ich mir die sBasket::sAddArticle methode ansehe, wird am anfang nach dem artikel gesucht, wenn vorhanden nach ordernumber in s_order_basket. Dann insert oder update. wann wird in s_order_basket geschrieben und kann mit ::before nachsehen?
korrekt. du änderst in before die artikelnummer. Somit schaut sw nach und bemerkt das es den artikel noch nicht im WK gibt. und später im after änderst du die nummer wieder zurück.
Shopware scheint das seit kurzem nicht mehr zu erlauben: Es werden automatisch Artikel gelöscht, deren “ordernumber” nicht existiert. Ein funktionierender Workaround, der dieselbe Idee (diesmal jedoch durch Manipulation der Session) aufgreift, funktioniert jedoch: public function split\_cart\_item\_before(Enlight\_Hook\_HookArgs $args) { $params = $args-\>getArgs(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; $orderNumber = isset($params[0]) ? $params[0] : ''; if (empty($orderNumber)) { return; } $sessionTmp = $session.'\_Temp'; $sql = 'UPDATE s\_order\_basket ob SET ob.sessionID=? WHERE ob.ordernumber=? AND ob.sessionID=? AND ob.modus=0'; Shopware()-\>Db()-\>query($sql,array($sessionTmp,$orderNumber,$session)); } public function split\_cart\_item\_after(Enlight\_Hook\_HookArgs $args) { $params = $args-\>getArgs(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; $orderNumber = isset($params[0]) ? $params[0] : ''; if (empty($orderNumber)) { return; } $sessionTmp = $session.'\_Temp'; $sql = 'UPDATE s\_order\_basket ob SET ob.sessionID=? WHERE ob.ordernumber=? AND ob.sessionID=? AND ob.modus=0'; Shopware()-\>Db()-\>query($sql,array($session,$orderNumber,$sessionTmp)); }