Kaydetme olayı gözlemcisinden ürün al - Magento 2


10

Bir ürün kaydetme etkinliğinden sonra magento 2 içindeki ürüne erişmeye çalışıyorum.

Dinleyiciyi şu şekilde yapılandırdım:

controller_action_catalog_product_save_entity_after

xml aşağıdaki gibi görünür:

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

Gözlemci sınıfı daha sonra bir ürün kaydedildiğinde çağrılır, ancak kaydedilen ürüne nasıl erişileceği hakkında herhangi bir bilgi bulamıyorum. Gözlemci sınıfı aşağıdaki gibidir:

<?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 içinde etkinlik 114. satırda tetiklenir:

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

Bu, denetleyiciyi bağımsız değişken olarak geçirir. Ancak ürüne erişmek için bunu nasıl kullanacağımdan emin değilim.

Ürünleri almak istiyorum sku

Yanıtlar:


25

Eğer isterseniz $productobjarka uç ürünü kaydettikten sonra, daha sonra kolayca kullanabilirsiniz catalog_product_save_afterolayı.

Bir modülün nasıl oluşturulacağını zaten bildiğinizi varsayıyorum M2.

Bunu events.xmlaşağıdaki yola koy

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>

Ve senin Productsaveafter.phpyoluna koy

Uygulamanın \ kod \ YOUR_NAMESPACE \ YOURMODULE \ Gözlemci \

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

    }   
}

Mükemmel, hepsi bu. O olayı nasıl öğreneceğimi sorabilir miyim? Ben kaynak kodunda listelenen göremiyorum bu yüzden var olduğunu bilmiyordum.
GuyC


Bir referans olarak bu liste var mı ama orada da göremedim, bu yüzden kullanarak sona erdi: controller_action_catalog_product_save_entity_after, herhangi bir nedenle atlandı mı?
GuyC

1
Event.xml dosyanızı adminhtml alanına koyarsanız, gözlemcinizin web
api'yi

2
@GuyC Sonunda nereden geldiğini buldu. Bir varlığa özgü “önek” kullanan belirli bir olay vardır. Magento'da, çekirdek modellerin çoğu “_eventPrefix” iç değişkenini yeniden tanımlar, böylece belirli modeller için CRUD işlemleri gözlemlenebilir. Bir model için kullanılan öneki belirlemek için, model kaynak kodunu kontrol etmeniz gerekir. Şunu
Mehdi

0

Bu oldukça eskidir ve kimse şimdi umursamıyorum emin değilim ama bunu arıyordum:

Ne zamandan beri emin değilim ama kesinlikle M2.2.x üzerinde bu olay şimdi böyle:

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

yani şimdi size ürünü veriyor demektir.

Durumunuz için bunu yapmış olmalısınız ve ürün özelliklerini bir dizi olarak alabilirsiniz:

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

$ product = $ observer-> getData ('ürün'); size Ürün
almalı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.