Как удалить элемент из цитаты в Magento?


Во время процесса оформления заказа я иногда хочу программно удалить элементы из котировки сеанса. Поэтому я попробовал этот код:

$quote = Mage::getSingleton('checkout/session')->getQuote();
$all_quote_items = $quote->getAllItems();
foreach ($all_quote_items as $item) {
    $quote->removeItem($item->getId())->save();
}

Однако после этого цикла список элементов в объекте $quote остается прежним, т. е. никакие элементы не были удалены.

Есть идеи, чего мне здесь не хватает?

Использование Magento 1.4.1.1

4 3

4 ответа:

Попробуйте

$cartHelper = Mage::helper('checkout/cart');
$items = $cartHelper->getCart()->getItems();        
foreach ($items as $item) 
{
   $itemId = $item->getItemId();
   $cartHelper->getCart()->removeItem($itemId)->save();
} 

См. http://www.magentocommerce.com/boards/viewthread/30113/

В версии Magento 1.7.0.0 можно использовать:

Mage::getSingleton('checkout/cart')->truncate()->save();

Я делаю аналогичный процесс при поиске элементов определенного типа, логика, которую я применил, такова:

$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();
}

Попробуйте выше, и если это не удастся, я начну сбрасывать объекты quote до и после выполнения этой логики, чтобы увидеть, какие есть различия.

Попробуйте следующий код, он будет работать

$product = $observer->getEvent()->getProduct();
$cart = Mage::getSingleton('checkout/cart');
foreach ($cart->getQuote()->getItemsCollection() as $_item) {
    if ($_item->getProductId() == $productId) {
            $_item->isDeleted(true);
    //Mage::getSingleton('core/session')->addNotice('This product cannot be added to shopping cart.');
        }
    }