Uzyskaj produkt od obserwatora zapisywania zdarzeń - Magento 2

10

Po zdarzeniu zapisywania produktu próbuję uzyskać dostęp do produktu w magento 2.

Skonfigurowałem odbiornik na:

controller_action_catalog_product_save_entity_after

xml wygląda następująco:

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

Klasa obserwatora jest następnie wywoływana, gdy produkt jest zapisywany, ale nie mogę znaleźć żadnych informacji na temat dostępu do zapisanego produktu. Klasa obserwatora wygląda następująco:

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

    }

}

W /module-catalog/Controller/Adminhtml/Product/Save.php zdarzenie jest uruchamiane w linii 114:

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

Podaje to kontrolerowi jako argument. Nie jestem jednak pewien, jak tego użyć, aby uzyskać dostęp do produktu.

Chciałbym dostać produkty SKU

GuyC
źródło

Odpowiedzi:

25

Jeśli chcesz $productobjpo zapisaniu produktu z backendu, możesz łatwo użyć catalog_product_save_afterzdarzenia.

Zakładam, że już wiesz, jak utworzyć moduł M2.

Umieść to events.xmlponiżej ścieżki

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>

I umieść swoją Productsaveafter.phpponiżej ścieżki

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
źródło
Doskonale, o to chodzi. Czy mogę zapytać, jak dowiem się o tym wydarzeniu? Nie widzę go na liście w kodzie źródłowym, więc nie wiedziałem, że istnieje.
GuyC
Można znaleźć odniesienia do wydarzeń z tych linków cyrillschumacher.com/magento2-list-of-all-dispched-events and magento.stackexchange.com/questions/87738/magento-2-events-list @GuyC
Keyur Shah
Miałem tę listę jako odniesienie, ale też jej nie widziałem, dlatego skończyło się na tym, że użyłem: kontroler aktywności_katalog_produktu_save_entity_after, czy z jakiegoś powodu został pominięty?
GuyC
1
Pamiętaj, że jeśli umieścisz plik event.xml w obszarze adminhtml, wówczas Twój obserwator nie będzie wykonywany w innych obszarach, takich jak REST lub SOAP, które reprezentują interfejs WWW
KAndy
2
@GuyC Wreszcie znalazłem, skąd pochodzi. Istnieje określone zdarzenie, które używa „prefiksu” specyficznego dla jednostki. W Magento większość podstawowych modeli redefiniuje wewnętrzną zmienną „_eventPrefix”, dzięki czemu można obserwować operacje CRUD dla określonych modeli. Aby określić prefiks używany dla modelu, musisz sprawdzić kod źródłowy modelu. Sprawdź to: magento.stackexchange.com/questions/184772/…
Mehdi
0

To jest dość stare i nie jestem pewien, czy ktoś się tym teraz przejmuje, ale szukałem tego, więc:

Nie jestem pewien od kiedy, ale zdecydowanie na M2.2.x to wydarzenie jest teraz takie:

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

co oznacza, że ​​daje ci teraz również produkt.

W twoim przypadku powinieneś to zrobić i możesz uzyskać atrybuty produktu jako tablicę:

$post = $observer->getController();
        $data = $post->getRequest()->getPost();
        $productAsArray = $data['product'];
vbak
źródło
$ product = $ observer-> getData ('product'); powinienem dostarczyć Ci Produkt
shobekhan,