据我所知,Magento在全球/销售/订单/状态下有各种订单 状态 ,可以通过复制app / code / core / Mage /来改变将/ etc / config.xml销售到本地范围或使用自定义模块覆盖它。
在同一个文件中还定义了全球/销售/订单/状态,据我所知, 州 类似于 状态< / em> 组。只有 州 (非状态)可以在magento的订单状态设置,而 状态 就像 陈述 细分。因此,在管理员界面中,您可以更改已下订单的 状态 ,但无法从订单中更改 州 状态下拉菜单(您可以通过开票或取消订单来更改它。)
据我了解,您可以轻松地向Magento添加新的 状态 ,但无法添加新的 州 < / strong>因为 状态 以某种方式使用其余或Magento订单处理逻辑进行硬编码。我真的希望我错了。
如果我在任何方面都错了,请纠正我,因为这些只是我的想法,它可能与真正的Magento 1.4.x流程相差甚远。
答案 0 :(得分:7)
我非常确定'state'是免费数据,可以使用订单实例上的setData选项将其设置为ANY值。因此,如果您编写可以加载订单的自定义模块,请将数据设置为一个新的“状态”,并使用您需要的自定义逻辑进行测试。
$order = Mage::getModel('sales/order')->load(1);
$order->setData('state','myCustomState');
$order->setData('status','onCustomState');
echo $order->getState()
// Returns myCustomState
我认为CLOSED / CANCELED是受保护的状态,因此尝试使用$ order-&gt; setState('my_state')会在这些命令上失败,但不应该在setData上失败,这样你就可以覆盖关闭或使用此方法取消订单。
如果您使用自定义模型覆盖订单模型,您可以添加自己的逻辑,例如isOnCustomState(),并允许以任何方式处理订单,只需按ID加载。
要在订单中添加“自定义逻辑”,您可以将app \ code \ core \ Mage \ Sales \ Model \ 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();
这段代码都是未经测试的,只是您可以尝试的一些例子,请不要只是将此代码转储到您的模型中并期望它能够完美地运行。在代码\ core \ Mage \ Sales \ etc \ config.xml中的节点sales / order / states add
<activated translate="label">
<label>Active Subscription</label>
<statuses>
<pending default="1"/>
</statuses>
<visible_on_front/>
</activated>
答案 1 :(得分:1)
Magento订单是finite state machine。
因此,当您定义状态时,它会自动尝试定义其状态。不建议直接改变状态。
当您定义状态时,它会检查装运和发票的各种标志,并根据所有这些标志获得正确的状态。一旦订单处于批准状态,无论是否有发票或任何标志等,您都可以轻松更改状态。