Solución:
Esta es una pregunta antigua, pero dado que acabo de enfrentar el mismo problema, pensé que daría mi opinión sobre la respuesta. sales_order_place_after
se activa antes de que el pedido se guarde en la base de datos, por lo que en el momento en que se ejecuta su código, el ID de entidad del pedido no existe. Hay algunas opciones para solucionar este problema:
Podrías usar sales_order_save_after
que se activa después de que la orden se conserva en db. Esto le permitirá tener acceso a la identificación del pedido. Sin embargo, este enfoque tiene riesgos, ya que puede activarse nuevamente después de que se crea la orden. Si solo desea ejecutar su código una sola vez cuando se realiza el pedido por primera vez, el uso de este observador puede tener efectos secundarios inesperados.
Alternativamente, en lugar de usar un observador, puede crear un complemento alrededor MagentoSalesApiOrderManagementInterface::place
. Esto le permitirá hacer lo que sospecho que está tratando de hacer con sales_order_place_after
.
Como ejemplo aproximado, sus módulos etc/di.xml
se vería algo como esto:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="MagentoSalesApiOrderManagementInterface">
<plugin name="my-module-order-service" type="MyModulePluginOrderServicePlugin" sortOrder="5"/>
</type>
</config>
Y su clase de complemento así:
<?php
namespace MyModulePlugin;
class OrderServicePlugin
{
public function aroundPlace(MagentoSalesModelServiceOrderService $subject, Closure $proceed, MagentoSalesApiDataOrderInterface $order)
{
$return = $proceed($order);
$orderId = $order->getEntityId();
// your custom code
return $return;
}
}
Es mejor evitar los complementos a menos que sea necesario. Usar después del complemento o Magento Sales Api OrderManagementInterface :: place
etc / di.xml
<?xml version="1.0" ?>
<config>
<type name="MagentoSalesApiOrderManagementInterface">
<plugin name="MyOrderPlaceAfterPlugin" type="MyModulePluginOrderPlaceAfterPlugin" sortOrder="99" />
</type>
</config>
Mi Módulo Complemento Pedido PlaceAfterPlugin.php
//namespace MyModulePluginOrder;
class PlaceAfterPlugin {
/**
* @param MagentoSalesApiOrderManagementInterface $orderManagementInterface
* @param MagentoSalesModelOrderInterceptor $order
* @return $order
*/
public function afterPlace(MagentoSalesApiOrderManagementInterface $orderManagementInterface , $order)
{
$orderId = $order->getId();
// do something with order object (Interceptor )
return $order;
}
}
En el observador de Magento 2 usé este código, obtienes los datos del pedido como este,
use MagentoFrameworkEventObserverInterface;
class YOUROBSERVERCLASS implements ObserverInterface
{
protected $orderFactory;
public function __construct(MagentoQuoteModelQuoteFactory $quoteFactory,
MagentoSalesModelOrder $orderFactory)
{
$this->orderFactory = $orderFactory;
}
public function execute(MagentoFrameworkEventObserver $observer)
{
$orderIds = $observer->getEvent()->getOrderIds();
$lastorderId = $orderIds[0];
$order = $this->orderFactory->load($lastorderId);
}
}