2015-05-29 112 views
3

我想添加新商品时从购物车中删除商品。我正在观察:checkout_cart_add_product_complete事件。我的代码如下:从magento中添加新商品时删除商品

<checkout_cart_add_product_complete> 
    <observers> 
     <secodaryproduct> 
      <type>singleton</type> 
      <class>secodaryproduct/observer</class> 
      <method>checkoutCartAddProductAddComplete</method> 
     </secodaryproduct> 
    </observers> 
</checkout_cart_add_product_complete> 

以及用于删除产品:

$quote = Mage::getSingleton('checkout/cart'); 
$quote->removeItem($product['item_id']); 
$quote->save(); 

当我把这个代码,而观察者则能正常工作,并删除所需物品。但是,如果我使用这个使用观察员,然后项目不从购物车删除。我也将输出放在日志文件中,并且项目ID正确打印,但我的项目不会从购物车中删除。 请帮忙。

+1

$ product ['item_id']'从哪里来?请注意,您必须使用引号项目的id通过'Mage_Sales_Model_Quote :: removeItem($ itemId)'将其删除,而不是某种产品ID。 –

+0

是$ product ['item_id']是“sales_flat_quote_item”记录的标识。并且我已经在日志文件中打印了项目标识,并且显示正确。在checkout_cart_add_product_complete事件的情况下,只有删除查询不起作用,但在checkout_cart_update_items_after和sales_quote_remove_item事件的情况下,此功能正常工作。 –

回答

0

当在/checkout/cart/add中调用Mage::dispatchEvent('checkout_cart_add_product_complete', ...)时,相关的Mage_Catalog_Model_Product实例被传递给事件观察者。所以你应该可以做这样的事情,这将删除所有匹配该产品ID的购物车商品:

public function checkoutCartAddProductAddComplete(Varien_Event_Observer $observer) 
{ 
    /* @var Mage_Catalog_Model_Product $product */ 
    $product = $observer->getProduct(); 
    /* @var Mage_Checkout_Model_Cart $cart */ 
    $cart = Mage::getSingleton('checkout/cart'); 
    $cartItems = $cart->getItems(); 
    /* @var Mage_Sales_Model_Quote_Item $item */ 
    foreach ($cartItems as $item) { 
     if ($item->getProductId() == $product->getId()) { 
      $cart->removeItem($item->getId()); 
     } 
    } 
    $cart->save(); 
} 
+0

我有要删除的项目的项目标识,但由于某种原因无法执行删除操作。根据你给出的解决方案,我可以得到物品ID,但删除仍然无法正常工作。 –

+0

@GaganpreetKaur - 在您的示例中'$ product ['item_id']'不会在事件'checkout_cart_add_product_complete'中设置。我更新了我的示例,在删除项目后有'$ cart-> save()',因为我之前将它们放在一起,但未测试它。现在它可以删除任何匹配传递给活动的产品ID **的购物车商品。你将不得不修改它以适应你的需求。 – fantasticrice