Отримайте продукт від спостерігача за подіями Save 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шлях нижче

додаток \ код \ YOUR_NAMESPACE \ YOURMODULE \ спостерігач \

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

    }   
}

Ідеально, це все. Чи можу я запитати, як я дізнався про цю подію? Я не можу його бачити у вихідному коді, тому не знав, що він існує.
ГайК

Ви можете знайти посилання на події за цим посиланням cyrillschumacher.com/magento2-list-of-all-dispatched-events та magento.stackexchange.com/questions/87738/magento-2-events-list @GuyC
Keyur Shah

У мене був цей список в якості посилання, але я його також не міг бачити, отже, в кінцевому підсумку я використовував: Controller washing_catalog_product_save_entity_after, чи пропущено його з будь-якої причини?
ГайК

1
Зауважте, що якщо ви помістите файл event.xml у область adminhtml, ваш спостерігач не буде виконаний у інших областях, таких як REST або SOAP, які представляють веб-api
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 = $ observer-> getData ('продукт'); повинен отримати вам Товар
shobekhan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.