Tester gesucht! - Flächen-Preis-Berechnung

Morgen zusammen, könnt ihr bitte mal unter http://ottscho.dyndns.org/ ein paar Testeinkäufe machen. Es geht speziell um die beiden Artikel „Tubenhonig“ und „Thermotasse Forest“, welche in den Topsellern zu finden sind. Bei diesen beiden Artikeln sind m² Preisstaffeln hinterlegt. Einfach etwas spielen und mir bitte Feedback geben. Das wechseln zwischen Feld1(Breite) und Feld2(Länge) funktioniert nur mit TAB oder Mausklick, bei ENTER wird leider der „In Warenkorb Button“ betätigt. Das konnte ich noch nicht unterbinden! Vielen Dank

Hey Benny, es gibt da noch Probleme. Wenn ich z.B. von einem Artikel in 50cm x 100cm 4 Stück in den Warenkorb lege, und dann vom gleichen Artikel noch 1 Stück in 20cm x 40cm, habe ich 5 Stück von 20cm x 40cm im Warenkorb, die vorher reingelegten 4 Stück werden also überschrieben. Ansonsten finde ich das schon nicht schlecht, könnte ich evtl. auch bei dem einen oder anderen Artikel gebrauchen. Grüße Frank

[quote=“ottscho”]…, bei ENTER wird leider der “In Warenkorb Button” betätigt. Das konnte ich noch nicht unterbinden![/quote] Baue in das Element mal ein onclick=“return false;” ein, das sollte helfen

@taaucher Danke. Ja, das Problem habe ich auch schon bemerkt. Leider laufen die Artikel ja unter einer Artikel ID. Wenn ich zwei mal den gleichen Artikel mit einem unterschiedlichen Maß bestelle, wird der erste überschrieben. Habe im Moment noch keine Lösung dafür :frowning: Aber früher oder später bekomme ich das sicher noch hin. Vielleicht bekomme ich ja nen Tipp von Shopware… @avenger Wie immer hast du eine Lösung gefunden… Danke :wink:

Habe versucht den Artikel ‘Tubenhonig’ in den Warenkorb zu legen. Geht nicht. Win Xp, FF 3.6.3

Man müsste sich noch was für den default-Preis überlegen. Das irritiert erstmal, dass da beim 1. Betreten der Seite nichts zu sehen ist. Und vielleicht könntest du das onkeyup-Element verwursten - dann wird die Berechnung automatisch ausgeführt, wenn der Kunde in ie Felder etwas eingibt. Ein ketzerischer Gedanke: wäre nicht die Darstellung in einer Tabelle übersichtlicher, oder sollen da wirklich sehr viele unterschiedliche Kombinationen möglich sein? Ich als Kunde fände es eher nervig, dass ich nicht auf einen Blick sehe, was in welcher Kombination wie viel kostet. Ansonsten: sehr gute Sache!!!

[quote=“ottscho”]@taaucher Danke. Ja, das Problem habe ich auch schon bemerkt. Leider laufen die Artikel ja unter einer Artikel ID. Wenn ich zwei mal den gleichen Artikel mit einem unterschiedlichen Maß bestelle, wird der erste überschrieben. Habe im Moment noch keine Lösung dafür :frowning: [/quote] Man könnte eigene Artikelnummern (ordernumber) im Warenkorb vergeben (z.B. SW18000-10x20). Vor Update des Warenkorbs zurücksetzen (-> SW18000) und nachher wieder setzen. Hab das mal getestet und es funktioniert gut. Hier wird das so gemacht: http://www.shopware.de/wiki/Wie-kann-ic … il_24.html Die Frage ist natürlich, ob dann andere Module damit klarkommen!!? PS.: Außerdem zieht das noch weitere Änderungen an Shopware nach sich. Die einfachere Variante wäre auf jeden Fall eine Reihe vom Kombinationen vorzugeben.

