1

我正在 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() 调用它。但故事似乎是一样的。

任何帮助将不胜感激。

请帮忙。

4

2 回答 2

3

您应该考虑使用观察者而不是覆盖控制器。如果您查看其中的addItem方法,Mage_Sales_Model_Quote您会发现该事件sales_quote_add_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 上找到:

http://www.magentocommerce.com/wiki/5__-_modules_and_development/0__-_module_development_in_magento/customizing_magento_using_event-observer_method

于 2012-11-28T10:14:50.147 回答
0

您好,请检查以下代码:

$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();
}
于 2016-02-24T06:39:40.570 回答