আপনি স্টক আইটেমের মডেল সম্পর্কিত কোনও ইভেন্ট ব্যবহার করতে পারবেন না, কারণ মাগেন্তো একবারে সমস্ত অর্ডার করা আইটেমের স্টক হ্রাস করতে একটি অনুকূলিত এসকিউএল কোয়েরি ব্যবহার করে মডেলটিকে বাইপাস করে।
আমি 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
}
আমি ভারী প্রক্রিয়াজাতকরণ বা অতিরিক্ত ডাটাবেস কলগুলি না করার পরামর্শ দিই (উদাহরণস্বরূপ পণ্যটি স্টকের বাইরে রয়েছে কিনা তা সনাক্ত করার জন্য প্রয়োজনীয়), তবে ক্রোনজব দ্বারা প্রসেস করা কাতারে পণ্য যুক্ত করার জন্য, অতিরিক্ত লোডের সময়কে কমিয়ে আনতে ব্যবহারকারী।