2012-02-22 45 views
4

我想對某些產品實施全局訂單限制。重點在於,我希望啓用某些產品的延期交貨,並定義多個日期,以限制可能訂購的這些單個產品的數量。Magento - 基於自定義標準實施訂單限制

目前我的自定義模型加載對於選定日期期間的相關信息,並附着在產品型號的時候都對這些事件的加載,$product->setMyModel(...)

  • catalog_product_load_after
  • catalog_product_collection_load_after
  • sales_quote_item_collection_products_after_load

訪問我的模型與特定產品的數據是as simp le致電$product->getMyModel(),因此我將其簡稱爲我的型號

這就是我想做的事:當一個產品被添加到購物車/報價,或放置在一個順序

,我想要做這樣的事情(僞):

// Somehow get $product and $requestedQty (most likely from an event) 
$myModel = $product->getMyModel(); 
if($myModel->applyOrderLimit()) { 
    // ($orderedQty + $requestedQty) <= $orderLimit 
    if($myModel->isRequestedQtyAvailable($requestedQty)) { 
     // Issue an error and prevent the item from being ordered 
     return; 
    } 
    // $orderedQty += $requestedQty 
    $myModel->addToQtyOrdered($requestedQty); 
} 
// Continue Magentos default behaviour 

1.1。我懷疑Mage_CatalogInventory_Item::checkQuoteItemQty()應該被覆蓋以在這裏捕獲$requestedQty

2.更新$myModel::ordered_qty每當訂單被取消,退款或此類。

我想真正的問題是我在哪裏運行這段代碼,還有什麼更多的實現這樣的訂單限制和跟蹤的數量比我已經意識到?

對我而言,這看起來相當複雜。這就是爲什麼我需要更有經驗的Magento開發人員的幫助!

注:我不能弄清楚如何搭配編號列表和代碼塊,但我希望它足夠可讀

+0

嘗試開發一個針對sales_quote_save_before的觀察者,並且僅通過會話中的addError消息,它將自動回到角色。 – ShaunOReilly 2012-02-23 05:03:43

+0

我所做的測試顯示,通過重寫'Mage_CatalogInventory_Item :: checkQty()'來驗證數量是否正常(如果它不適合我,則返回false)。我可能會忽視某些事情。無論如何,我仍然不知道何時以及如何在我的模型中添加/刪除'ordered_items' - 請注意,我只想在特定條件下執行此操作,而不是在管理員更新數量時執行此操作(請參閱該職位) – Vitamin 2012-02-24 12:06:44

回答

8

你不必訴諸爲了實現自己的目標重寫Mage_CatalogInventory_Model_Stock_Item:.checkQty()方法。

如果您將事件觀察者添加到事件sales_quote_item_qty_set_after,除了cataloginventory檢查之外,您的觀察者將被觸發。

public function salesQuoteItemQtySetAfter(Varien_Event_Observer $observer) 
{ 
    $quoteItem = $observer->getItem(); 
    $qty = $quoteItem->getQty(); 
    $myModel = $quoteItem->getProduct()->getMyModel() 

    // Your Logic 

    // If not salable set error for the quote item 
    $quoteItem->addErrorInfo(
     'mymodule', // origin code 
     'currently_not_salable', // error code 
     'The Error Message' 
    ); 
} 

sales_quote_item_qty_set_after事件也可用於由cataloginventory模塊調用checkQty(),所以你也可以檢查Mage_CatalogInventory_Model_Observer::checkQuoteItemQty()對哪些功能是提供更多的可能性。

+0

感謝您的回答。你如何認爲我記錄了數量或訂購的產品?我想我需要考慮退款/貸項通知單,並且在訂單重新排序時,還會在後端更改數量? – Vitamin 2012-02-29 15:53:46

+0

我假設'$ myModel :: ordered_qty'與產品的庫存數量無關?這僅僅是每個產品的附加計數器嗎? – Vinai 2012-02-29 17:11:31

+0

這是每個產品的計數器,是的。如果客戶試圖訂購超過'$ myModel :: order_limit'的商品,則必須發出錯誤。 if(($ myModel-> getOrderedItems()+ $ requestedQty)> $ myModel-> getOrderLimit()){/ *錯誤! * /}' – Vitamin 2012-02-29 17:39:19