Hallo!
Ich versuche aus unserem bestehenden xt:Commerce-Shop eine Funktionalität nach Shopware zu übertragen: Schöne USD-Preise. Weil bei einem Europreis von 379 ein USD-Preis von 358,37 einfach nicht schön aussieht soll er auf 359 gerundet werden.
Ich hab mir dazu den price_calculation_service ersetzt (dekorieren geht nicht da alle Funktionen private):
$this->subscribeEvent(
'Enlight_Bootstrap_AfterInitResource_shopware_storefront.price_calculation_service',
'registerPriceCalculationService'
);
Die Function calculatePrice() hat eine entsprechende Änderung, dass bei Währung USD eine Rundung auf den nächsten 5er oder 9er stattfindet. Das funktioniert auch alles soweit prima, überall wird der gerundete USD-Preis angezeigt.
Sobald man aber das Produkt in den Warenkorb legt landet es dort nicht mit den erwarteten 359 USD sondern es wird der Euro-Preis von 379 angezeigt.
Ich hab dann auf Twitter (Link zur Diskussion) noch den Tipp bekommen, das über den Event Shopware_Modules_Basket_getPriceForUpdateArticle_FilterPrice zu lösen. Damit kann ich zwar den Preis überschreiben, aber die 359 tauchen nirgends auf. Selbst wenn ich mir die Preise hier nochmal hole für das Produkt tauchen leider nur die 379 auf:
$return = $arguments->getReturn();
$repository = Shopware()->Models()->getRepository('Shopware\Models\Article\Detail');
$article = $repository->findOneBy(array('id' => $return['articleID']));
\Doctrine\Common\Util\Debug::dump($article->getPrices());
(es gibt keine Doku zu dem Event, von daher ist mir leider unklar wie ich ohne erneuten Weg über das Repository an die Artikeldaten komme)
array(1) {
[0]=>
object(stdClass)#1792 (15) {
[" __CLASS__"]=>
string(29) "Shopware\Models\Article\Price"
["id"]=>
int(7118)
["articleId"]=>
int(38)
["articleDetailsId"]=>
int(38)
["customerGroupKey"]=>
string(2) "EK"
["from"]=>
int(1)
["to"]=>
string(8) "beliebig"
["price"]=>
float(318.48739495798)
["pseudoPrice"]=>
float(0)
["basePrice"]=>
float(0)
["percent"]=>
float(0)
["detail"]=>
string(30) "Shopware\Models\Article\Detail"
["customerGroup"]=>
string(54) "Shopware\Proxies\ __CG__ \Shopware\Models\Customer\Group"
["attribute"]=>
NULL
["article"]=>
string(55) "Shopware\Proxies\ __CG__ \Shopware\Models\Article\Article"
}
}
Es scheint so als würde der Basket den price_calculation_service gar nicht erst benutzen. Die zentrale Frage ist jetzt: Wie kann ich es trotzdem erreichen, dass auch im Warenkorb der Preis angezeigt wird, den ich haben will?
Matt