Programmgesteuertes Hinzufügen des Produkts zum Einkaufswagen mit Preisänderung

Ich möchte ein Produkt programmatisch zum Warenkorb hinzufügen. Außerdem möchte ich den Produktpreis ändern, wenn er zum Warenkorb hinzugefügt wird.

Angenommen, der Preis meines Produkts beträgt 100 US-Dollar. Ich wollte es auf $ 90 ändern, wenn es in den Warenkorb gelegt wird.

Ich habe das Produkt in den Warenkorb gelegt. Ich kann den Produktpreis jedoch nicht ändern.

Ist es möglich?

Hier ist der Code, um das Produkt in den Warenkorb zu legen: –

$cart = Mage::getSingleton('checkout/cart'); try { $cart->addProduct($product, array('qty' => 1)); $cart->save(); } catch (Exception $ex) { echo $ex->getMessage(); } 

Nachdem ich ein wenig in $item->getProduct()->setIsSuperMode(true) , musste ich $item->getProduct()->setIsSuperMode(true) verwenden, um $item->setCustomPrice() und $item->setOriginalPrice() arbeiten zu lassen.

Hier ist ein Beispielcode, den Sie in einem Observer verwenden können, der nach den Ereignissen checkout_cart_product_add_after oder checkout_cart_update_items_after abhört. Der Code ist logisch derselbe, außer checkout_cart_product_add_after wird nur für einen Artikel aufgerufen und checkout_cart_update_items_after wird für alle Artikel im Warenkorb aufgerufen. Dieser Code wird nur als Beispiel in zwei Methoden getrennt / dupliziert.

Ereignis: checkout_cart_product_add_after

 /** * @param Varien_Event_Observer $observer */ public function applyDiscount(Varien_Event_Observer $observer) { /* @var $item Mage_Sales_Model_Quote_Item */ $item = $observer->getQuoteItem(); if ($item->getParentItem()) { $item = $item->getParentItem(); } // Discounted 25% off $percentDiscount = 0.25; // This makes sure the discount isn't applied over and over when refreshing $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount); // Make sure we don't have a negative if ($specialPrice > 0) { $item->setCustomPrice($specialPrice); $item->setOriginalCustomPrice($specialPrice); $item->getProduct()->setIsSuperMode(true); } } 

Ereignis: checkout_cart_update_items_after

 /** * @param Varien_Event_Observer $observer */ public function applyDiscounts(Varien_Event_Observer $observer) { foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item /* @var $item Mage_Sales_Model_Quote_Item */) { if ($item->getParentItem()) { $item = $item->getParentItem(); } // Discounted 25% off $percentDiscount = 0.25; // This makes sure the discount isn't applied over and over when refreshing $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount); // Make sure we don't have a negative if ($specialPrice > 0) { $item->setCustomPrice($specialPrice); $item->setOriginalCustomPrice($specialPrice); $item->getProduct()->setIsSuperMode(true); } } } 

Magento hat die Art und Weise geändert, wie die Preise im Warenkorb berechnet werden, was es in v1.4 sehr schwierig macht, dies zu tun. Wenn Sie den Preis mit einem Observer oder einem anderen Gerät einstellen, wird er höchstwahrscheinlich wieder in den Katalogpreis übernommen.

Effektiv müssen Sie Einkaufswagenregeln verwenden, um dies zu implementieren.

Es ist möglich, einen kundenspezifischen Preis für eine Angebotsposition festzulegen. Daher sollte so etwas tun:

 $quoteItem = $quote->addProduct($product, $qty); $quoteItem->setCustomPrice($price); // we need this since Magento 1.4 $quoteItem->setOriginalCustomPrice($price); $quote->save(); 

Hoffe das hilft…

Jonathans Antwort ist wahrscheinlich die beste für die meisten Situationen. Aber einigen Kunden mag es nicht, wie Einkaufswagenrabatte im Warenkorb angezeigt werden. Ich habe kürzlich ein Projekt (mit Magento 1.3.3) gemacht, bei dem es dem Kunden nicht gefiel, wie die einzelnen Werbebuchungen immer noch den vollen Preis und die Zwischensumme zeigten, mit einer Rabattzeile unterhalb der Zwischensumme – er wollte den Preis sehen jeder Artikel diskontiert, und die Zwischensumme zeigt den reduzierten Preis. Er mochte wirklich nicht die Discount-Linie nach der Zwischensumme.

Wenn Sie sich im selben Boot befinden, besteht ein Ansatz darin, die Methoden getCalculationPrice () und getBaseCalculationPrice () in Mage_Sales_Model_Quote_Address_Item und Mage_Sales_Model_Quote_Item zu überschreiben. Ich weiß, dass es nicht immer schön ist, zu überschreiben, viel besser, Ereignisse zu verwenden, aber in diesem Fall konnte ich keine Ereignisse erhalten, die nahtlos sowohl im Frontend als auch im Backend funktionieren. Ich bin mir nicht sicher, ob dieser Ansatz in Magento 1.4+ funktioniert.

Wenn ich meine Lösung, die ich auf der Basis von Simon gemacht habe, teilen muss, dann habe ich es geschafft, die Modellklassen-Speicherfunktion des Zitats neu zu schreiben.

 public function save() { $this->getQuote()->getBillingAddress(); $this->getQuote()->getShippingAddress()->setCollectShippingRates(true); $this->getQuote()->collectTotals(); //$this->getQuote()->save(); foreach($this->getQuote()->getAllItems() as $item) { $productId = $item->getProductId(); $product = Mage::getModel('catalog/product')->load($productId); if($product->getAttributeText('is_dummy') == 'Yes') { $price = 2; $item->setCustomPrice($price); // we need this since Magento 1.4 $item->setOriginalCustomPrice($price); } } $this->getQuote()->save(); $this->getCheckoutSession()->setQuoteId($this->getQuote()->getId()); /** * Cart save usually called after chenges with cart items. */ Mage::dispatchEvent('checkout_cart_save_after', array('cart'=>$this)); return $this; } 

Ich hatte das gleiche Problem und ich bin kein Entwickler. Was ich getan habe, wurde ein neues Preisattribut in Magento Backend namens “Site-Preis” hinzugefügt. Auf der Produktseite zeigte dies den höheren Preis von 100 $. Der tatsächliche Preis des Artikels war 90 Dollar. Wenn der Käufer sie zum Warenkorb hinzufügt, wird der tatsächliche Preis des Artikels angezeigt, auf der Produktseite wird jedoch der benutzerdefinierte Attributpreis von 100 Euro angezeigt

Wenn alle Ihre Preise auf der Produktseite um% höher sind als der tatsächliche Preis, multiplizieren Sie einfach Ihren Produktpreis mit dem 1 + Prozent. Also, wenn Sie 10% zu all Ihren Preisen hinzufügen möchten, tun Sie den Preis * 1.1 Dies wird Ihren Preis als 10% höher anzeigen, aber wenn der Käufer in den Warenkorb fügt, wird er den realen Preis sehen.