magento 2イベントカタログinventory_stock_item_save_after


7

製品の在庫レベルが変化するたびに検出する必要があります。magento 1.xにはcataloginventory_stock_item_save_afterがあるため、magento 2.1でも同じように実装したい

<event name="cataloginventory_stock_item_save_after">
    <observer name="cataloginventorysave" instance="Vendor\Module\Observer\Cataloginventorysave" />
</event>

次に、アクセスしたいオブザーバー「Cataloginventorysave.php」を作成しました

$stockItem = $observer->getEvent()->getItem();

しかし、イベント名cataloginventory_stock_item_save_afterがmagento 2イベントリストに見つかりません。どうすればそれを達成できますか?

回答:


8

これはバグです。

基本的に、これらのイベントはメソッド内Magento\Framework\Model\AbstractModelで動的に送出されますafterSave()

public function afterSave()
{
    $this->cleanModelCache();
    $this->_eventManager->dispatch('model_save_after', ['object' => $this]);
    $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]);
    $this->_eventManager->dispatch($this->_eventPrefix . '_save_after', $this->_getEventData());
    $this->updateStoredData();
    return $this;
}

ご覧のとおり、このコード$this->_eventPrefixはイベントの名前を生成するために使用します。

しかしの問題Magento\CatalogInventory\Model\Stock\Itemは、この変数が適切に宣言されていないことです:

protected $eventPrefix = 'cataloginventory_stock_item';

問題を見ますか?アンダースコアが欠落しています。

protected $_eventPrefix = 'cataloginventory_stock_item';

ここでバグレポートを作成して、チームが認識できるようにすることをお勧めします。https//github.com/magento/magento2/issues

掘り下げた後、誰かが私たちの前でバグを見つけたようです:https : //github.com/magento/magento2/issues/4857

PRはすでにブランチにマージされていることに注意しくださいdevelop


ありがとうございました。動作しましたが、今では製品IDが必要なので、次のことを試しました。$ stockItem = $ observer-> getEvent()-> getItem();
SPK

1
$ id = $ stockItem-> getProductId(); エラーが発生しました:PHPの致命的なエラー:nullのメンバー関数getProductId()の呼び出し
SPK

@SPK $ _eventObject属性名の修正が必要です。この修正がないと、イベントは常に、予期される「在庫」と「アイテム」ではなく「オブジェクト」としてイベントデータを渡します。
Geethika Antony 2017

そのイベントは注文またはAPIによってディスパッチされますか?
Antonio Pedicini 2017

このイベントではどのようにMagentoの1の前の数量を取得する任意のアイデアがgetOrigData('qty')it.Butそれは2で動作していないために使用することができます
Geethikaアントニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.