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

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

    }   
}

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

$ product = $ observer-> getData ('produit'); devrait vous procurer le produit
— shobekhan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.