Morgen zusammen, ich spiele gerade mit dem Gedanken, eine Flächenberechnung/Preis Kalkulation für Artikel einzuführen. Die Theorie ist klar, ich weiß nur nicht genau, wie ich das in die laufenden Prozeduren einbringen kann. 1.) Artikel bekommt ein Merkmal/Flag = Flächenberechnung 2.) Artikel erhält im Backend einen neuen Reiter, wo Staffel/Flächen Preise hinterlegt werden. Zum Beispiel so: ID | qm | Preis | articleID 1 | 1 | 50€ | 324 2 | 3 | 45€ | 324 3 | 5 | 40€ | 324 3.) Kunde gibt Länge X Breite an und anhand der Matrix wird der Preis berechnet. Nun die große Frage, per JavaScript kann ich das ganze in der Oberfläche schon machen. Hier wird einfach die Ausgabe manipuliert bzw. geändert. Siehe: http://testshop.ottscho.de/lifestyle-wohnen/6/karaffe Aber ich muss ja den berechneten Preis in die Smarty Variable bekommen, so dass der Preis auch in den Warenkorb weitergeben wird. Könnte ich die Preis Variable einfach überschrieben {assign var=“Preis” value=“neuerPreis”} ? Ich bitte um etwas Input, Kritik, Ideen, Ansatzpunkte etc. Danke euch, liebe Community Schönen Tag
Das sind zwei Paar Schuhe. Ich würde nie einen Preis direkt an den Warenkorb übergeben, da dieser dann auch manipuliert werden könnte (wenn man das nicht zusätzlich absichert!). Da muss man ein bisschen tricksen. Da das Feld quantity bei uns vom Typ integer ist, werden keine Kommazahlen unterstützt. Ich würde deshalb, die Quadratmeter in Quadratzentimeter umrechnen. Sprich aus 22,25 qm - werden 2225 qcm - diese setzt du per Javascript in das Hidden-Field “quantity”. Nun schreibst du einen Hook für den Event Shopware_Modules_Basket_UpdateArticle_Start Dort in etwa folgenden Code: static function onUpdatePriceBasket(Enlight\_Event\_EventArgs $args) { $basketId = $args-\>getId(); $basketQuantity = $args-\>getQuantity(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; // Artikel ID und Attribut 12 abfragen // Wenn attribut 12 gesetzt - Quadrameterberechnung ausführen $getArticleId = Shopware()-\>Db()-\>getRow(" SELECT s\_order\_basket.articleID,attr12 FROM s\_order\_basket,s\_articles\_attributes WHERE s\_order\_basket.sessionID = ? AND s\_order\_basket.id = ? AND s\_articles\_attributes.articleID = s\_order\_basket.articleID ",array($session,$basketId)); if (empty($getArticleId) || empty($getArticleId["attr12"]){ return false; // Original funktion ausführen } // Quadratzentimeter in Quadratmeter umrechnen $qm = $quantity / 100; // Preis für diese Menge ermitteln $getPrice = Shopware()-\>Db()-\>getOne(" SELECT price FROM s\_plugin\_ottscho\_quadrameter WHERE articleID = ? AND qmFrom \>= ? AND (qmEnd \<= ? OR qmEnd = NULL) ",array($getArticleId["articleID"],$qm,$qm)); if (empty($getPrice)){ return false; // Wenn kein Preis ermittelt werden konnte - Originalfunktion ausführen } // Preis für einen Quadratzentimer = $price = round($getPrice / $quantity,2); // Netto-Preis - muss ggf. modifiziert werden // Dynamischer Steuersatz + abhängig davon, was in der Datenbank gespeichert ist $netprice = $price / 119 \* 100; // Preis und Menge in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET quantity=?, price=?, netprice=?, currencyFactor=? WHERE id=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $quantity, $price, $netprice, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], $id, $session )); // Ausführung Originalfunktion stoppen return true; }
Das habe ich jetzt so runtergeschrieben - das ist also nur ein Ansatz. Kein lauffähiger Code. Bei der Lösung gibt es auch keinen Varianten-Support, oder Support für Liveshopping / Bundles. Gesteuert wird das über ein Attribut (attr12) im Beispiel. Nur wenn das gesetzt ist, wird die qm Berechnung ausgeführt. Im Warenkorb, in der Bestell-Mail und auch in den PDF-Belegen würde jetzt ja der Preis pro qcm und die Menge in qcm ausgegeben - da müsste man in den Templates eventuell auch das Attribut abfragen und die Ausgabe wieder auf qm umbiegen. Das ist wie gesagt nur ein “erster” Vorschlag. Man könnte die Original-Quantity auch unangetastet lassen und über ein Freitext-Feld in der Datenbank arbeiten. Wie im Beispiel hier: http://www.shopware.de/wiki/Beispiel-Pl … ive-Coding Dann würdest du dieses Freitext-Feld in den Templates abfragen - also Menge wäre dann immer 1 und Preis wäre der Gesamtpreis der Quadratmeter - in den Templates würdest du dann statt dem Feld quantity, das Freitext-Feld als Menge ausgeben, also z.B. ob_attr2.
Moin Stefan, der erster Vorschlag gefällt mir sehr gut. Da werde ich mich mal ran setzen… Wann wird die Hooks ausgeführt? Mit klick auf den “In Warenkorb legen” Button, oder? Dann würde das ja soweit passen. Ich müsste noch die Breite und Länge übergeben und mit in die Bestellung schreiben. Die quantity ist eig. nicht relevant. Bestellt wird trotzdem 1 Stück, 2 Stück etc. Aber mit den angegeben Abmaßen. Kann ich weitere Hidden-Felder anlegen und diese dann im Hooks verwenden? z.B. <input type="hidden" name="sWidht" value="100"><input type="hidden" name="sLength" value="50">
$sWidth = $args-\>getsWidth();
Aber das optische für den Kunde, so in der Art wie ich es schon habe, muss ja beibehalten werden. Sonst würde der Kunde ja den Preis erst sehen, wenn die Ware schon im Warenkorb liegt, oder? Danke dir
*edit*
Wie schaffe ich es am einfachsten, dass die Attr Felder aus s_order_basket (ob_attr1, ob_attr2 etc.) bei einer Bestellung übergeben werden und mit gespeichert werden? Am bestens unter s_order_details unter ob_attr1, ob_attr2 etc. Wenn ich den Code unter sOrder_saveOrder richtig verstehe, sollten die Attr Felder eig. übernommen werden. Bei mir geht das aber nicht! $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)));
Hey Stefan, jetzt habe ich noch ein Problem. Das hidden Feld Menge kann ich leider nicht nehmen, da ich dies ja für die originale Anzahl benötige. 1 Stück, 2 Stück etc. Aber wie bekomme ich sonst einen Wert von der Detailseite im Hooks verfügbar? Mein Code funktioniert jetzt, aber ich brauche noch ein paar Werte, welche ich auf der Detailsseite angebe. Am Besten wären die beiden Werte Länge und Breite, welche in in das Input-feld eingebe. Kannst du mir bitte helfen? EDIT: Per Post geht es nicht. Hier kommt NULL NULL NULL NULL raus Und dann im Hooks $_POST[„test“]
komischerweise geht es mit $_GET[‘test’] Dann hat sich das Problem mit der Wertübergabe erledigt.
Morgen Stefan, ich habe noch ein Problem mit dem Preis. Füge ich den Artikel in den Warenkorb, so erscheint der Dialog (Erfolgreich in den WK gelegt!) Hier zeigt es mir den richtig gerechneten Preis an und wenn ich in der DB schaue, habe ich in s_order_basket auch den richtigen Preis. Klicke ich nun auf weiter shoppen, warenkorb anzeigen oder zur kasse. Hat mein Artikel auf einmal 0€ hinterlegt und ich habe den MIndermengenzuschlag. Woran liegt das? static function onUpdateArticle (Enlight\_Hook\_HookArgs $args) { $id = $args-\>getId(); $quantity = $args-\>getQuantity(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; $sql = "Select articleID from s\_order\_basket WHERE id=".$id; $article = Shopware()-\>Db()-\>fetchAll($sql); $articleid = $article[0][articleID]; $sql = "Select qm, preis from s\_plugin\_OttschoAreaCalculator WHERE articleID=".$articleid; $preise = Shopware()-\>Db()-\>fetchAll($sql); $test = $\_GET['test']; foreach ($preise as $preis) { if ($quantity \<= $preis[qm]) { $price = $test \* $preis[preis]; break; } } //var\_dump($test); // Netto-Preis - muss ggf. modifiziert werden // Dynamischer Steuersatz + abhängig davon, was in der Datenbank gespeichert ist $netprice = $price / 119 \* 100; // 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, $test, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], $id, $session )); // Ausführung Originalfunktion stoppen return true; }
Okay, Problem habe ich nun auch gelöst. Soweit geht alles vom Warenkorb bis zur Bestellung. Jetzt nur noch eins: Warum werden die Attr Felder aus dem Warenkorb nicht in die Bestellung übernommen? Das blick ich nicht SOS