Почему CACKOUT_CART_SAVE_AFTER брошен сразу после Sales_QUOTE_SAVE_AFTER?
-
16-10-2019 - |
Вопрос
Реализация Mage_Checkout_Model_Cart::save()
Метод, по -видимому, приводит к дублированию событий. Почему нестандартный checkout_cart_save_after
событие, брошено сразу после общего sales_quote_save_after
Событие было бы брошено успешным спасением.
Есть ли причины слушать одно из событий, а не другое? Я вижу, что sales_quote_save_after
Событие будет брошено администратором или заказами API, но они могут быть исключены из наблюдателей с помощью указания события внутри <frontend>
XML Node в модуле config.xml в любом случае.
Чтобы дать более конкретную причину для вопроса, мы унаследовали код, который слушает checkout_cart_save_after
Событие, и я обеспокоен тем, что это может пропустить сценарии, когда цитата изменяется, но это событие не брошено.
Справочный код от/app/code/core/mage/checkout/model/cart.php:473:
Mage::dispatchEvent('checkout_cart_save_before', array('cart'=>$this));
$this->getQuote()->getBillingAddress();
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->getQuote()->collectTotals();
$this->getQuote()->save();
$this->getCheckoutSession()->setQuoteId($this->getQuote()->getId());
/**
* Cart save usually called after changes with cart items.
*/
Mage::dispatchEvent('checkout_cart_save_after', array('cart'=>$this));
Решение
Если бы это была стандартная модель ORM, эти события, вероятно, существовали бы. Поскольку Mage_Checkout_Model_Cart
модель расширяется Varien_Object
вместо Mage_Core_Model_Abstract
, эти события отправляются вручную, включая передачу объекта CART в область события. Анкет Это обеспечивает аналогичную инъекцию логики обработки на основе событий Связано с объектом CART до и после процесса сохранения цитаты.
Другие советы
Вы можете сохранить цитату откуда в вашем коде, и это сделано много в ядре, $ Cart сохраняется через контроллер Cart Controller (в основном), и я думаю, что это своего рода обертка вокруг цитаты (как цитата в Magento), пытаясь разделить Общая цитата Сохранить и события, которые происходят непосредственно связаны с действиями через карконтроллер
Что привело меня к такому выводу, было следующим грип
grep 'cart\->' app/ -rsn