保存イベントオブザーバーから製品を取得する-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の商品を入手したい

回答:


24

$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

このリンクからイベントの参照を見つけることができますcyrillschumacher.com/magento2-list-of-all-dispatched-eventsおよびmagento.stackexchange.com/questions/87738/magento-2-events-list @GuyC
Keyur Shah

私はそのリストを参照として持っていましたが、そこにも表示されなかったため、次のように使用しました:controller_action_catalog_product_save_entity_after、それは何らかの理由で省略されていますか?
GuyC、2015

1
event.xmlファイルをadminhtml領域に配置すると、Web APIを表す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 = $ observer-> getData( 'product'); 製品が表示されるはずです
shobekhan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.