Récupérer le produit de Save Event Observer - Magento 2

10

Après un événement de sauvegarde de produit, j'essaie d'accéder au produit dans magento 2.

J'ai configuré l'écouteur sur:

controller_action_catalog_product_save_entity_after

le xml ressemble à ceci:

<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 des observateurs est ensuite appelée lorsqu'un produit est enregistré, mais je ne trouve aucune information sur la façon d'accéder au produit qui a été enregistré. La classe d'observateur est la suivante:

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

    }

}

Dans /module-catalog/Controller/Adminhtml/Product/Save.php, l'événement est déclenché sur la ligne 114:

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

Cela passe le contrôleur comme argument. Cependant, je ne sais pas comment l'utiliser pour accéder au produit.

J'aimerais obtenir les produits sku

GuyC
la source

Réponses:

25

Si vous le souhaitez après $productobjavoir enregistré le produit du backend, vous pouvez facilement utiliser catalog_product_save_afterevent.

Je suppose que vous savez déjà comment créer un module dans M2.

Mettez ceci events.xmldans le chemin ci-dessous

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>

Et mettez votre Productsaveafter.phpchemin en dessous

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
la source
Parfait, ça y est. Puis-je demander comment je me renseignerais sur cet événement? Je ne peux pas le voir répertorié dans le code source, donc je ne savais pas qu'il existait.
GuyC
Vous pouvez trouver la référence des événements à partir de ces liens cyrillschumacher.com/magento2-list-of-all-dispatched-events et magento.stackexchange.com/questions/87738/magento-2-events-list @GuyC
Keyur Shah
J'avais cette liste comme référence mais je ne pouvais pas la voir non plus, c'est pourquoi j'ai fini par utiliser: controller_action_catalog_product_save_entity_after, est-elle omise pour une raison quelconque?
GuyC
1
Veuillez noter que si vous placez votre fichier event.xml dans la zone adminhtml, votre observateur ne sera pas exécuté dans d'autres zones comme REST ou SOAP qui représentent l'API Web
KAndy
2
@GuyC Enfin trouvé d'où il vient. Il existe un événement spécifique qui utilise un «préfixe» spécifique à l'entité. Dans Magento, la plupart des modèles de base redéfinissent la variable interne «_eventPrefix», de sorte que l'on peut observer les opérations CRUD pour des modèles spécifiques. Pour déterminer le préfixe utilisé pour un modèle, vous devez vérifier le code source du modèle. Vérifiez ceci: magento.stackexchange.com/questions/184772/…
Mehdi
0

C'est assez vieux et je ne sais pas si quelqu'un s'en soucie maintenant mais je le cherchais donc:

Je ne suis pas sûr depuis quand mais définitivement sur M2.2.x cet événement est comme ça maintenant:

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

ce qui signifie qu'il vous donne maintenant le produit aussi.

Pour votre cas, vous auriez dû le faire et vous pourriez obtenir les attributs du produit sous forme de tableau:

$post = $observer->getController();
        $data = $post->getRequest()->getPost();
        $productAsArray = $data['product'];
vbak
la source
$ product = $ observer-> getData ('produit'); devrait vous procurer le produit
shobekhan