Tester gesucht! - Flächen-Preis-Berechnung

Ich würde versuchen den Preis in ‚onBasket_AddArticle_Start‘ zu setzen.

Hab den Fehler gefunden, aber weiß nicht genau wie ich diesen beheben kann. Vllt gibt es auch eine einfachere Lösung. Ich habe hidden imput Felder in der Detailansicht z.B. 131mat_value und speichere dann in dem Event diesen Wert als Session Varibale unter 131mat_value ab. if(isset($\_GET[$articleid.'qm\_value'])) { Shopware()-\>Session()-\>{$articleid.'qm\_value'} = $\_GET[$articleid.'qm\_value']; $qm = $\_GET[$articleid.'qm\_value']; } else { $qm = Shopware()-\>Session()-\>{$articleid.'qm\_value'}; } if(isset($\_GET[$articleid.'mat\_value'])) { Shopware()-\>Session()-\>{$articleid.'mat\_value'} = $\_GET[$articleid.'mat\_value']; $mat\_value = $\_GET[$articleid.'mat\_value']; } else { $mat\_value = Shopware()-\>Session()-\>{$articleid.'mat\_value'}; } Ich speichere den m² Wert und die Materialnummer in der Session unter articleIDmat_value. Also z.B. 131mat_value. Da es sich ja bei jedem Vorgang um den gleichen Artikel dreht, habe ich immer die gleiche articleID und berschreib somit die Session Variable mit dem letzten Wert :frowning: EDIT: Okay, das wäre auch ein versuch. Den Preis in das andere Event packen.

Das Problem ist eigentlich, dass ‘self::$variantId’ und ‘self::$articleOrderNumber’ in ‘onBasket_UpdateArticle_After’ immer die Werte des jeweils upzudatenden Datensatzes im Warenkorb haben - diese werden in ‘onBasket_UpdateArticle_Start’ gesetzt. Dadurch wird der Preis für alle Positionen gesetzt.

