Dapatkan produk dari save event observer - Magento 2


10

Mengikuti acara penyimpanan produk, saya mencoba mengakses produk dalam magento 2.

Saya telah mengkonfigurasi pendengar pada:

controller_action_catalog_product_save_entity_after

xml terlihat sebagai berikut:

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

Kelas pengamat kemudian dipanggil ketika suatu produk disimpan tetapi saya tidak dapat menemukan info tentang cara mengakses produk yang disimpan. Kelas pengamat adalah sebagai berikut:

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

    }

}

Di dalam /mule-catalog/Controller/Adminhtml/Product/Save.php acara ini diaktifkan pada baris 114:

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

Ini Melewati controller sebagai argumen. Namun saya tidak yakin bagaimana cara menggunakan ini untuk mengakses produk.

Saya ingin mendapatkan produk sku

Jawaban:


25

Jika Anda ingin $productobjsetelah menyimpan produk dari backend maka Anda dapat dengan mudah menggunakan catalog_product_save_afteracara.

Saya berasumsi bahwa Anda sudah tahu cara membuat modul M2.

Letakkan ini events.xmldi bawah jalan

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>

Dan letakkan Productsaveafter.phpdi jalur Anda di bawah ini

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

    }   
}

Sempurna, sudah cukup. Bisakah saya bertanya bagaimana saya mengetahui tentang acara itu? Saya tidak bisa melihatnya tercantum dalam kode sumber jadi tidak tahu itu ada.
— GuyC


Saya memang memiliki daftar itu sebagai referensi tetapi tidak dapat melihatnya di sana, maka saya akhirnya menggunakan: controller_action_catalog_product_save_entity_after, apakah dihilangkan karena alasan apa pun?
— GuyC

1
Harap perhatikan bahwa jika Anda meletakkan file event.xml di area adminhtml maka pengamat Anda tidak akan dieksekusi di area lain seperti REST atau SOAP yang mewakili api web
— KAndy

2
@GuyC Akhirnya menemukan dari mana asalnya. Ada acara khusus yang menggunakan "awalan" khusus entitas. Di Magento, sebagian besar model inti mendefinisikan kembali variabel internal "_eventPrefix", sehingga orang dapat mengamati operasi CRUD untuk model tertentu. Untuk menentukan awalan yang digunakan untuk suatu model, Anda perlu memeriksa kode sumber model. Lihat ini: magento.stackexchange.com/questions/184772/…
— Mehdi

0

Ini sudah cukup tua dan saya tidak yakin apakah ada yang peduli sekarang tapi saya mencari ini:

Saya tidak yakin sejak kapan tetapi pasti pada M2.2.x acara itu seperti ini sekarang:

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

yang berarti itu memberi Anda produk sekarang juga.

Untuk kasus Anda, Anda harus melakukan ini dan Anda bisa mendapatkan atribut produk sebagai array:

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

$ product = $ observer-> getData ('product'); seharusnya mendapatkan Anda Produk
— shobekhan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.