이벤트 저장 관찰자로부터 제품 가져 오기-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]
);

컨트롤러를 인수로 전달합니다. 그러나 이것을 사용하여 제품에 액세스하는 방법을 잘 모르겠습니다.

나는 제품을 구하고 싶다

답변:


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 \ 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 파일을 관리 HTML 영역에 넣으면 웹 API를 나타내는 REST 또는 SOAP와 같은 다른 영역에서는 관찰자가 실행되지 않습니다.
KAndy

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'); 제품을 구입해야합니다
shobekhan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.