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.