2011-07-15 214 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

因此,当您定义状态时,它会自动尝试定义其状态。不建议直接改变状态。

当您定义状态时,它会检查装运和发票的各种标志,并根据所有标志来获得正确的状态。一旦订单处于批准状态,但无论是否有发票或任何标志等,您都可以轻松更改状态。

相关问题