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.