Necesito detectar cada vez que cambia el nivel de inventario de un producto. He tenido cierto éxito al usar el cataloginventory_stock_item_save_afterevento que se activa cuando se cambia el inventario en el back-end, o cuando se cancela un pedido en la interfaz (a través de Paypal), pero no se activa cuando se compra un producto desde la interfaz.
Me estoy enganchando al cataloginventory_stock_item_save_afterevento así:
¿Necesito usar otro evento para capturar el cambio de inventario cuando un cliente compra algo, o hay algún problema con la forma en que me enganché al evento?
Hace algún tiempo que construí algo para esto, tuve que escuchar a varios observadores porque no todos fueron manejados por el almacenamiento del inventario del catálogo, tengo que seguir el siguiente código:
Cuando usé esto como está, produjo un error de servidor 500 cuando cancelar pedidos y realizar pedidos no funcionó. Tuve que eliminar la condición if ($ this-> isEnabled ()) de las funciones para que esto funcione. ¿Alguna razón por la cual este es el caso? ¿Es porque estoy usando el tipo singleton? Gracias
Moustafa Elqabbany
5
No puede usar ningún evento relacionado con el modelo de artículo de stock, porque Magento utiliza una consulta SQL optimizada para disminuir el stock de todos los artículos pedidos a la vez, sin pasar por el modelo.
Resolví esto con una reescritura de Mage_CatalogInventory_Model_Stockdonde agregué un evento adicional:
Entonces el observador cataloginventory_stock_item_correct_qty_afterpuede verse así:
/**
* @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}
Recomiendo no realizar un procesamiento pesado o llamadas adicionales a la base de datos (que son necesarias para detectar si el producto está agotado, por ejemplo), sino agregar los productos a una cola que es procesada por un cronjob, para minimizar el tiempo de carga adicional para el usuario.
$stockItem->canSubtractQty()no funciona en el observador ni $stockItem->getId()... ¿algún consejo? Parece que no puedo acceder a los métodos
snh_nl
Fabian, ¿cuál es el propósito de agregar eventos personalizados aquí, ya que puedes agregar la función con la función sobrescrita? ¿Es esto solo para desacoplar? Por favor guía.
Magento Learner
@MagentoLearner sí, me facilitó la reutilización y la adición de diferentes funciones. Técnicamente, también podrías introducir un método privado
Fabian Schmengler el
Esto puede implicar reescribir una clase principal, pero sigue siendo la solución más completa aquí. A veces solo tienes que agregar tus propios eventos en M1: P
No puede usar ningún evento relacionado con el modelo de artículo de stock, porque Magento utiliza una consulta SQL optimizada para disminuir el stock de todos los artículos pedidos a la vez, sin pasar por el modelo.
Resolví esto con una reescritura de
Mage_CatalogInventory_Model_Stock
donde agregué un evento adicional:Entonces el observador
cataloginventory_stock_item_correct_qty_after
puede verse así:Recomiendo no realizar un procesamiento pesado o llamadas adicionales a la base de datos (que son necesarias para detectar si el producto está agotado, por ejemplo), sino agregar los productos a una cola que es procesada por un cronjob, para minimizar el tiempo de carga adicional para el usuario.
fuente
$stockItem->canSubtractQty()
no funciona en el observador ni$stockItem->getId()
... ¿algún consejo? Parece que no puedo acceder a los métodos