Получить продукт из сохранения событий наблюдателя - Magento 2


10

После события сохранения продукта я пытаюсь получить доступ к продукту в magento 2.

Я настроил слушателя на:

controller_action_catalog_product_save_entity_after

XML выглядит следующим образом:

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

Класс наблюдателей затем вызывается при сохранении продукта, но я не могу найти никакой информации о том, как получить доступ к сохраненному продукту. Класс наблюдателя выглядит следующим образом:

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

    }

}

В /module-catalog/Controller/Adminhtml/Product/Save.php событие запускается в строке 114:

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

Это передает контроллер в качестве аргумента. Однако я не уверен, как использовать это для доступа к продукту.

Я хотел бы получить продукты sku

Ответы:


25

Если вы хотите $productobjпосле сохранения продукта из бэкэнда, вы можете легко использовать catalog_product_save_afterсобытие.

Я предполагаю, что вы уже знаете, как создать модуль в M2.

Поместите это events.xmlв путь ниже

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>

И вставь Productsaveafter.phpв путь ниже

App \ код \ 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

    }   
}

Отлично, вот и все. Могу я спросить, как я узнаю об этом событии? Я не вижу его в исходном коде, поэтому не знал, что он существует.
GuyC


У меня был этот список в качестве ссылки, но я тоже не смог его там увидеть, поэтому в итоге я использовал: controller_action_catalog_product_save_entity_after, он опущен по какой-либо причине?
GuyC

1
Обратите внимание, что если вы поместите свой файл event.xml в область adminhtml, то ваш обозреватель не будет выполняться в других областях, таких как REST или SOAP, представляющих веб-интерфейсы
KAndy

2
@GuyC Наконец-то нашел, откуда это взялось. Существует определенное событие, которое использует специфичный для сущности «префикс». В Magento большинство базовых моделей переопределяет внутреннюю переменную «_eventPrefix», поэтому можно наблюдать операции CRUD для конкретных моделей. Чтобы определить префикс, используемый для модели, необходимо проверить исходный код модели. Проверьте это: magento.stackexchange.com/questions/184772/…
Мехди

0

Это довольно старое, и я не уверен, что сейчас кому-то все равно, но я искал это так:

Я не уверен с тех пор, когда, но определенно на M2.2.x это событие теперь выглядит так:

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

а это значит, что теперь он дает вам и продукт.

Для вашего случая вы должны были сделать это и получить атрибуты продукта в виде массива:

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

$ product = $ наблюдатель-> getData ('продукт'); должен
принести
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.