Hallo und schönen Sonntag,
Für die Modifikation der Preisberechnung von Artikel, muss ich neben dem Preisberechnungsservice auch noch die Berechnung beim Hinzufügen des Produktes in den Cart modifizieren. Dafür nütze ich den Filter-Event
**Shopware\_Modules\_Basket\_AddArticle\_FilterSql**
An diesen Filter wird folgender SQL Query übergeben, für den ich entsprechend die Preise modifizieren muss.
$sql = "
INSERT INTO s_order_basket (id, sessionID, userID, articlename, articleID,
ordernumber, shippingfree, quantity, price, netprice,
datum, esdarticle, partnerID, config)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
";
Die ? werden dann durch entsprechende Parameter in der sBasket Klasse ersetzt. Mein Problem ist nun, dass ich noch keinen schönen Weg gefunden habe um hier den Preis zu manipulieren. Ersetze ich bei den Values die ? für price und netprice durch manipulierte Werte, führt das natürlich zu einer Exception, da es mehr Parameter als Parameter-Platzhalter gibt.
Hier meine Methode, die den Event konsumiert und den Query modifiziert:
/**
* Due to the fact that the cart is on the old system and uses an own price calculation
* algorithm and not the price_calculation_service, we have to emit the event
* Shopware_Modules_Basket_AddArticle_FilterSql and manipulate the SQL query
* which is executed each time a product is added to the cart.
*
* @param \Enlight_Event_EventArgs $args
* @return string
*/
public function basketAddArticleFilterSql(\Enlight_Event_EventArgs $args) {
// Get orderNumber of article for order_basket id
$article = ($args->get('article'));
$orderNumber = $article['ordernumber'];
// Get the shop context
$context = $this->container->get('shopware_storefront.context_service')->getContext();
// Use the productService to get the product with prices calculated by the
// price_calculation_service which is decorated by this plugin.
$productService = Shopware()->Container()->get('shopware_storefront.product_service');
$product = $productService->get($orderNumber,$context);
$cheapestPrice = $product->getCheapestPrice();
// Add some dummy prices here
$price = $cheapestPrice->getCalculatedPrice();
$netPrice = $cheapestPrice->getRule()->getPrice();
// @TODO Fix SQL Statement
// Manipulate the query so that the correct price is set on the statement
$query = "
INSERT INTO s_order_basket (id, sessionID, userID, articlename, articleID,
ordernumber, shippingfree, quantity, price, netprice,
datum, esdarticle, partnerID, config)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, "+$price+", "+$netPrice+" , ?, ?, ?, ? )
";
// -> Causes exception due to wrong parameter count
return $query;
}
Hat jemand eine Idee, wie ich die Manipulation hier am Besten anstelle??
Danke & LG
Synonymous