sales_quote_save_before观察者执行两次

时间:2011-05-23 19:46:27

标签: php events magento observer-pattern

我有一个观察者观察sales_quote_save_before事件,当项目被添加到购物车,从购物车中移除或在购物车中更新时,它会执行两次。

我认为save_before(以及save_after事件)在某处被触发不止一次。

我想知道为什么/发生这种情况,以及如何限制观察者只执行一次。

我尝试过这里提供的解决方案:Magento - customer_save_after always fired twice,但我的观察者仍然执行两次(当我使用Mage::log()记录执行时,时间戳是1秒不同)。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我最终要解决的问题是将updated_at对象的$observer值与当前时间进行比较。如果最后一次更新超过3秒(完全任意值),我让观察者执行,否则我返回。这对我有用,因为我的观察者的两个实例总是在1-2秒内发射。

我认识到这不是最好的解决方案,因为它没有考虑服务器负载或其他延迟问题,所以如果有人能想到更好的解决方案,我会很感激反馈。

    $updatedAt = date('U', strtotime($observer->getQuote()->getUpdatedAt()));
    $now = time();
    if(($updatedAt + 3) > $now){
        return $this; //the observer has already been executed in this request
    }
    .... execute observer code

答案 1 :(得分:0)

我知道这个答案是迟到的,但我希望它会有用,因为我也遇到了同样的问题,并且找到了一个很好的解决方案。

我正在使用Magento 1.9 CE测试它,在sales_quote_save_before observer中,使用以下代码:

$quote = $observer->getEvent()->getQuote();
$quote->addErrorInfo('error', 'your_module_name', 1, 'your error message')->setHasError(true);

return $this;

此解决方案还将禁用(删除)购物车页面中的结帐按钮。