我想以编程方式将产品添加到购物车。另外,添加到购物车后,我想更改产品价格。
假设我的产品价格为100美元。加入购物车后,我想将其更改为$ 90。
我将产品添加到购物车。但是,我无法更改产品价格。
可能吗?
以下是将产品添加到购物车的代码:-
$cart = Mage::getSingleton('checkout/cart'); try { $cart->addProduct($product, array('qty' => 1)); $cart->save(); } catch (Exception $ex) { echo $ex->getMessage(); }
在深入研究了Magento的核心代码之后,我发现您需要使用$item->getProduct()->setIsSuperMode(true)它才能进行制作$item->setCustomPrice()和$item->setOriginalPrice()工作。
$item->getProduct()->setIsSuperMode(true)
$item->setCustomPrice()
$item->setOriginalPrice()
以下是一些示例代码,您可以在用于监听checkout_cart_product_add_afteror checkout_cart_update_items_after事件的Observer中使用。该代码在逻辑上是相同的,除了checkout_cart_product_add_after只对一项checkout_cart_update_items_after调用,对购物车中的所有项调用。仅作为示例,此代码被分离/复制为2种方法。
checkout_cart_product_add_after
checkout_cart_update_items_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); } }
/** * @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); } } }