รับผลิตภัณฑ์จากผู้สังเกตการณ์บันทึกเหตุการณ์ - 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

    }   
}

สมบูรณ์แบบที่ได้รับมัน ฉันจะถามว่าฉันจะหาข้อมูลเกี่ยวกับเหตุการณ์นั้นได้อย่างไร ฉันไม่เห็นมันอยู่ในซอร์สโค้ดดังนั้นจึงไม่รู้ว่ามีอยู่จริง
GuyC

คุณสามารถค้นหาการอ้างอิงของเหตุการณ์จากลิงค์นี้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

1
โปรดทราบว่าถ้าคุณวางไฟล์ event.xml ของคุณในพื้นที่ adminhtml ผู้สังเกตการณ์ของคุณจะไม่ถูกดำเนินการในพื้นที่อื่น ๆ เช่น REST หรือ SOAP ที่แสดงถึง web api
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 = $ ผู้สังเกตการณ์ -> getData ('ผลิตภัณฑ์'); ควรให้คุณได้รับสินค้า
shobekhan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.