2011-07-15 120 views
5

據我瞭解Magento的有不同的順序狀態下的全球/銷售/訂單/狀態可以通過改變或者複製應用程序/代碼/核心/ Mage/Sales/etc/config.xml添加到本地作用域,或使用自定義模塊覆蓋它。如何訂單狀態/狀態在Magento的1.4.x工作

也有全球/銷售/順序/在同一文件中定義的狀態而據我瞭解狀態是像狀態組。只有狀態(沒有狀態)可以在Magento的訂單狀態進行設置和狀態是像狀態細分。因此,在管理員界面,您可以更改狀態放置的順序,但你不能從訂單狀態下拉改變狀態(您可以通過帳單的客戶或取消訂單更改)。

據我瞭解,你可以輕鬆地添加新的狀態到你的Magento,但不能添加新狀態狀態在某種程度上與休息或Magento的訂單處理硬編碼邏輯。我真的希望我錯了。

請糾正我,如果我在任何一點都是錯誤的,因爲這些只是我的想法,它可能離真正的Magento 1.4.x流程很遠。

回答

7

我很確定'狀態'是免費數據,它可以使用訂單實例上的setData選項設置爲ANY值。因此,如果您編寫一個可以加載訂單的自定義模塊,請將數據設置爲新「狀態」之一,並測試您所需的任何自定義邏輯。

$order = Mage::getModel('sales/order')->load(1); 
$order->setData('state','myCustomState'); 
$order->setData('status','onCustomState'); 
echo $order->getState() 
// Returns myCustomState 

其值得銘記在我的指收/取消保護狀態,所以試圖用$命令 - >的setState(「my_state」)會失敗的順序,但不應該使用setData失敗,這樣你就可以用此方法覆蓋已關閉或已取消的訂單。

如果您要使用自定義模型覆蓋訂單模型,您可以添加自己的邏輯(如isOnCustomState()),並允許通過以id加載的方式以任何方式處理訂單。

要添加「定製邏輯」您的訂單,你可以做一些複製應用程序\代碼\核心\法師\銷售\型號\ Order.php到本地文件夾,然後您可以添加功能到該模型中,

public function isActive(){ if($this->getState() == 'active'){ return true; } else { return false; } 
public function isInActive(){ if($this->getState() == 'deactivated'){ return true; } else { return false; } 

public function activate(){ 
    if(!$this->isActive()){ 
     $this->setData('state','active'); 
     $this->setData('status','Active Subscription'); 

     // some custom code to start a recuring payment 

     return $this; 
    } 
} 

public function deactiveate(){ 
    if(!$this->isInActive()){ 
     $this->setData('state','deactivated'); 
     $this->sendOrderUpdateEmail(true,'Your subscription has been deactivated.'); 

     // some custom code to stop a recuring payment 

     return $this; 
    } 
} 

現在你可以加載順序並設置啓用或停用爲了激發你的自定義代碼上,

$order = Mage::getModel('sales/order')->load(1)->activate(); 

這個代碼是所有未測試,只是有些事情你可以嘗試的一個例子,請不要只需將此代碼轉儲到您的模型中,並期望它完美地工作。在代碼\核心\法師\銷售\等\ config.xml文件中的節點銷售額/訂單/狀態添加

<activated translate="label"> 
    <label>Active Subscription</label> 
    <statuses> 
     <pending default="1"/> 
    </statuses> 
    <visible_on_front/> 
</activated> 
+0

在這種情況下,爲什麼通過XML添加另一個狀態不起作用? –

+0

你應該可以將'狀態'添加到magentos'sales'模塊的config.xml中,但是它不會執行任何操作,因爲狀態不僅需要一個操作而不僅僅是設置一個標誌,這就是爲什麼你需要添加自定義邏輯。如果您的自定義狀態爲「激活」,則您需要添加邏輯關於如果「激活」訂單被「取消」時要做什麼(例如,發送通知給貝寶以停止定期付款)。 –

+0

您能否給予任何類型的提示如何添加自定義狀態的邏輯? –

1

Magento的秩序是一個finite state machine

因此,當您定義狀態時,它會自動嘗試定義其狀態。不建議直接改變狀態。

當您定義狀態時,它會檢查裝運和發票的各種標誌,並根據所有標誌來獲得正確的狀態。一旦訂單處於批准狀態,但無論是否有發票或任何標誌等,您都可以輕鬆更改狀態。

相關問題