![](/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.