【问题标题】:How do order statuses/states work in Magento 1.4.xMagento 1.4.x 中的订单状态/状态如何工作
【发布时间】:2011-10-06 02:03:04
【问题描述】:

据我了解 Magento 在 global/sales/order/statuses 下有各种订单 statuses 可以通过复制 app/code/core/Mage/ 来更改Sales/etc/config.xml 到本地范围或用您的自定义模块覆盖它。

在同一个文件中还定义了全局/销售/订单/状态,据我了解,状态类似于状态 组。 magento 中的订单状态只能设置 states(不是 statuses),statuses 类似于 > 细分。因此,在管理员界面中,您可以更改已下订单的状态,但不能更改订单的状态状态下拉菜单(您可以通过向客户开具发票或取消订单来更改它)。

据我了解,您可以轻松地向 Magento 添加新的状态,但无法添加新的状态 作为 states 以某种方式与其余或 Magento 订单处理逻辑进行硬编码。我真的希望我是错的。

如果我有任何错误,请纠正我,因为这些只是我的想法,可能与真正的 Magento 1.4.x 流程相去甚远。

【问题讨论】:

    标签: magento magento-1.4 status


    【解决方案1】:

    我很确定“状态”是免费数据,可以使用订单实例上的 setData 选项将其设置为任何值。因此,如果您编写一个可以加载订单的自定义模块,请将数据设置为您的新“状态”之一,并使用您需要的任何自定义逻辑进行测试。

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

    在我看来,CLOSED/CANCELLED 是受保护的状态,因此尝试使用 $order->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();
    

    此代码未经测试,只是您可以尝试的示例,请不要只是将此代码转储到您的模型中并期望它能够完美运行。在节点 sales/order/states 中的 code\core\Mage\Sales\etc\config.xml 添加

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

    【讨论】:

    • 在这种情况下,为什么通过 XML 添加另一个状态不起作用?
    • 你应该能够将'states'添加到magentos'sales'模块的config.xml中,但它不会做任何事情,因为状态需要一个动作而不仅仅是设置一个标志,这就是为什么你'将需要添加自定义逻辑。如果您的自定义状态为“活动”,则您需要添加逻辑,说明如果“活动”订单被“取消”(例如,向贝宝发送通知以停止定期付款)该怎么做。
    • 您能否给出任何提示如何添加自定义状态的逻辑?
    • 所以我不必向 XML 添加任何内容? $this->setData('state','active');正在添加将显示在订单表中的新状态,而不是处理/待付款/等?
    • 是的,那会设置订单的数据,如果你想在某些系统配置页面上调用状态,你只需要添加xml,但你不需要要做到这一点。虽然如果我正在制作一个模块来添加这个额外的状态及其功能,我也会添加状态 xml。谢谢。祝你好运。 :-)
    【解决方案2】:

    Magento 订单是finite state machine

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-12-23
      相关资源
      最近更新 更多