我需要在下订单时停止减少库存, 我只有在成功付款后才需要进行此活动。
答案 0 :(得分:7)
是的,我们可以实用地禁用此数量减少
如何?
扩展 Mage_Checkout_Model_Type_Onepage 并重写方法 saveOrder
<强>更改强>
在上述方法中的以下几行之前,将在#740到#742周围
$service = Mage::getModel('sales/service_quote', $this->getQuote());
$service->submitAll();
添加
$quote = $this->getQuote();
# Ref: Mage_CatalogInventory_Model_Observer::subtractQuoteInventory
$quote->setInventoryProcessed(true);
这将告知Magento不要处理报价的库存,因此即使配置了这样也不会减少数量。
答案 1 :(得分:5)
系统&gt;配置&gt;目录&gt;库存&gt;股票期权
订购时减少库存&gt;否
答案 2 :(得分:1)
对于想要在下订单中找到有关减法的更多信息的人,只需要在Magento EE / CE中学习此事件
sales_model_service_quote_submit_before
答案 3 :(得分:0)
您可以在管理员中禁用库存管理,除非您有这样的特殊原因需要这样做吗?
您可以设置观察者在成功付款后添加到数量: 您可以在此处查看可以挂钩的Magento活动列表:http://www.nicksays.co.uk/magento_events_cheat_sheet/
<events>
<sales_order_payment_pay>
<observers>
<my_observer>
<type>singleton</type>
<class>my/observer</class>
<method>addQty</method>
</my_observer>
</observers>
</sales_order_payment_pay>
</events>
然后你的观察者会重新加上数量......
<?php
class Company_My_Model_Observer
{
public function addQty($event)
{
$order = $event->getInvoice()->getOrder(); // Mage_Sales_Model_Order
$items = $order->getAllVisibleItems();
foreach($items as $item) {
$qty = $item->getQtyOrdered(); // Amount to add back on
$product = Mage::getModel('catalog/product')->load($item->getProductId());
/**
* Here you would load the product and add this amount back on
*/
}
return $this;
}
}
这可能不会按原样运作,但你明白了。您需要注意magento和支付类型事件,因为不同的支付模块可以稍微不同地处理这些事件。
答案 4 :(得分:0)
在某些情况下,您可以使用以下内容:
config.xml
<frontend>
<routers>
<sales_model_service_quote_submit_after>
<observers>
<inventory>
<type>singleton</type>
<class>Vendor_Name_Model_Observer</class>
<method>revertQuoteInventory</method>
</inventory>
</observers>
</sales_model_service_quote_submit_after>
</events>
</frontend>
Observer.php
public function revertQuoteInventory(Varien_Event_Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$inventory = Mage::getModel('cataloginventory/observer');
$inventory->revertQuoteInventory($observer);
$inventory->reindexQuoteInventory($observer);
$quote->setInventoryProcessed(true);
}