2011-10-03 154 views
11

我有一位观察员,如果他们缺货(即顾客返回购物车x次,并且购物车中的物品已缺货),则从购物车中移除商品,以及向用户显示消息。Magento在观察员中重新计算购物车总计

删除项目工作正常,但更新购物车总额不。任何帮助将不胜感激!

我的观察者观察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

谢谢@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'); 
} 
+0

你可以接受答案,然后让别人知道它已经解决了 –

20

提示的一天:通过观察* _save_after,并试图迫使同一个对象改变 通常称之为再次保存,你将最终在无限循环 .oO

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

生活会是不同的东西,如果有没有在你的路径走向辉煌的一些错误,所以要注意以下问题在Magento:Issue #26145

+0

感谢日积月累!编辑代码以删除无限循环(观察* _save_before并且不会对'save()'进行新的调用)。但是,即使在调用' - > collectTotals()'之前添加' - > setTotalsCollectedFlag(false)''总计不会更新。我还有什么遗漏? –

+0

重新加载后你会看到更改吗? –

+0

是的,但消息消失。如果我在观察者中进行重定向,则立即得到更新的总数,但也没有消息。我后面是两个:) –

0

什么未来流量:

  1. 删除的项目观察者对sales_quote_save_before,并添加一些标志注册地:Mage::register('ooops_we_need_a_redirect', $url)

  2. 在上sales_quote_save_after观察者如果需要做重定向:

    如果(法师::注册表( 'ooops_we_need_a_redirect')){// 做重定向 }

+0

我看不出如何解决会话消息(即'法师:: getSingleton('chekout /会话') - > addError ('错误消息在这里');')迷失在重定向/页面刷新? –

+0

我没有看到“在观察者中重新计算购物车总数”与“会话消息(即'Mage :: getSingleton('chekout/session') - > addError('错误消息在这里');')在一个重定向/页面刷新?“...... – Zyava

+0

你说的没错,我的问题的标题不像描述的那样。更糟糕的是,我编辑了这个问题,无意中删除了额外的说明(为了简洁起见)。面临的挑战是能够重新计算购物车总数**和**向用户显示会话消息。我已经能够实现删除项目和完成重新计算(在调用collectTotals()')**之后,通过观察者中的重定向**或者**删除项目并显示消息(不重定向),但是被卡住总数不正确。 –

相关问题