![](/img/trans.png)
[英]When adding new product programmatically to existing Cart in Magento 2, product price is 0
[英]Clear existing items in cart before adding a new Item in Magento
我正在 magento 的 checkout/controllers/cartController.php 中创建一个新的购物车 addAction()。 我的需要是,每当将产品添加到购物车时,应清除购物车中的所有现有产品,但当前添加的产品除外。 那是,
如果将诺基亚 3220 添加到空购物车中,则应将其作为项目放置。
之后如果添加诺基亚 N72,则应将诺基亚 3220(即上一项)从购物车中清除并放置诺基亚 N72,依此类推。
我覆盖了 CartController.php 并将代码添加到 CartController.php 中 addAction() 的开头,
$checkout_my_cart = Mage::getSingleton('checkout/cart'); $current_items = $checkout_my_cart->getItems(); foreach ($current_items as $item) { $itemId = $item->getItemId(); $checkout_my_cart->removeItem($itemId)->save(); }
但是当我添加一个新项目来替换现有项目时,它会清除整个购物车! 我认为它不应该这样做,因为我在 Addaction() 的开头添加了代码。 我尝试将上述代码定义为函数并使用 addAction() 调用它。 但故事似乎是一样的。
任何帮助将不胜感激。
请帮忙。
您应该考虑使用观察者而不是覆盖控制器。 如果您查看Mage_Sales_Model_Quote
中的addItem
方法,您会发现该事件sales_quote_add_item
。
您可以观察它,获取quote_item
(事件的参数)并删除quote_item
项目(手动输入,因此请仔细检查错误):
public function observeAddItem($observer)
{
$item = $observer->getEvent()->getQuoteItem();
$cart = Mage::getSingleton('checkout/cart');
foreach ($cart->getQuote()->getItemsCollection() as $_item) {
if($_item->getId() != $item->getId()) {
$_item->isDeleted(true);
}
}
}
覆盖类(尤其是控制器)应该是你最后的手段。
更多关于如何观察事件的信息可以在 magento wiki 上找到:
您好,请检查以下代码:
$session= Mage::getSingleton('checkout/session');
$quote = $session->getQuote();
$cart = Mage::getModel('checkout/cart');
$cartItems = $cart->getItems();
foreach ($cartItems as $item){
$quote->removeItem($item->getId())->save();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.