Obtenha produtos do save event observer - Magento 2

10

Após um evento de salvamento do produto, estou tentando acessar o produto no magento 2.

Eu configurei o ouvinte em:

controller_action_catalog_product_save_entity_after

o xml tem a seguinte aparência:

<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>

A classe de observadores é chamada quando um produto é salvo, mas não consigo encontrar nenhuma informação sobre como acessar o produto que foi salvo. A classe observador é a seguinte:

<?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()));

    }

}

Em /module-catalog/Controller/Adminhtml/Product/Save.php, o evento é disparado na linha 114:

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

Isso passa o controlador como argumento. No entanto, não tenho certeza de como usá-lo para acessar o produto.

Eu gostaria de obter os produtos sku

GuyC
fonte

Respostas:

24

Se você desejar $productobjapós salvar o produto no back-end, poderá usar o catalog_product_save_afterevento facilmente .

Estou assumindo que você já sabe como criar um módulo M2.

Coloque isso events.xmlno caminho abaixo

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>

E coloque seu Productsaveafter.phpcaminho abaixo

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
fonte
Perfeito, entendeu. Posso perguntar como eu descobriria sobre esse evento? Não consigo vê-lo listado no código-fonte, então não sabia que ele existia.
GuyC
Eu tinha essa lista como referência, mas também não conseguia vê-la, por isso acabei usando: controller_action_catalog_product_save_entity_after, ela é omitida por algum motivo?
GuyC
1
Observe que, se você colocar o arquivo event.xml na área adminhtml, seu observador não será executado em outras áreas, como REST ou SOAP, que representam API da Web.
KAndy
2
@GuyC Finalmente encontrado de onde vem. Há um evento específico que usa um "prefixo" específico da entidade. No Magento, a maioria dos modelos principais redefine a variável interna “_eventPrefix”, para que se possa observar operações CRUD para modelos específicos. Para determinar o prefixo usado para um modelo, é necessário verificar o código-fonte do modelo. Verifique isto: magento.stackexchange.com/questions/184772/…
Mehdi
0

Isso é bastante antigo e não tenho certeza se alguém se importa agora, mas eu estava procurando por isso:

Não tenho certeza desde quando, mas definitivamente no M2.2.x, esse evento é assim agora:

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

o que significa que agora você também está fornecendo o produto.

Para o seu caso, você deveria ter feito isso e poderá obter os atributos do produto como uma matriz:

$post = $observer->getController();
        $data = $post->getRequest()->getPost();
        $productAsArray = $data['product'];
vbak
fonte
$ product = $ observer-> getData ('produto'); deve obter-lhe o produto
shobekhan