sales_quote_save_before наблюдатель выполняет дважды - PullRequest
3 голосов
/ 23 мая 2011

У меня есть наблюдатель, который наблюдает за событием sales_quote_save_before, и он выполняется дважды, когда элементы добавляются в корзину, удаляются из корзины или обновляются в корзине.

Я предполагаю, что save_before (и, в этом отношении, событие save_after) где-то запускаются более одного раза.

Я хотел бы знать, почему / где это происходит, и как ограничить наблюдателя выполнением только один раз.

Я попробовал решение, предлагаемое здесь: Magento - customer_save_after всегда запускался дважды , но мой наблюдатель все еще выполняет дважды (когда я регистрирую выполнение с Mage::log(), метка времени отличается на 1 секунду).

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2015

Я знаю, что этот ответ слишком поздно, но я надеюсь, что он будет полезен, так как у меня тоже есть та же проблема, и я смог найти хорошее решение.sales_quote_save_before наблюдатель, используйте следующие коды:

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

return $this;

Это решение также отключит (уберет) кнопку оформления заказа на странице корзины.

0 голосов
/ 24 мая 2011

В итоге я решил сравнить проблему 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
...