Ottieni prodotto da Save Event Observer - Magento 2


10

A seguito di un evento di salvataggio del prodotto, sto tentando di accedere al prodotto in magento 2.

Ho configurato l'ascoltatore su:

controller_action_catalog_product_save_entity_after

l'xml ha il seguente aspetto:

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

La classe di osservatori viene quindi chiamata quando un prodotto viene salvato ma non riesco a trovare alcuna informazione su come accedere al prodotto che è stato salvato. La classe di osservatori è la seguente:

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

    }

}

All'interno di /module-catalog/Controller/Adminhtml/Product/Save.php l'evento viene generato sulla riga 114:

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

Questo passa il controller come argomento. Tuttavia, non sono sicuro su come utilizzarlo per accedere al prodotto.

Vorrei ottenere i prodotti sku

Risposte:


25

Se lo desideri $productobjdopo aver salvato il prodotto dal back-end, puoi utilizzare facilmente l' catalog_product_save_afterevento.

Presumo che tu sappia già come creare un modulo M2.

Metti questo events.xmlsotto percorso

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 metti il ​​tuo Productsaveafter.phpsotto percorso

App \ code \ YOUR_NAMESPACE \ nomemodulo \ 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

    }   
}

Perfetto, ecco. Posso chiedere come avrei scoperto quell'evento? Non riesco a vederlo elencato nel codice sorgente, quindi non sapevo che esistesse.
GuyC


Avevo quell'elenco come riferimento ma non riuscivo a vederlo nemmeno lì, quindi ho finito per usare: controller_action_catalog_product_save_entity_after, è stato omesso per qualche motivo?
GuyC

1
Nota che se metti il ​​tuo file event.xml nell'area adminhtml, il tuo osservatore non verrà eseguito in altre aree come REST o SOAP che rappresentano l'API Web
KAndy

2
@GuyC Finalmente trovato da dove viene. Esiste un evento specifico che utilizza un "prefisso" specifico dell'entità. In Magento, la maggior parte dei modelli principali ridefinisce la variabile interna "_eventPrefix", in modo da poter osservare le operazioni CRUD per modelli specifici. Per determinare il prefisso utilizzato per un modello, è necessario controllare il codice sorgente del modello. Controlla questo: magento.stackexchange.com/questions/184772/…
Mehdi

0

Questo è piuttosto vecchio e non sono sicuro che qualcuno si preoccupi adesso, ma stavo cercando questo quindi:

Non sono sicuro da quando, ma sicuramente su M2.2.x quell'evento è così adesso:

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

il che significa che ora ti sta dando anche il prodotto.

Per il tuo caso avresti dovuto farlo e potresti ottenere gli attributi del prodotto come un array:

$post = $observer->getController();
        $data = $post->getRequest()->getPost();
        $productAsArray = $data['product'];

$ product = $ observer-> getData ('product'); dovresti procurarti il ​​Prodotto
shobekhan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.