从保存事件观察器获取产品-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

Answers:


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

    }   
}

完美,就是这样。我可以问一下如何找到该事件吗?我看不到它在源代码中列出,所以不知道它的存在。
GuyC 2015年


我确实有该列表作为参考,但是也看不到它,因此我最终使用了:controller_action_catalog_product_save_entity_after,出于任何原因将其省略了吗?
GuyC 2015年

1
请注意,如果将event.xml文件放在adminhtml区域中,那么您的观察者将不会在其他代表Web API的区域(如REST或SOAP)中执行
KAndy 2015年

2
@GuyC终于找到了它的来源。有一个特定事件使用实体特定的“前缀”。在Magento中,大多数核心模型都重新定义了内部变量“ _eventPrefix”,因此可以观察特定模型的CRUD操作。要确定用于模型的前缀,您需要检查模型源代码。检查此:magento.stackexchange.com/questions/184772/…–
Mehdi

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('product'); 应该
会给
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.