Produktepreise in Abhängigkeit des Warenkorb-Gewichts

Hallo Leute, ich habe die Anforderung, dass die Staffelpreise eines Produktes abhängig sind von dem Gesamtgewicht des Warenkorbs. Als Beispiel: Artikel A wiegt 1KG und kostet 2€ bei Warenkorb-Gewicht < 10KG und 1€ bei WK-Gewicht >= 10KG. Artikel B wiegt 2KG und kostet 3€ bei Warenkorb-Gewicht < 10KG und 2€ bei WK-Gewicht >= 10KG. Wenn ich nun 2 * A und 2 * B in den WK lege, dann ergibt das insgesamt 6KG, also 2 * 2€ + 2 * 3€ = 10€. Wenn ich aber noch 3 * B zusätzlich in den WK lege, dann reduziert sich nicht nur der Preis von B, sondern auch von A. Ich habe dann nämlich insgesamt 2 * A und 5 * B, also 2 * 1KG + 5 * 2 KG = 12KG im Warenkorb. Dadurch kostet A 1€ pro Artikel und B 2€. Insgesamt also 2 * 1€ + 5 * 2€ = 12€. Nun zu meinem Problem: Ich habe bei den Produkten Staffelpreise hinterlegt. Diese gelten nun aber eigentlich für die Stückzahlen und nicht für das Gewicht. Deswegen wollte ich nun den Warenkorb bearbeiten, wenn ich ihn öffne. Ich hänge mich mit meinem Plugin also bei “Enlight_Controller_Action_PostDispatch_Frontend_Checkout” ein. Nun müsste ich im Grunde ja nur alle Artikel im Warenkorb durchgehen und die Preise aktualisieren (das Gesamtgewicht kenne ich ja durch sDispatch.weight). Doch genau hier scheitere ich, da ich nicht weiß, wie ich die entsprechenden Variablen ansprechen kann. Gibt es dafür auch eine gewisse Auslistung? So wie es eine Auflistung aller Events gibt? Ich bräuchte also im Grunde nur noch den Zugriff auf: - Die Artikel in der Session und somit dessen ID - Anhang der ID muss ich den entsprechenden Artikel aus der Datenbank holen - und somit bekomme ich auch die Staffelpreise - und dann muss ich nur noch den Preis der Artikel in der Session aktualisieren. In der Theorie sollte das so doch funktionieren?! Kann mir jemand auf die Sprünge helfen? Vielen Dank schon mal.

Plugin „Debug“ im Pluginmanager aktivieren (Shopware-Plugin) -> evtl. Cache löschen?

Erstmal viele Dank für die Antwort. Das war mir auch schon bewusst. Jedoch ist meine Frage eher technischer Natur. Wie ich also in meinem Code auf diese Variablen zugreife. Damit wären dann auch Punkt 1 und 3 abgehakt. Ich kann dann die Variablen auslesen und auch wieder reinschreiben. Dann bleibt nur noch die Frage, wie ich einen entsprechenden Artikel aus der Datenbank bekomme. Und vielleicht kann mir auch mal jemand erklären, wie der Debugger richtig funktioniert. Wenn ich Beispielsweise den Artikel ausgelesen habe - wie bekomme ich das Array dann mittels Firebug/Firephp in der Konsole ausgegeben? Mittels Shopware()->Debuglogger() hatte ich bisher mäßigen Erfolg. :frowning:

[quote]Die Artikel in der Session und somit dessen ID[/quote] $basket = $view->sBasket. Die Artikel selbst sind in $basket[‘content’] [quote]Anhang der ID muss ich den entsprechenden Artikel aus der Datenbank holen [/quote] Entweder über Shopware()->Modules()->Article()->sGetPromotionById(‘fix’, 0, $ordernumber) oder mit Shopware()->Models()->getRepository(’\Shopware\Models\Article\Detail’)->findOneBy(array(‘number’=>$ordernumber)); [quote]und dann muss ich nur noch den Preis der Artikel in der Session aktualisieren.[/quote] Einfach $basket wiede in $view schreiben. Den Code habe ich nicht geprüft, vielleicht habe ich mich irgendwo vertippt. Aber auf diese Weise geht das.

Vielen Dank soweit schon mal. Das hat bisher auch alles geklappt. Nun kommt aber die Ernüchterung: In die Session zu schreiben scheint nicht so viel zu bringen, da bereits in checkout/confirm/ alles wieder überschrieben wird. Da könnte ich es natürlich erneut überschreiben, aber ich nehme an, dass die getätigte Bestellung letztendlich auch wieder überschrieben wird. Wie gehe ich denn jetzt am Besten vor? :wtf:

Inzwischen bin ich so weit, dass ich auch den Basket in der Datenbank aktualisiere und bis zum Confirm alles richtig läuft. Wenn ich dann jedoch auf „Zahlungspflichtig bestellen“ klicke und an PayPal weitergeleitet werde, zeigt mir PayPal wieder die „falschen“ Preise an und die Datenbank wurde auch wieder geupdatet. Wie kann ich das bloß unterbinden?

Schau dir mal die Methode sBasket::sGetBasket() an. Ein after hook oder eine Registrierung auf das event “Shopware_Modules_Basket_GetBasket_FilterResult” werden dich zum Ziel führen. Du brauchst weder die Datenbank, noch die Session manipulieren. Viele Grüße

Das war der Schlüssel zum Erfolg! :slight_smile: Ich habe nun ein After-Hook auf die Methode sBasket::sGetBasket() erstellt. Jetzt bleibt nur noch eine Frage offen: Die Preise sollten nur bei bestimmten Produktgruppen manipuliert werden. Wie bekomme ich also an der Stelle raus, ob ich nun z.B. eingeloggt bin als ein Kunde mit der Kundengruppe „Händler“? Vielen vielen Dank soweit!

Und ich habe ein Problem beim bestellen mit PayPal: Transaction refused because of an invalid argument. See additional error messages for details… The totals of the cart item amounts do not match order amounts. Was genau wird denn geprüft wenn die Bestellung an PayPal gesandt wird? Das müsste ich dann wohl auch noch anpassen…

  1. Die Kundengruppe steht in der Session. 2. Schau dir mal den return deines hooks an. Du hast wahrscheinlich die Kosten der einzelnen Artikel erhöht - aber nicht die Endsumme angepasst. Viele Grüße

Kann ich mir die Session auch mal irgendwo ausgeben lassen? Bzw. auch den return meines Hooks? Mit Shopware()->Debuglogger() kann man scheinbar nur primitive Datentypen ausgeben lassen?!