mhhh, ich verstehs nicht. Nun habe ich meine Preiskalkulation und das basket Update in ‘onBasket_AddArticle_Start’ verlagert. Wenn ich mir das var_dump anschaue, wird das Update auch durchgeführt. Mache ich mal wieder ein exit; unten hin, so steht in der DB der richtige Preis. Entferne ich das exit; so habe ich den original Preis des Artikels. public static function onBasket\_UpdateArticle\_Start(Enlight\_Event\_EventArgs $args) { $instance = Enlight\_Class::Instance(\_\_CLASS\_\_); $id = $args-\>getId(); // s\_order\_basket.id $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; // CODE hier gekürzt auf das wichtgiste!!! // Preis und Menge in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET quantity=?, price=?, netprice=?, ob\_attr1=?, currencyFactor=? WHERE id=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $quantity, $price, $netprice, $qm, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], $id, $session )); var\_dump($sql,array( $quantity, $price, $netprice, $qm, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], $id, $session )); $articleId = Shopware()-\>Db()-\>fetchOne( "SELECT articleID FROM s\_order\_basket WHERE sessionID='" . Shopware()-\>SessionID() . "' AND modus=0 AND id=" . intval($id)); if (empty($articleId)) return; $articleOrderNumber = Shopware()-\>Db()-\>fetchOne( 'SELECT ordernumber FROM s\_articles\_details WHERE articleID = ' . $articleId); self::$articleOrderNumber = $articleOrderNumber; self::$cancelUpdate = false; $variantId = ''; if (self::$articleAdded) { self::$articleAdded = false; $variantId = $instance-\>getVariantId(); // Mögliches Prüfen von $variantId // return true; // Cancel process } else { $variantOrderNumber = Shopware()-\>Db()-\>fetchOne( 'SELECT ordernumber FROM s\_order\_basket WHERE id=' . intval($id)); $variantId = str\_replace($articleOrderNumber . ' ', '', $variantOrderNumber); // ordernumber der Variante zurücksetzen (ordernumber ohne variant-id) $sql = 'UPDATE s\_order\_basket SET ordernumber=? WHERE id=?'; Shopware()-\>Db()-\>query($sql, array($articleOrderNumber, $id)); } self::$variantId = $variantId; }

In ‚onBasket_AddArticle_Start‘ oder ‚onBasket_UpdateArticle_Start‘?

Sorry, hab ja beides geschrieben. So wie der Code gepostest ist. In ‘onBasket_UpdateArticle_Start’ oder ist das die falsche Stelle?

Die UpdateArticle-Funktion des Warenkorbs wird ja anscheinend für jede Position im Warenkorb aufgerufen. ‚AddArticle‘ sollte nur für den hinzugefügten aufgerufen werden. Deshalb ‚onBasket_UpdateArticle_Start‘.

Jetzt check ich es langsam nicht mehr… In ‚onBasket_AddArticle_Start‘ wird aber doch gar kein Artikel eingefügt? Ich kann hier meine Preis nicht Updaten, da es den Datensatz zu dieser Zeit noch nicht gibt :frowning:

Sorry, mein Fehler. :frowning: Muss natürlich in die Updatefunktion. Ich schau heute Abend noch mal nach. Hab schon eine Idee. Muss aber erst mal weg.

Soo, habs gelöst. Ich habe es nun in ‘onBasket_UpdateArticle_After’ gelassen und habe noch etwas eingebaut. Alte Code: if(isset($\_GET['qm\_value'])) { Shopware()-\>Session()-\>{$id.'qm\_value'} = $\_GET['qm\_value']; $qm = $\_GET['qm\_value']; } else { $qm = Shopware()-\>Session()-\>{$id.'qm\_value'}; } Neuer Code: if(isset($\_GET['qm\_value'])) { if (isset(Shopware()-\>Session()-\>{$id.'qm\_value'})){ $qm = Shopware()-\>Session()-\>{$id.'qm\_value'}; } else { Shopware()-\>Session()-\>{$id.'qm\_value'} = $\_GET['qm\_value']; $qm = $\_GET['qm\_value']; } } else { $qm = Shopware()-\>Session()-\>{$id.'qm\_value'}; }

:thumbup: Hab jetzt noch mal bei mir getestet. Wenn ich einen neuen Artikel in den Warenkorb lege, wird ‚onBasket_UpdateArticle_After‘ 1x für den neuen Artikel und je 3x für jeden Artikel der im Warenkorb ist aufgerufen. Wenn ich die Menge eines Artikels ändere, wird es nur 1x für diesen Artikel aufgerufen. Man müsste also nur ein Flag setzen, dass den Preis NUR beim ersten Aufruf setzt. Frage: Passiert das durch deine Änderung am Code, oder war es doch ein anderes Problem?

Frage: Passiert das durch deine Änderung am Code, oder war es doch ein anderes Problem? Verstehe die Frage nicht. Aber das Problem war, dass ich in der Detailansicht den berechneten m² Wert in ein hidden input speicher und diesen dann in der Bootstrap.php abfrage und damit rechne. Wird das mit dem hinzugefügten Artikel gemacht, dann stimmt es! Befinden sich aber schon ein Artikel im Warenkorb, wird der Preis wieder berechnet und zwar mit den m² Wert von neuen Artikel. Darum hatte ich danach immer den gleichen Preis. Aber jetzt gehts erst mal… Vielen vielen Dank :slight_smile:

Du speicherst den Wert für jede Position im Warenkorb (in der Session) und nimmst dann ausgehend von der ID der jeweilig kalkulierten Position den passenden. Einfacher wäre es nur beim ersten Aufruf von ‚onBasket_UpdateArticle_After‘ Werte zusetzen und alle folgenden Aufrufe zu ignorieren. Aber die Lösung ist auch nicht schlecht. :thumbup:

Hey Ralf, jetzt bin ich mit der Oberflache und der Funktion im Frontend fast fertig. Ich habe nur noch ein Problem. Ich speichere in der basket Tabelle in den od_attr1 und od_attr2 Feld noch meine auswahl. Soweit alles okay. Wird aber nachher der Warenkorb in eine Order umgewandelt, fehlen mir die Attr Felder in der Detail Tabelle der Order. Ich habe mir mal die Funktion sSaveOrder angeschaut. Eig. sollte diese doch schon die Attr Felder des Warenkorbs in die Attr Felder des Order Details Tabelle übernehmen. Oder deute ich das falsch? Codeausschnitt: foreach ($this-\>sBasketData["content"] as $basketRow){ $position++; eval($this-\>sSYSTEM-\>sCallHookPoint("sOrder.php\_sSaveOrder\_ContentLoop")); $amountRow = $this-\>sSYSTEM-\>sMODULES['sArticles']-\>sFormatPrice($basketRow["priceNumeric"] \* $basketRow["quantity"]); if (!$basketRow["price"]) $basketRow["price"] = "0,00"; if (!$amountRow) $amountRow = "0,00"; $basketRow["articlename"] = str\_replace(" ","\n",$basketRow["articlename"]); $basketRow["articlename"] = html\_entity\_decode($basketRow["articlename"]); $basketRow["articlename"] = strip\_tags($basketRow["articlename"]); if (!$basketRow["itemInfo"]){ $priceRow = $basketRow["price"]; }else { $priceRow = $basketRow["itemInfo"]; } // Needed for 2.0.4 compatibility purposes $sTable-\>add\_row(array( "0"=\>$position, "1"=\>$basketRow["ordernumber"], "2"=\>$basketRow["articlename"], "3"=\>$priceRow." ".$this-\>sSYSTEM-\>sCONFIG['sCURRENCY'], "4"=\>$basketRow["quantity"], "5"=\>$amountRow." ".$this-\>sSYSTEM-\>sCONFIG['sCURRENCY'])); //Bundle-Article if($basketRow["modus"] == 10){ $sqlBundleTax = " SELECT `taxID` FROM `s_articles_bundles` WHERE `ordernumber` = ? "; $bundleTax = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetOne($sqlBundleTax, array($basketRow["ordernumber"])); if(!empty($bundleTax)) $basketRow["taxID"] = $bundleTax; } $basketRow["articlename"] = $this-\>sSYSTEM-\>sMODULES['sArticles']-\>sOptimizeText($basketRow["articlename"]); if (!$basketRow["esdarticle"]) $basketRow["esdarticle"] = "0"; if (!$basketRow["modus"]) $basketRow["modus"] = "0"; if (!$basketRow["taxID"]) $basketRow["taxID"] = "0"; if ($this-\>sNet == true){ $basketRow["taxID"] = "0"; } $sql = " INSERT INTO s\_order\_details (orderID, ordernumber, articleID, articleordernumber, price, quantity, name, status, releasedate, modus, esdarticle, taxID, od\_attr1, od\_attr2, od\_attr3, od\_attr4, od\_attr5, od\_attr6 ) VALUES ( $orderID, '$orderNumber', {$basketRow["articleID"]}, '{$basketRow["ordernumber"]}', {$basketRow["priceNumeric"]}, {$basketRow["quantity"]}, '".addslashes($basketRow["articlename"])."', 0, '0000-00-00', {$basketRow["modus"]}, {$basketRow["esdarticle"]}, {$basketRow["taxID"]}, ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr1"]).", ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr2"]).", ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr3"]).", ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr4"]).", ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr5"]).", ".$this-\>sSYSTEM-\>sDB\_CONNECTION-\>qstr((string)$basketRow["od\_attr6"])." )"; $sql = Enlight()-\>Events()-\>filter('Shopware\_Modules\_Order\_SaveOrder\_FilterDetailsSQL', $sql, array('subject'=\>$this,'row'=\>$basketRow,'user'=\>$this-\>sUserData,'order'=\>array("id"=\>$orderID,"number"=\>$orderNumber)));