以价格变动以编程方式将产品添加到购物车

我想以编程方式将产品添加到购物车。 另外,我想在添加到购物车时更改产品价格。

假设,我的产品的价格是$ 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()工作。

以下是您可以在侦听checkout_cart_product_add_aftercheckout_cart_update_items_after事件的Observer中使用的示例代码。 代码在逻辑上是相同的,除了仅为一个项目调用checkout_cart_update_items_after并且为购物车中的所有项目调用checkout_cart_update_items_after 。 此代码仅作为示例分离/复制到2个方法中。

事件: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); } } 

事件: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已经改变了购物车中计算价格的方式,这让v1.4以后的版本很难做到这一点。 如果您使用Observer或其他设备确定价格,则几乎肯定会被覆盖回目录价格。

实际上,您需要使用购物车规则来执行此操作。

可以设置报价项目的客户特定价格。 因此,这样的事情应该这样做:

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

希望这可以帮助…

乔纳森的答案可能是大多数情况下最好的。 但是有些顾客可能不喜欢购物车中的购物车折扣。 我最近做了一个项目(与Magento 1.3.3),客户不喜欢如何每个项目仍然显示全价和小计,折扣线低于小计 – 他想看到的价格每个项目打折,小计也显示折扣价格。 他真的不喜欢在小计行之后有折扣行。

无论如何,如果你发现自己在同一条船上,一种方法是重写Mage_Sales_Model_Quote_Address_Item和Mage_Sales_Model_Quote_Item中的getCalculationPrice()和getBaseCalculationPrice()方法。 我知道重写并不总是很漂亮,使用事件要好得多,但在这种情况下,我无法让事件在前端和后端都无缝工作。 不知道这种方法是否可以在Magento 1.4+中使用。

如果我必须分享我在Simon基础上所做的解决scheme,那么我已经设法重写报价的模型类保存function。

 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; } 

我有同样的问题,我不是一个开发人员。 我所做的是在magento后端添加了一个名为“网站价格”的新价格属性。 在产品页面上显示了更高的价格$ 100。 该物品的实际价格是90美元。 所以当购物者将其添加到购物车时,他们将看到该物品的实际价格,但是在产品页面上,他们看到$ 100的自定义属性价格

如果产品页面上的所有价格都高于设定的百分比,那么实际价格只会使您的产品价格乘以1 +百分比。 所以,如果你想增加10%,所有的价格做价格* 1.1这将显示您的价格高10%,但当购物者增加到购物车,他们将看到真实的价格。