Obtener producto de guardar evento observador - Magento 2

10

Después de un evento de guardado de producto, intento acceder al producto en magento 2.

He configurado el oyente en:

controller_action_catalog_product_save_entity_after

el xml tiene el siguiente aspecto:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="controller_action_catalog_product_save_entity_after">
        <observer name="wire_products_update" instance="TBS\WireProductsHook\Observer\WireProductsUpdate" />
    </event>
</config>

Luego se llama a la clase de observadores cuando se guarda un producto, pero no puedo encontrar ninguna información sobre cómo acceder al producto que se guardó. La clase de observador es la siguiente:

<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace TBS\WireProductsHook\Observer;

use Magento\Framework\Event\ObserverInterface;

class WireProductsUpdate implements ObserverInterface {

    public function execute( \Magento\Framework\Event\Observer $observer ) {

        // echos name of event: controller_action_catalog_product_save_entity_after
        echo 'name of event: ' . $observer->getEvent()->getName();

        // tried using the same method as the save class: <magento>/module-catalog/Controller/Adminhtml/Product/Save.php on line 76
        $controller = $observer->getData('controller');

        // Fails: Fatal error: Cannot access protected property ...
        $product = $controller->initializationHelper->initialize($controller->productBuilder->build($controller->getRequest()));

    }

}

Dentro de /module-catalog/Controller/Adminhtml/Product/Save.php, el evento se activa en la línea 114:

$this->_eventManager->dispatch(
    'controller_action_catalog_product_save_entity_after',
    ['controller' => $this]
);

Esto pasa al controlador como argumento. Sin embargo, no estoy seguro de cómo usar esto para acceder al producto.

Me gustaría obtener los productos sku

GuyC
fuente

Respuestas:

25

Si lo desea $productobjdespués de guardar el producto desde el back-end, puede usar fácilmente el catalog_product_save_afterevento.

Supongo que ya sabes cómo crear un módulo M2.

Pon esto events.xmlen el siguiente camino

app\code\YOUR_NAMESPACE\YOURMODULE\etc\adminhtml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_product_save_after">
        <observer name="test_name" instance="YOUR_NAMESPACE\YOUR_MODULENAME\Observer\Productsaveafter" />
    </event>
</config>

Y pon tu Productsaveafter.phpcamino debajo

app \ code \ YOUR_NAMESPACE \ YOURMODULE \ Observer \

<?php

namespace YOURNAMESPACE\YOURMODULENAME\Observer;

use Magento\Framework\Event\ObserverInterface;

class Productsaveafter implements ObserverInterface
{    
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $_product = $observer->getProduct();  // you will get product object
        $_sku=$_product->getSku(); // for sku

    }   
}
Keyur Shah
fuente
Perfecto, eso es todo. ¿Puedo preguntar cómo me enteraría de ese evento? No puedo verlo en el código fuente, así que no sabía que existía.
GuyC
Tenía esa lista como referencia, pero tampoco pude verla allí, por lo tanto, terminé usando: controller_action_catalog_product_save_entity_after, ¿se omitió por alguna razón?
GuyC
1
Tenga en cuenta que si coloca su archivo event.xml en el área adminhtml, entonces su observador no se ejecutará en otras áreas como REST o SOAP que representan la API web
KAndy
2
@GuyC Finalmente encontré de dónde viene. Hay un evento específico que utiliza un "prefijo" específico de la entidad. En Magento, la mayoría de los modelos principales redefinen la variable interna "_eventPrefix", por lo que se pueden observar operaciones CRUD para modelos específicos. Para determinar el prefijo utilizado para un modelo, debe verificar el código fuente del modelo. Mira esto: magento.stackexchange.com/questions/184772/…
Mehdi
0

Esto es bastante antiguo y no estoy seguro de si a alguien le importa ahora, pero estaba buscando esto, así que:

No estoy seguro desde cuándo, pero definitivamente en M2.2.x ese evento es así ahora:

$this->_eventManager->dispatch(
                    'controller_action_catalog_product_save_entity_after',
                    ['controller' => $this, 'product' => $product]
                );

lo que significa que ahora también te está dando el producto.

Para su caso, debería haber hecho esto y podría obtener los atributos del producto como una matriz:

$post = $observer->getController();
        $data = $post->getRequest()->getPost();
        $productAsArray = $data['product'];
vbak
fuente
$ producto = $ observador-> getData ('producto'); debería obtener el producto
shobekhan