Nhận sản phẩm từ lưu quan sát sự kiện - Magento 2


10

Sau một sự kiện lưu sản phẩm, tôi đang cố gắng truy cập sản phẩm trong magento 2.

Tôi đã cấu hình trình nghe trên:

controller_action_catalog_product_save_entity_after

xml trông như sau:

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

Sau đó, lớp quan sát viên được gọi khi sản phẩm được lưu nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách truy cập sản phẩm đã được lưu. Lớp người quan sát như sau:

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

    }

}

Trong / module-catalog/Controll/Adminhtml/ Productt / Norman.php , sự kiện được kích hoạt trên dòng 114:

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

Điều này Vượt qua bộ điều khiển như là một đối số. Tuy nhiên tôi không chắc làm thế nào để sử dụng điều này để truy cập sản phẩm.

Tôi muốn có được sản phẩm sku

Câu trả lời:


24

Nếu bạn muốn $productobjsau khi lưu sản phẩm từ phụ trợ thì bạn có thể dễ dàng sử dụng catalog_product_save_aftersự kiện.

Tôi giả sử rằng bạn đã biết cách tạo một mô-đun M2.

Đặt cái này events.xmlở bên dưới

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>

Và đặt Productsaveafter.phpcon đường của bạn dưới đây

ứng dụng \ 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

    }   
}

Hoàn hảo, đó là nó. Tôi có thể hỏi làm thế nào tôi sẽ tìm hiểu về sự kiện đó? Tôi không thể thấy nó được liệt kê trong mã nguồn nên không biết nó tồn tại.
GuyC

Bạn có thể tìm tài liệu tham khảo của các sự kiện từ này liên kết cyrillschumacher.com/magento2-list-of-all-dispatched-eventsmagento.stackexchange.com/questions/87738/magento-2-events-list @GuyC
KEYUR Shah

Tôi đã có danh sách đó như một tài liệu tham khảo nhưng cũng không thể thấy nó ở đó, do đó tôi đã kết thúc bằng cách sử dụng: control_action_catalog_product_save_entity_after, nó có bị bỏ qua vì bất kỳ lý do gì không?
GuyC

1
Xin lưu ý rằng nếu bạn đặt tệp event.xml của bạn trong khu vực adminhtml thì người quan sát của bạn sẽ không được thực thi trong các khu vực khác như REST hoặc SOAP đại diện cho api web
KAndy

2
@GuyC Cuối cùng cũng tìm thấy nó đến từ đâu. Có một sự kiện cụ thể sử dụng tiền tố đặc trưng cho thể loại trực tuyến. Trong Magento, hầu hết các mô hình cốt lõi xác định lại biến nội bộ Thay _eventPrefix, do đó người ta có thể quan sát các hoạt động CRUD cho các mô hình cụ thể. Để xác định tiền tố được sử dụng cho một mô hình, bạn cần kiểm tra mã nguồn của mô hình. Kiểm tra cái này: magento.stackexchange.com/questions/184772/ Kẻ
Mehdi

0

Cái này khá cũ và tôi không chắc bây giờ có ai quan tâm không nhưng tôi đang tìm cái này vậy:

Tôi không chắc chắn từ khi nào nhưng chắc chắn trên M2.2.x sự kiện đó là như thế này:

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

có nghĩa là nó cũng mang lại cho bạn sản phẩm.

Đối với trường hợp của bạn, bạn nên thực hiện điều này và bạn có thể lấy các thuộc tính sản phẩm dưới dạng một mảng:

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

$ sản phẩm = $ observer-> getData ('sản phẩm'); sẽ mang lại cho bạn Sản phẩm
shobekhan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.