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)
答案 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();
}
}