如果订单状态为处理中
为“order_cancel_before”创建一个带有观察者的自定义模块(参见示例@Change Magento default status for duplicated products更改<catalog_model_product_duplicate> to <order_cancel_before>
因为<order_cancel_before> 没有在 app/code/core/Mage/Sales/Model/Order.php 中定义
您可以覆盖/重写订单模型类,例如 http://phprelated.myworks.ro/how-to-override-rewrite-model-class-in-magento/
在你的本地模块中做
public function cancel()
{
if ($this->canCancel()) {
Mage::dispatchEvent('order_cancel_before', array('order' => $this));
$this->getPayment()->cancel();
$this->registerCancellation();
Mage::dispatchEvent('order_cancel_after', array('order' => $this));
}
return $this;
}
或者您可以在模型中创建一个新方法 increaseProductQty() 并将下面的代码复制到其中(这样您就不需要观察者了)。然后将 Mage::dispatchEvent('order_cancel_before'... 行替换为 $this->increaseProductQty()
在你的观察者方法中(伪代码)
$curr_date = date('Y-m-d H:i:s');
$order = $observer->getEvent()->getOrder();
foreach ($order->getItemsCollection() as $item)
{
$productId = $item->getProductId();
$qty = $item->getQty();
// you need to check order status to make sure it processing
//$order->getStatus() (assuming you are canceling entire order)
//$order->getPayment();
$product = Mage::getModel('catalog/product')->load($product_id);
$stock_obj = Mage::getModel('cataloginventory/stock_item')->load($product_id);
$stockData = $stock_obj->getData();
$product_qty_before = (int)$stock_obj->getQty();
$product_qty_after = (int)($product_qty_before + $qty);
$stockData['qty'] = $product_qty_after;
$productInfoData = $product->getData();
$productInfoData['updated_at'] = $curr_date;
$product->setData($productInfoData);
$product->setStockData($stockData);
$product->save();
}
如果您在更新库存时遇到问题,请参阅Set default product values when adding new product in Magento 1.7
参考http://pragneshkaria.com/programatically-change-products-quantity-after-order-cancelled-magento/
如果订单状态为待处理
看看系统>配置>库存
在订单取消时将商品的状态设置为有库存 - 控制挂单中的产品是否在订单被取消时自动返回库存。范围:商店视图。
阅读更多@
How to Manage Magento Store Inventory?
ADMIN: System → Configuration → Inventory Tab