Saltar al contenido

Magento 2 – sales_order_place_after no devuelve el ID de pedido

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);
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *