Magento:订单可以设置为处理状态而无需创建发票或货件吗?

时间:2011-11-15 18:21:02

标签: magento

Mage v1.6

我想修改checkmo付款方式,以便在创建时将订单提升为处理状态。我发现通过更改/app/code/core/Mage/Payment/etc/system.xml(是的,现在只是在测试服务器上摆弄核心,如果它可以正常修改它)文件在这里:

<checkmo translate="label">
  <fields>
    <order_status translate="label">
      <source_model>adminhtml/system_config_source_order_status_new</source_model>

通过删除source_model中的“new”,您可以在属于处理状态的配置中选择订单状态。

但是,处理状态下的订单确实。它们保持在新的/挂起状态,但状态是处理状态。奇怪的混合。

这不太有效,因为我的目标是能够轻松地在我为处理状态所做的4个自定义订单状态之间切换订单。原因是让所有订单,支票或CC处于相同状态,以便可以对它们进行类似处理。 Authnet模块将CC订单置于处理状态,我希望checkmo订单加入它们。 (相反,如果我可以将CC订单转到新的/挂起状态,我可以将我的自定义状态分配给该状态)无论哪种方式,我都需要在创建时所有新订单处于相同状态,无论发票或货件是否存在。

感谢

注意:这些相关问题并未完全解决此问题:6095096,6415547,4170628)

1 个答案:

答案 0 :(得分:3)

设置订单状态的重要操作在Mage_Sales_Model_Order_Payment :: Place()中处理:

...
$orderState = Mage_Sales_Model_Order::STATE_NEW;
...
$orderStatus = $methodInstance->getConfigData('order_status');
...
$order->setState($orderState, $orderStatus, $message, $isCustomerNotified);
...

但是,在Mage_Sales_Model_Order :: setState()中,它不检查订单状态和订单状态之间的关系。因此,奇怪的混合

有很多方法可以解决这个问题,一种是为事件'checkout_type_onepage_save_order_after'添加观察者并重置其状态。我首选的方法是在付款方式模型中添加回调:

class Celera_AaCredit_Model_Payment extends Mage_Payment_Model_Method_Abstract
{
protected $_code  = 'aa_credit'; 
protected $_isInitializeNeeded = true; //Required for the initialize() callback to happen 

/* Workaround to assign the correct order state to the corresponding status set in system config */

/**
 * Invoke in Mage_Sales_Model_Order_Payment
 * Required for the initialize() callback to happen     
 *      
 * @return string
 */                 
public function getConfigPaymentAction()
{
    return 'init'; //set flag to initialize $this after order is created and the payment is placed
}

/**
 * Update order state to system configuration 
 *
 * @return Mage_Payment_Model_Method_Abstract
*/ 
public function initialize($action, $stateObject)
{                          
    if ($status = $this->getConfigData('order_status')) {
        $stateObject->setStatus($status);
        $state = $this->_getAssignedState($status);
        $stateObject->setState($state);
        $stateObject->setIsNotified(true);            
    }
    return $this;
}

/**
 * Get the assigned state of an order status
 *     
 * @param string order_status
 */              
protected function _getAssignedState($status)
{
    $item = Mage::getResourceModel('sales/order_status_collection')
              ->joinStates()
              ->addFieldToFilter('main_table.status', $status)
              ->getFirstItem();
    return $item->getState();
}
}