Почему корзина для оформления заказа сохраняется сразу после того, как предложение о продаже будет сохранено сразу после продажи?


Реализация метода 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));
Author: Jonathan Day, 2013-05-28

2 answers

Если бы это была стандартная модель ORM, эти события, скорее всего, существовали бы. Поскольку модель Mage_Checkout_Model_Cart расширяет Varien_Object вместо Mage_Core_Model_Abstract, эти события отправляются вручную, включая передачу объекта cart в область событий . Это позволяет использовать аналогичную логику обработки на основе событий , связанную с объектом cart до и после процесса сохранения котировки.

 3
Author: benmarks, 2015-02-04 11:21:01

Вы можете сохранить цитату из любого места в своем коде, и это часто делается в ядре, $cart сохраняется через контроллер корзины (в основном), и я предполагаю, что это своего рода оболочка вокруг объекта quote (так как цитата - это корзина в Magento), пытающегося отделить общее сохранение цитаты и события, которые происходят непосредственно связаны с действиями через CartController

Что привело меня к такому выводу, так это следующий grep

grep 'cart\->' app/ -rsn
 3
Author: Anton S, 2013-05-28 08:17:43