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.