Order Discount (nicht Basket) auslesen und ändern


#1

Hallo zusammen,

in der Klasse oxOrder sehe ich laut Doku keine Möglichkeit den Rabatt auszulesen und/oder zu ändern. Im Admin-Bereich kann ich den Rabatt bei einer Bestellung aber nachträglich ändern (Bestellungen -> Stamm -> Rabatt).

Kann mir mal jemand auf die Sprünge helfen, wie ich den Gesamt-Rabatt einer Bestellung auslesen und ändern kann? Danke!

Das ganze sollte in der ThankYouController.php passieren.

Danke und viele Grüße,

Thorsten


#2

Im oxOrder Objekt selbst ist es das oxdiscount Feld.
Die Berechnung der Rabatte und der restlichen Preise erfolgt aber im oxBasket, welches erst nach Abschluss der Bestellung eben zu einem oxOrder umfunktioniert wird.
D.h. wenn du Preise neu berechnen musst, geht das ggf nur im oxBasket


#3

Naja… ich muss eigentlich keine Preise neu berechnen. Ich will wirklich nur dieses Feld auslesen und einen vorher berechneten Rabatt hinzurechnen.

Das geht im Admin ja auch nachträglich.

Aber WENN das WIRKLICH nur im Basket gehen sollte, dann ist das auch nicht schlimm, wenn es denn funktionieren würde.

Mein Ansatz bisher:

$oBasketDiscount = $this->getSession()->getBasket();
$discountOld = $oBasketDiscount->getTotalDiscount();
$discountNew = $discountOld + 10;
$oBasketDiscount->setTotalDiscount($discountNew );

Das wirft zwar keinen Fehler, aber funktioniert halt auch nicht. Es landet kein Discount in der Bestellung.


#4

dann gibts entweder kein Discount oder irgendein Modul pfuscht rein.
das hier ist unser matomo/piwik Code und es funktioniert totsicher:


#5

Dann ist der Basket wohl schon in eine Order umgewandelt worden und deswegen greift die oxBasket Klasse setTotalDiscount nicht mehr.

Ich habe aber immer noch nicht verstanden, wie ich an der Stelle das Feld überschreiben kann. Laut Doku gibt es dafür keine Klasse:

https://docs.oxid-esales.com/sourcecodedocumentation/4.8.7/classox_order.html

Ich kann den Discount auslesen aber nicht ändern? Wieso geht das denn dann im Admin?

In Deinem Beispiel liest Du das Feld ja nur aus, wenn ich das richtig sehe. Und auch aus einer .tpl und nicht in der ThankYouController.php


#6

Eine Klasse fürs Überschreiben von Feldern? Ich wüsste auch nicht, dass es sowas gäbe.
Das Feld ist eine ganz normale object property “oxorder__oxdiscount” im oxOrder mit einem oxField Objekt drin, dessen value dann dem Discount-Wert entspricht.
mach mal:

$order->assign(["oxorder__oxdiscount" => "12345"]);

Schau mal in die init() Methode, da wird direkt zu Anfang der Warenkorb aus der Session entfernt. Um auf den ehemaligen Warenkorb zuzugreifen, aus dem jetzt die Bestellung entstanden ist, musst du $this->getBasket() machen, zumindest in 4.10. Den Code von V6 habe ich gerade nicht vor mir. Aber was auch immer dort verändert wird, hat keinen Einfluss mehr auf die Bestellung, da diese zu diesen Zeitpunkt schon generiert wurde.


#7

Jetzt kapier ich, was Du meinst. Ich wusste nicht, dass man mit assign einzelne Felder in der db überschreiben kann.

Hab den Code nun wie folgt geändert.

$oOrder = oxNew(\OxidEsales\Eshop\Application\Model\Order::class);
if ($oOrder->load($this->_oBasket->getOrderId())) {
	$discountOld = $oOrder->oxorder__oxdiscount->value;
	$discountNew = $discountOld + 10;
	$oOrder->assign(["oxorder__oxdiscount" => $discountNew]);
}

Gibt keinen Fehler, funktioniert aber leider trotzdem nicht. Muss da eventuell noch irgendwas neu kalkuliert werden oder so? Auf jeden Fall schon mal Danke für den Denkanstoß. Da hab ich was, wo ich weiter wurschteln kann. :+1:


#8

in der DB wird da noch nichts geändert, lediglich in dem vorliegenden Objekt in PHP. Damit es zurück in die DB kommt, musst Du $oOrder->save(); machen


#9

Und täglich grüßt das Murmeltier…

Kein Fehler aber auch kein Effekt nach dem save() :sob: