【问题标题】:sales_quote_save_before observer executing twicesales_quote_save_before 观察者执行两次
【发布时间】:2023-03-11 18:25:01
【问题描述】:

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

我假设save_before(以及,就此而言,save_after 事件)在某处被多次触发。

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

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

非常感谢任何帮助。

【问题讨论】:

  • 我在 CE 1.7 中也有这个,它被触发了两次。您找到更好的解决方案了吗?

标签: php events magento observer-pattern


【解决方案1】:

我知道这个答案为时已晚,但我希望对我有用,因为我也遇到了同样的问题并且能够找到一个好的解决方案。

我正在使用 Magento 1.9 CE 对其进行测试,在 sales_quote_save_before 观察者中,使用以下代码:

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

return $this;

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

【讨论】:

    【解决方案2】:

    我最终解决这个问题的方法是将$observer 对象的updated_at 值与当前时间进行比较。如果最后一次更新是超过 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
    

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 2019-05-14
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2021-05-02
      相关资源
      最近更新 更多