Preciso detectar sempre que o nível de estoque de um produto muda. Tive algum sucesso com o cataloginventory_stock_item_save_afterevento que é acionado quando o estoque é alterado no back-end ou quando um pedido é cancelado no front-end (via Paypal), mas não é acionado quando um produto é comprado no front-end.
Estou entrando no cataloginventory_stock_item_save_afterevento assim:
Preciso usar outro evento para capturar a alteração de inventário quando um cliente compra alguma coisa ou há algo errado com a maneira como me envolvi no evento?
Há algum tempo atrás, eu criei algo para isso, tive que ouvir vários observadores, porque eles não eram todos tratados pelo salvamento do catálogo no catálogo, eu tinha que seguir o código:
Quando usei isso como está, produziu um erro de 500 servidores ao cancelar pedidos e fazer pedidos não funcionou. Eu tive que excluir a condição if ($ this-> isEnabled ()) das funções para que isso funcionasse. Alguma razão para que isso aconteça? É porque estou usando o tipo singleton? Obrigado
Moustafa Elqabbany
5
Você não pode usar nenhum evento relacionado ao modelo de item de estoque, porque o Magento usa uma consulta SQL otimizada para diminuir o estoque de todos os itens pedidos de uma só vez, ignorando o modelo.
Resolvi isso reescrevendo Mage_CatalogInventory_Model_Stockonde adicionei um evento adicional:
Então o observador para cataloginventory_stock_item_correct_qty_afterpode ficar assim:
/**
* @var $items array array($productId => array('qty'=>$qty, 'item'=>$stockItem))
*/
$items = $observer->getItems();foreach($items as $productId => $item){
$stockItem = $item['item'];
$product = $stockItem->getProduct();// Do anything you need with $stockItem and $product here}
Eu recomendo não fazer processamento pesado ou chamadas adicionais ao banco de dados (que são necessárias para detectar se o produto está fora de estoque, por exemplo), mas adicionar os produtos a uma fila que é processada por um cronjob, para minimizar o tempo de carregamento adicional para o do utilizador.
$stockItem->canSubtractQty()não está trabalhando no observador nem é $stockItem->getId().. alguma dica? Parece que não consigo acessar os métodos
snh_nl
Fabian, qual é o objetivo de adicionar eventos personalizados aqui, pois você pode adicionar o recurso com a própria função sobrescrita? isso é apenas para desacoplar? Por favor, guie.
Magento Learner
@ MagentoLearner Sim, facilitou a reutilização e a adição de recursos diferentes. Tecnicamente, você também pode introduzir um método privado #
Fabian Schmengler
Isso pode envolver a reescrita de uma classe principal, mas ainda é a solução mais completa aqui. Às vezes você só precisa adicionar seus próprios eventos no M1: P
Você não pode usar nenhum evento relacionado ao modelo de item de estoque, porque o Magento usa uma consulta SQL otimizada para diminuir o estoque de todos os itens pedidos de uma só vez, ignorando o modelo.
Resolvi isso reescrevendo
Mage_CatalogInventory_Model_Stock
onde adicionei um evento adicional:Então o observador para
cataloginventory_stock_item_correct_qty_after
pode ficar assim:Eu recomendo não fazer processamento pesado ou chamadas adicionais ao banco de dados (que são necessárias para detectar se o produto está fora de estoque, por exemplo), mas adicionar os produtos a uma fila que é processada por um cronjob, para minimizar o tempo de carregamento adicional para o do utilizador.
fonte
$stockItem->canSubtractQty()
não está trabalhando no observador nem é$stockItem->getId()
.. alguma dica? Parece que não consigo acessar os métodos