Почему корзина для оформления заказа сохраняется сразу после того, как предложение о продаже будет сохранено сразу после продажи?
Реализация метода Mage_Checkout_Model_Cart::save()
, по-видимому, приводит к дублированию событий. Почему нестандартное событие checkout_cart_save_after
возникает сразу после общего события sales_quote_save_after
, которое было бы вызвано успешным сохранением.
Есть ли причины слушать одно из событий вместо другого? Я вижу, что событие sales_quote_save_after
будет вызвано администратором или заказами API, но их можно исключить из наблюдателей, указав имя события внутри XML-узла <frontend>
в модуле config.xml в любом случае.
Чтобы дать более конкретную причину для вопроса, мы унаследовали код, который прослушивает событие checkout_cart_save_after
, и я обеспокоен тем, что в нем могут отсутствовать сценарии, когда цитата изменяется, но это событие не выбрасывается.
Ссылочный код из /приложения/кода/ядра/Mage/Оформления заказа/Модели/корзины.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));
2 answers
Если бы это была стандартная модель ORM, эти события, скорее всего, существовали бы. Поскольку модель Mage_Checkout_Model_Cart
расширяет Varien_Object
вместо Mage_Core_Model_Abstract
, эти события отправляются вручную, включая передачу объекта cart в область событий . Это позволяет использовать аналогичную логику обработки на основе событий , связанную с объектом cart до и после процесса сохранения котировки.
Вы можете сохранить цитату из любого места в своем коде, и это часто делается в ядре, $cart сохраняется через контроллер корзины (в основном), и я предполагаю, что это своего рода оболочка вокруг объекта quote (так как цитата - это корзина в Magento), пытающегося отделить общее сохранение цитаты и события, которые происходят непосредственно связаны с действиями через CartController
Что привело меня к такому выводу, так это следующий grep
grep 'cart\->' app/ -rsn