2013-08-26 46 views
1

我有观察者观看事件sales_quote_item_set_product。其中,我正在检查一些条件以确保该项目仍然可用。如果不是,我运行这段代码:仅在第2页刷新后才显示magento错误消息

Mage::helper('checkout/cart')->getCart()->removeItem($item->getId())->save(); 
Mage::getSingleton('message/session')->addError($item->getName() . ' is no longer available.'); 

我遇到的问题是,如果一个项目变得不可用,一个客人是一个产品视图页面上车说,产品在购物车中,但购物车的总价已更新,以反映正在移除的产品。此外,错误消息不显示。如果您转到其他页面或刷新产品查看页面,则会显示错误消息,并且购物车中的物品数量是正确的。

所以我的想法是我需要在执行周期的早些时候运行此代码,但我不知道我应该观察什么事件,或者如果我不应该使用观察者。我尝试使用sales_quote_load_after,但以某种方式导致了递归错误。任何人都可以告诉我何时/在哪里运行这段代码?

另一个疯狂的想法是,因为我使用数据库会话而不是文件系统?

回答

1

问题是在消息块呈现后错误被添加。我在添加错误之后通过向购物车页面添加重定向来修复它。

$request = Mage::app()->getRequest(); 
if($request->getModuleName() != 'checkout' && $request->getControllerName() != 'cart' && $request->getActionName() != 'index') { 
    Mage::app()->getResponse()->setRedirect(Mage::getModel('core/url')->getUrl('checkout/cart/index')) 
     ->sendResponse(); 
    exit; 
} 
0

你没有提到它,但这听起来像你在AJAX请求期间运行代码。当你说

Mage::getSingleton('message/session')->addError($item->getName() . ' is no longer available.'); 

你正在向Magento的会话对象添加一个错误。每次Magento页面呈现时,它都会检查会话对象是否有错误,并将它们全部显示出来。这允许多个开发人员将多个错误添加到会话中,将Magento重定向回原始表单。

这在ajax请求期间不起作用,因为(典型情况下)会忽略呈现过程而不是JSON对象或正在呈现的简单无错误的HTML块(在会话中留下错误)。

知道完整的请求周期是什么样的(什么是ajax,什么不是)会帮助某人针对您的问题提出更具体的答案。

+1

感谢您的帮助Alan,我从您的博客中获得了大量有用的信息,并热爱商业Bug!不幸的是,这个事件并没有在ajax请求中发起。正在生成购物车摘要时发生了这种情况。在消息被渲染后加载的。我的解决方案是重定向用户,以便他们可以修复错误。我对这个解决方案并不满意,但我找不到一个足够早的解雇事件,并且有销售报价数据。 –

+0

@JasonNeumann嗯,是的 - 如果你正在听的动作是在消息块渲染后发生的,那么你可以做的并不多。可能有些事情可能会让一些额外的JS添加到页面中,从而增加额外的错误,但这可能是您寻找的更多工作。此外,Re:发现事件,不要忘记,商业bug二有一个事件和观察员选项卡 - 用于跟踪这些事情http://commercebugdemo.pulsestorm.net/ –