Magento在观察者中重新计算购物车总数

时间:2011-10-03 18:06:22

标签: session magento observer-pattern cart

我有一个观察员,如果他们缺货就会从购物车中移除商品(即顾客退回购物车的时间x,购物车中的商品已经缺货),并向用户显示消息

删除项目有效,但更新购物车总数不会。非常感谢任何帮助!

我的观察者观察sales_quote_save_before事件:

public function checkStockStatus($observer)
{
    // return if disabled or observer already executed on this request
    if (!Mage::helper('stockcheck')->isEnabled() || Mage::registry('stockcheck_observer_executed')) {
        return $this;
    }

    $quote = $observer->getEvent()->getQuote();
    $outOfStockCount = 0;

    foreach ($quote->getAllItems() as $item) {
        $product = Mage::getModel('catalog/product')->load($item->getProductId());
        $stockItem = $product->getStockItem();
        if ($stockItem->getIsInStock()) {
            // in stock - for testing only
            $this->_getSession()->addSuccess(Mage::helper('stockcheck')->__('in stock'));
            $item->setData('calculation_price', null);
            $item->setData('original_price', null);
        }
        else {
            //remove item 
            $this->_getCart()->removeItem($item->getId());
            $outOfStockCount++; 
            $this->_getSession()->addError(Mage::helper('stockcheck')->__('Out of Stock'));
        }
    }

    if ($outOfStockCount) > 0) {       
        $quote->setTotalsCollectedFlag(false)->collectTotals();
    } 

    Mage::register('stockcheck_observer_executed', true);

    return $this;         
}

protected function _getCart()
{
    return Mage::getSingleton('checkout/cart');
}

protected function _getSession()
{
    return Mage::getSingleton('checkout/session');
}  

3 个答案:

答案 0 :(得分:21)

  

提示当天:,观察 * _ save_after 并尝试强制更改同一个对象   通常会再次调用保存,最终会进入无限循环 .oO

但是,如果你在引用类中观察到collectTotals()方法,那么你会注意到你错过了一个重要的标志->setTotalsCollectedFlag(false)->collectTotals(),以便在计算完成后进行计算。

如果你的荣耀之路中没有一些错误,那么生活会有所不同,所以要注意Magento中的以下问题:Issue #26145

答案 1 :(得分:4)

感谢@Anton的帮助!

最终为我工作的答案是在重定向之前(在观察者中)调用session_write_close();

if (// products are out-of-stock and were removed...) {
    $this->_getSession()->addError('Error message here.');
    $this->_getSession()->getQuote()->setTotalsCollectedFlag(false)->collectTotals();
    session_write_close();
    Mage::app()->getResponse()->setRedirect('index');
}

答案 2 :(得分:0)

接下来的流程如何:

  1. sales_quote_save_before上的观察者中删除项目并向注册表添加一些标记:Mage::register('ooops_we_need_a_redirect', $url)

  2. sales_quote_save_after的观察者中,根据需要重定向:

    if(Mage :: registry('ooops_we_need_a_redirect')){     //做重定向 }