Danke für die vielen Antworten. Ich habe mir das bis jetzt nur für normale Artikel gedacht. Also keine Varianten-Möglichkeit. Zumindest nicht die standard Varianten von Shopware. @Radox Jetztg geht der Warekorb wieder. Lag an der Änderung, welche Avenger genannt hat. Dein Link schau mich mir mal an. Danke @ShopFreelancer onkeyup-Element sagt mir im Moment nichts viel. Muss ich wohl mal googeln :wink: Naja, ich wollte über dem Warekorbutton noch die Staffelung anzeigen. >= 1 m² = 100 € >= 2 m² = 95 € >= 3 m² = 90 € So weiß der Kunde die Staffelung und je nach Maß wird eben der Preis berechnet. (Für Werbeagenturen oder Printshops welche inviduelle Größen an Werbeschilder, Flaggen, Banner, etc. Ihren Kunden anbieten wollen). Sowas wäre das Traumziel des Pluginss: http://www.printdino.de/produkte/werbeschilder

Hallo ottscho, jetzt funktioniert es. Das mit dem Berechnen beim keyup-Event ist ne gute Idee. Hier z.B. mit jQuery beschrieben: http://api.jquery.com/keyup/ Ansonsten, interessantes Vorhaben - bin schon mal gespannt.

[quote=“ottscho”]Jetztg geht der Warekorb wieder. Lag an der Änderung, welche Avenger genannt hat. [/quote] Kann nicht sein, da damit ja nur das Klickverhalten des Input-Feldes geändert wurde.

[quote=“avenger”][quote=“ottscho”]Jetztg geht der Warekorb wieder. Lag an der Änderung, welche Avenger genannt hat. [/quote] Kann nicht sein, da damit ja nur das Klickverhalten des Input-Feldes geändert wurde.[/quote] Ich hatte es auch an der falschen Stelle eingebaut :wink:

Gibts noch ein paar Anregungen? Heute Abend schalt ich den Server wieder down. Letzte Chance zu testen :wink: Danke euch

[quote=„radox“][quote=„ottscho“]@taaucher Danke. Ja, das Problem habe ich auch schon bemerkt. Leider laufen die Artikel ja unter einer Artikel ID. Wenn ich zwei mal den gleichen Artikel mit einem unterschiedlichen Maß bestelle, wird der erste überschrieben. Habe im Moment noch keine Lösung dafür :frowning: [/quote] Man könnte eigene Artikelnummern (ordernumber) im Warenkorb vergeben (z.B. SW18000-10x20). Vor Update des Warenkorbs zurücksetzen (-> SW18000) und nachher wieder setzen. Hab das mal getestet und es funktioniert gut. Hier wird das so gemacht: http://www.shopware.de/wiki/Wie-kann-ic … il_24.html Die Frage ist natürlich, ob dann andere Module damit klarkommen!!? PS.: Außerdem zieht das noch weitere Änderungen an Shopware nach sich. Die einfachere Variante wäre auf jeden Fall eine Reihe vom Kombinationen vorzugeben.[/quote] Hey Ralf, mit meiner Oberfläche bin ich nun fertig und das speichern im Warenkorb funktioniert soweit auch, wenn der gleiche Artikel nicht zwei mal bestellt wird. Ich habe mir das Beispiel angeschaut, leider klappt es bei mir nicht. Du hast es ja mal getestet und es geht! Mein bisheriges vorgehen: 1. Artikel wird gekennzeichnet 2. Wir ein gekennzeichneter Artikel in den Warenkorb gelegt, so läuft erst die originale Funktion ab und ich klicke mich dann über TypeAfter an die Hooks und ändere den Preis des Artikels ab. // Preis 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 )); Vielleicht hast du mir einen Tipp. Mein Problem, die original Funktion erstellt den Datensatz mit ordernumber=original, mein Hook Type After macht dann aus der ordnumber=orginial_123. Und schon wird der Warekorb als leer angezeigt. Außerdem hab ich noch das Problem, dass bei jedem Klick auf „Ware hinzufügen“, „Warenkorb anzeige“ und „zur Kasse“ die gleiche Funktion aufgerufen wird. Das erschwert mir das ganz deutlich.

