Bạn không thể sử dụng bất kỳ sự kiện nào liên quan đến mô hình vật phẩm chứng khoán, vì Magento sử dụng truy vấn SQL được tối ưu hóa để giảm chứng khoán cho tất cả các mặt hàng được đặt cùng một lúc, bỏ qua mô hình.
Tôi đã giải quyết điều này bằng cách viết lại Mage_CatalogInventory_Model_Stock
nơi tôi đã thêm một sự kiện bổ sung:
<?php
/**
* Add events to observe stock qty change
*
* @author Fabian Schmengler
*
*/
class SGH_ShippingExpress_Model_CatalogInventory_Stock
extends Mage_CatalogInventory_Model_Stock
{
const EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE = 'cataloginventory_stock_item_correct_qty_before';
const EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER = 'cataloginventory_stock_item_correct_qty_after';
/**
* (non-PHPdoc)
* @see Mage_CatalogInventory_Model_Stock::registerProductsSale()
*/
public function registerProductsSale($items)
{
Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
'stock' => $this,
'items_obj' => (object)array('items' => &$items),
'operator' => '-'
));
$result = parent::registerProductsSale($items);
Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
'stock' => $this,
'items' => $items,
'fullsave_items' => $result,
'operator' => '-'
));
return $result;
}
/**
* (non-PHPdoc)
* @see Mage_CatalogInventory_Model_Stock::revertProductsSale()
*/
public function revertProductsSale($items)
{
Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
'stock' => $this,
'items_obj' => (object)array('items' => &$items),
'operator' => '+'
));
$result = parent::revertProductsSale($items);
Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
'stock' => $this,
'items' => $items,
'fullsave_items' => $result,
'operator' => '+'
));
return $result;
}
}
Sau đó, người quan sát cataloginventory_stock_item_correct_qty_after
có thể trông như thế này:
/**
* @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
}
Tôi khuyên bạn không nên thực hiện xử lý nặng hoặc các cuộc gọi cơ sở dữ liệu bổ sung (cần thiết để phát hiện xem sản phẩm hết hàng chẳng hạn), nhưng để thêm các sản phẩm vào hàng đợi được xử lý bởi cronjob, để giảm thiểu thời gian tải bổ sung cho người sử dụng.