Как программно заменить товары в корзине?


Я попробовал два разных подхода для этого, но оба потерпели неудачу в разные моменты.

  1. , вызвав $cart->truncate()->save(), а затем $cart->addProduct($product, $qty). Но вместо того, чтобы заменять всю корзину новыми товарами, перекрывающиеся товары (с одинаковым количеством или без него) в любом случае будут удалены.
  2. Я также пробовал $quote->removeAllItems()->collectTotals()->save(), а затем $cart->addProduct($product, $qty), но когда количество перекрывающегося товара в совокупности превышает уровень запасов, это вызовет ложную ошибку нет на складе сообщение.

Подробнее о 2

Я погрузился в код, который проверяет уровень запасов, который Mage_CatalogInventory_Model_Observer::checkQuoteItemQty().

Каждый раз, когда я тестирую код в 2), в общей сложности он проверялся четыре раза, и в 3-й раз $qtyForCheck этого конкретного перекрывающегося элемента суммируется с количествами до И после removeAllItems(), эффективно генерируя сообщение о ложной ошибке.

Author: Vicary, 2015-01-05

1 answers

Почему бы не объявить корзину заново и не начать все сначала вот так?

$session = Mage::getSingleton('checkout/session');
$session->getQuote()->delete();
$session->clear();

$cart = Mage::getModel('checkout/cart');
$cart->setQuote($session->getQuote());

$product = Mage::getModel('catalog/product') -> load($product_id);
if ($product) {
    if ($product -> isSaleable()) {
        $cart -> addProduct($product, array('qty' => $qty));
    }
}

// $session->setCartWasUpdated(true); // Not really necessary - Vicary
$cart->save();
 3
Author: Moose, 2015-01-05 08:02:46