Magento 2 - Добавление пользовательской логики после создания заказа
Я пытался отправить данные заказов на веб-сервис 3-й партии. Я создал наблюдателя для события sales_order_place_after
- идентификатор заказа там отсутствует. Я считаю, что это не ошибка - заказ не сохраняется в базе данных.
Следующая попытка.
Я пробовал sales_order_save_after
- он дает пустой массив товаров, без информации о способе оплаты. Попытался перезагрузить его снова с помощью ordermodel->load(id_of_order)
, но он снова выдает пустые данные.
Я почти уверен, что событие сохранения заказа возникает до того, как адрес, оплата и другие данные заказа будут сохранены в база данных или объект в событии в порядке, подготовленном для сохранения, поэтому вся дополнительная информация отфильтровывается.
Любая идея, как получить правильные данные о заказе в событии размещения заказа.
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>
"после" плагин для \Magento\Sales\Api\OrderManagementInterface::place
должен помочь в этом случае.
Попробуйте это 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;
}