Holen Sie sich das Produkt von Save Event Observer - Magento 2


10

Nach einem Produktspeicherereignis versuche ich, in Magento 2 auf das Produkt zuzugreifen.

Ich habe den Listener konfiguriert für:

controller_action_catalog_product_save_entity_after

Die XML sieht wie folgt aus:

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

Die Beobachterklasse wird dann aufgerufen, wenn ein Produkt gespeichert wird, aber ich kann keine Informationen darüber finden, wie auf das gespeicherte Produkt zugegriffen werden kann. Die Beobachterklasse ist wie folgt:

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

    }

}

In /module-catalog/Controller/Adminhtml/Product/Save.php wird das Ereignis in Zeile 114 ausgelöst:

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

Dies übergibt den Controller als Argument. Ich bin mir jedoch nicht sicher, wie ich damit auf das Produkt zugreifen soll.

Ich möchte die Produkte sku bekommen

Antworten:


24

Wenn Sie $productobjnach dem Speichern des Produkts aus dem Backend möchten, können Sie catalog_product_save_afterevent einfach verwenden .

Ich gehe davon aus, dass Sie bereits wissen, wie man ein Modul in erstellt M2.

Geben Sie dies events.xmlunter den Pfad ein

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>

Und setzen Sie Ihre Productsaveafter.phpunter Pfad

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

    }   
}

Perfekt, das hat es verstanden. Kann ich fragen, wie ich von diesem Ereignis erfahren würde? Ich kann es nicht im Quellcode sehen, wusste also nicht, dass es existiert.
GuyC


Ich hatte diese Liste als Referenz, konnte sie dort aber auch nicht sehen, daher habe ich Folgendes verwendet: controller_action_catalog_product_save_entity_after, wird sie aus irgendeinem Grund weggelassen?
GuyC

1
Bitte beachten Sie, dass wenn Sie Ihre event.xml-Datei in den Bereich adminhtml legen, Ihr Beobachter nicht in anderen Bereichen wie REST oder SOAP ausgeführt wird, die die Web-API darstellen
KAndy

2
@GuyC Endlich gefunden, woher es kommt. Es gibt ein bestimmtes Ereignis, das ein entitätsspezifisches „Präfix“ verwendet. In Magento definieren die meisten Kernmodelle die interne Variable „_eventPrefix“ neu, sodass CRUD-Operationen für bestimmte Modelle beobachtet werden können. Um das für ein Modell verwendete Präfix zu bestimmen, müssen Sie den Modellquellcode überprüfen. Überprüfen Sie dies: magento.stackexchange.com/questions/184772/…
Mehdi

0

Das ist ziemlich alt und ich bin mir nicht sicher, ob es jetzt jemanden interessiert, aber ich habe danach gesucht:

Ich bin mir nicht sicher seit wann, aber definitiv auf M2.2.x ist dieses Ereignis jetzt so:

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

Das heißt, es gibt Ihnen jetzt auch das Produkt.

Für Ihren Fall hätten Sie dies tun sollen und Sie könnten die Produktattribute als Array erhalten:

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

$ product = $ Observer-> getData ('Produkt'); sollte Ihnen das Produkt
Shobekhan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.