在Magento中添加新项目之前清除购物车中的现有项目

时间:2012-11-28 09:01:48

标签: php 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) - >保存();     }

但是当我添加新项目来替换现有项目时,它会清除整个购物车!我认为不应该这样做,因为我在Addaction()的开头添加了代码。我尝试将上面的代码定义为函数并使用addAction()调用它。但故事似乎是一样的。

任何帮助将不胜感激。

请帮助。

2 个答案:

答案 0 :(得分:2)

您应该考虑使用observer而不是覆盖控制器。如果您查看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

答案 1 :(得分: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();
}