Magento 2 - Добавление пользовательской логики после создания заказа


Я пытался отправить данные заказов на веб-сервис 3-й партии. Я создал наблюдателя для события sales_order_place_after - идентификатор заказа там отсутствует. Я считаю, что это не ошибка - заказ не сохраняется в базе данных.

Следующая попытка.

Я пробовал sales_order_save_after - он дает пустой массив товаров, без информации о способе оплаты. Попытался перезагрузить его снова с помощью ordermodel->load(id_of_order), но он снова выдает пустые данные. Я почти уверен, что событие сохранения заказа возникает до того, как адрес, оплата и другие данные заказа будут сохранены в база данных или объект в событии в порядке, подготовленном для сохранения, поэтому вся дополнительная информация отфильтровывается.

Любая идея, как получить правильные данные о заказе в событии размещения заказа.

Author: 7ochem, 2015-12-18

3 answers

Вот список событий http://cyrillschumacher.com/magento2-list-of-all-dispatched-events/

Я делаю то же самое и в итоге использовал 'checkout_onepage_controller_success_action'

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="checkout_onepage_controller_success_action">
    <observer name="mymodule_controller_success_action" instance="My\Module\Observer\MyObserver"  />
</event>

 4
Author: user20719, 2015-12-22 01:09:27

"после" плагин для \Magento\Sales\Api\OrderManagementInterface::place должен помочь в этом случае.

 1
Author: Alex Paliarush, 2015-12-18 10:49:05

Попробуйте это sales_model_service_quote_submit_success из Magento\Quote\Model::submitQuote это сразу после размещения заказа и перед отправкой по электронной почте. Вы также получите идентификатор заказа:

try {
            $order = $this->orderManagement->place($order);
            $quote->setIsActive(false);
            $this->eventManager->dispatch(
                'sales_model_service_quote_submit_success',
                [
                    'order' => $order,
                    'quote' => $quote
                ]
            );
            $this->quoteRepository->save($quote);
        } catch (\Exception $e) {
            $this->eventManager->dispatch(
                'sales_model_service_quote_submit_failure',
                [
                    'order'     => $order,
                    'quote'     => $quote,
                    'exception' => $e
                ]
            );
            throw $e;
        }
 1
Author: Marceli Po, 2017-01-26 14:40:49