catálogo de eventos magento 2inventory_stock_item_save_after

7

Preciso detectar sempre que o nível de estoque de um produto muda. Como existe cataloginventory_stock_item_save_after no magento 1.x, queremos implementar o mesmo no magento 2.1

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

Em seguida, criei o observador "Cataloginventorysave.php" no qual desejo acessar

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

Mas o nome do evento cataloginventory_stock_item_save_afternão foi encontrado na lista de eventos do magento 2. Como vou conseguir isso.

SPK
fonte

Respostas:

8

Isso é um bug.

Basicamente esses eventos são despachados de forma dinâmica em Magento\Framework\Model\AbstractModelno afterSave()método:

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

Como você pode ver, esse código é usado $this->_eventPrefixpara gerar o nome do evento.

Mas o problema Magento\CatalogInventory\Model\Stock\Itemé que essa variável não é declarada corretamente :

protected $eventPrefix = 'cataloginventory_stock_item';

Vê o problema? Está faltando um sublinhado, deve ser:

protected $_eventPrefix = 'cataloginventory_stock_item';

Sugiro que você crie um relatório de bug aqui para que a equipe esteja ciente disso: https://github.com/magento/magento2/issues

Depois de cavar, parece que alguém encontrou o bug antes de nós: https://github.com/magento/magento2/issues/4857

Observe que o PR já foi mesclado à developfilial

Raphael na Digital Pianism
fonte
obrigado. funcionou .. mas agora eu quero o ID do produto, então tentei: $ stockItem = $ observer-> getEvent () -> getItem ();
SPK 16/09
1
$ id = $ stockItem-> getProductId (); Eu recebi o erro: PHP Erro fatal: Chamada para uma função de membro getProductId () em null
SPK
@SPK Requer uma correção no nome do atributo $ _eventObject. Sem essa correção, o evento sempre passa os dados do evento como 'Objeto' em vez dos 'Estoque' e 'Item' esperados.
Geethika Antony
esse evento é despachado por um pedido ou API?
Antonio Pedicini 29/07
Neste caso alguma idéia de como obter o qty anterior no Magento 1 getOrigData('qty')pode ser usado para it.But ele não está funcionando no 2.
Geethika Antony