คุณไม่สามารถใช้เหตุการณ์ใด ๆ ที่เกี่ยวข้องกับรูปแบบรายการสต็อกได้เนื่องจาก Magento ใช้แบบสอบถาม SQL ที่ปรับให้เหมาะสมเพื่อลดสต็อกสำหรับรายการที่สั่งซื้อทั้งหมดในครั้งเดียวโดยข้ามรุ่น
ฉันแก้ไขสิ่งนี้ด้วยการเขียนMage_CatalogInventory_Model_Stock
ว่าฉันเพิ่มเหตุการณ์เพิ่มเติมที่ไหน:
<?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;
}
}
จากนั้นผู้สังเกตการณ์cataloginventory_stock_item_correct_qty_after
สามารถมีลักษณะดังนี้:
/**
* @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
}
ฉันไม่แนะนำให้ทำการประมวลผลหนักหรือเรียกฐานข้อมูลเพิ่มเติม (ซึ่งจำเป็นต่อการตรวจสอบว่าผลิตภัณฑ์หมดสต็อก) แต่เพื่อเพิ่มผลิตภัณฑ์ในคิวที่ประมวลผลโดย cronjob เพื่อลดเวลาในการโหลดเพิ่มเติมสำหรับ ผู้ใช้งาน