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

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

    }   
}

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'];

$ producto = $ observador-> getData ('producto'); debería obtener el producto
— shobekhan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.