我有一个观察员,如果他们缺货就会从购物车中移除商品(即顾客退回购物车的时间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');
}
答案 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)
接下来的流程如何:
在sales_quote_save_before
上的观察者中删除项目并向注册表添加一些标记:Mage::register('ooops_we_need_a_redirect', $url)
在sales_quote_save_after
的观察者中,根据需要重定向:
if(Mage :: registry('ooops_we_need_a_redirect')){ //做重定向 }