Hallo ottscho, ja das funktioniert. Ich hab die Methode verwendet, um eine kleine Variantenverwaltung zu erstellen. Wenn ich heute abend dazukomme, kann ich die Events/Hooks mal zusammenstellen, die du dafür brauchst.

So, hab hier die grundlegenden Funktionen mal reingepackt. Das Plugin hat etwas über 700 Zeilen Code. Den Rest hab ich gelöscht und dann das ganze noch etwas umgestrickt. Läuft also so jetzt wahrscheinlich nicht, aber man kann erkennen wie es funktioniert. Evtl. gibts ja noch eine einfachere Lösung?? [code]<?php class Shopware_Plugins_Frontend_PluginName_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
protected static $articleOrderNumber = null;
protected static $variantId = null;
protected static $articleAdded = false;
protected static $cancelUpdate = false;

public function install()
{
	$event = $this->createEvent( 'Shopware\_Modules\_Basket\_AddArticle\_Start', 'onBasket\_AddArticle\_Start' ); $this-\>subscribeEvent($event); $event = $this-\>createEvent( 'Shopware\_Modules\_Basket\_UpdateArticle\_Start', 'onBasket\_UpdateArticle\_Start' ); $this-\>subscribeEvent($event); $event = $this-\>createHook('sBasket', 'sUpdateArticle', 'onBasket\_UpdateArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0); $this-\>subscribeHook($event); return true; } public static function onBasket\_AddArticle\_Start(Enlight\_Event\_EventArgs $args) { $instance = Enlight\_Class::Instance(\_\_CLASS\_\_); $articleOrderNumber = $args-\>getId(); $articleId = Shopware()-\>Modules()-\>Articles()-\>sGetArticleIdByOrderNumber($articleOrderNumber); if (empty($articleId)) return; $customVariantAliases = $instance-\>getVariantAliasData($articleId); // $variantId wäre z.B. '100x200' $variantId = $instance-\>getVariantId(); // Mögliches Prüfen von $variantId // return true; // Cancel process $articleName = Shopware()-\>Modules()-\>Articles()-\>sGetArticleNameByOrderNumber($articleOrderNumber); // ordernumber und articlename bereits vorhandener, gleicher Variante im Wk zurücksetzen (ohne variant-id) $sql = 'UPDATE s\_order\_basket SET ordernumber=?, articlename=? WHERE ordernumber=? ' . 'AND sessionID=? AND modus=0'; Shopware()-\>Db()-\>query($sql, array($articleOrderNumber, $articleName, $articleOrderNumber . ' ' . $variantId, Shopware()-\>SessionID())); self::$articleAdded = true; } public static function onBasket\_UpdateArticle\_Start(Enlight\_Event\_EventArgs $args) { $instance = Enlight\_Class::Instance(\_\_CLASS\_\_); $id = $args-\>getId(); // s\_order\_basket.id $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; } public static function onBasket\_UpdateArticle\_After(Enlight\_Hook\_HookArgs $args) { if (!self::$cancelUpdate && !empty(self::$variantId)) { // ordernumber der Variante setzen (ordernumber + variant-id) $sql = "UPDATE s\_order\_basket SET ordernumber=? WHERE ordernumber=?"; Shopware()-\>Db()-\>query($sql, array(self::$articleOrderNumber . ' ' . self::$variantId, self::$articleOrderNumber)); } } protected function getVariantId() { $length = Shopware()-\>System()-\>\_GET['Laenge']; $width = Shopware()-\>System()-\>\_GET['Breite']; if (isset($length) && isset($width)) return $length . 'x' . $width; else return false; } } [/code]
1 „Gefällt mir“

Hey Ralf, danke für deinen Code. Soweit funktioniert mit dem ordernumber nun alles. Wenn ich zwei mal den gleichen Artikel bestelle, so hab ich zwei Positionen mit verschiedenen ordnumbers, ne nach Größe. Perfekt! Nun hab ich aber irgendwo noch ein Update/Preis Problem. Leg ich den Artikel mit 200x100 = Preis 25 € in den Warenkorb und entscheide mich dann den gleichen Artikel mit 100x500 = Preis 100€ in den Warenkorb zu legen, so habe ich zwar zwei Postionen, aber beide haben den zweiten Preis von 100€. Nun habe ich versucht den Fehler zu finden, ich kann ich lokalisieren, aber ich versehe es nicht. Wenn ich beim Event onBasket_UpdateArticle_After zum Schluss ein exit; einbau, bleibt nachher die Seite zwar beim Warenkorb laden stehen, aber mein phpmyadmin zeigt mit zwei Datensätze mit den richtigen Preisen. Also sollte ja das Event stimmen. Entferne ich das exit; so habe ich nach zweimal den gleichen Preis. Wo liegt das Problem? static function onBasket\_UpdateArticle\_After (Enlight\_Hook\_HookArgs $args) { //CODE um das wesentliche gekürzt!!! // Preis und Menge in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET quantity=?, price=?, netprice=?, ob\_attr1=?, currencyFactor=? WHERE ordernumber=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $quantity, $price, $netprice, $qm, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], self::$articleOrderNumber . ' ' .self::$variantId, $session )); exit; }

Hallo, ‚WHERE ordernumber = ?‘ (self::$articleOrderNumber . ’ ’ .self::$variantId) noch an den Schluß der SQL-Anweisung. DieseZeile kann auch noch raus. $customVariantAliases = $instance->getVariantAliasData($articleId);

[quote=„radox“]Hallo, ‚WHERE ordernumber = ?‘ (self::$articleOrderNumber . ’ ’ .self::$variantId) noch an den Schluß der SQL-Anweisung. DieseZeile kann auch noch raus. $customVariantAliases = $instance->getVariantAliasData($articleId);[/quote] Die Zeile mit $customVariantAliases hab ich schon entfernt, danke. Das WHERE, welches du gepostest hast, ist doch schon drin :wink: Das exit; kommt ja auch nach dem UPDATE und in der DB ist zu der Zeit alles korrekt. Was wird nach dem Event ausgeführt, wenn kein exit; am Schluss verwendet wird? Ich kann mir das echt nicht erklären :frowning:

Hast recht - stimmt ja soweit schon alles. Sitze momentan an einem kleinen Bildschirm, da ist der Teil der SQL-Anweisung nicht zu sehen. :wink: Ich würde einfach mal schauen, wie oft bzw. für welche Positionen im Warenkorb das Event aufgerufen wird. Schau mal, ob du hiermit die ID des Datensatzes erhältst. $id = $args->getId(); // s_order_basket.id var_dump($id);

Hey Ralf, ich habe jetzt den var_dump eingebaut und ein paar Tests durchgeführt. 1. Versuch - Artikel mit 100x50 zu 50€ eingekauft, ohne exit; am Ende. (id 253 wird nun per var_dump 4x ausgegeben) - gleicher Artikel mit 200x200 zu 100€ eingekauft, mit exit; am Ende. (id 254 wird per var_dump einmal ausgegeben) Fazit: 2 Datensätze mit id 253 und 254 mit den jeweils richtigen unterschiedlichen Preisen. 2. Versuch - Artikel mit 100x50 zu 50€ eingekauft, ohne exit; am Ende. (id 255 wird nun per var_dump 4x ausgegeben) - gleicher Artikel mit 200x200 zu 100€ eingekauft, auch ohne exit; am Ende. (beide id’s werden insgesamt 7x ausgegeben in dieser Reihenfolge: 256 256 255 256 255 256 255) Fazit: 2 Datensätze mit id 255 und 256 mit den dem gleichen Preis - 100€