有没有办法以编程方式重新打开已经达到完全或已关闭状态的Magento订单?我有以下代码可用于更改订单的状态,但我无法使其用于完成或关闭订单。
// connect to magento
require_once('app/Mage.php');
umask(022);
Mage::app();
// check admin credentials
Mage::getSingleton('core/session', array('name' => 'adminhtml'));
$admin = Mage::getSingleton('admin/session');
if ( $admin->isLoggedIn() ) {
// update order status
$orderIncrementId = "100000001";
$order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
}
我收到了当前的代码here。在那个页面上它说它是用Magento 1.3.2.4测试的,但我使用的是Magento 1.6.x.也许这就是问题?
如果我需要提供更多详细信息,请与我们联系,并感谢您提供的任何帮助。
答案 0 :(得分:2)
我不认为您在这里遇到Magento版本问题。
在特定情况下,Magento只是不允许将订单状态切换回Mage_Sales_Model_Order::STATE_PROCESSING
。
例如,通常您无法将Mage_Sales_Model_Order::STATE_PROCESSING
州保存到已经退款的任何订单(creditmemos)。既不在1.3.2.4中,也不在1.6.x中。
这是按设计的。
请查看Mage_Sales_Model_Order::_checkState()
,了解Magento在何种情况下强制将订单状态重置为STATE_COMPLETE
或STATE_CLOSED
。
protected function _checkState()
{
if (!$this->getId()) {
return $this;
}
$userNotification = $this->hasCustomerNoteNotify() ? $this->getCustomerNoteNotify() : null;
if (!$this->isCanceled()
&& !$this->canUnhold()
&& !$this->canInvoice()
&& !$this->canShip()) {
if (0 == $this->getBaseGrandTotal() || $this->canCreditmemo()) {
if ($this->getState() !== self::STATE_COMPLETE) {
$this->_setState(self::STATE_COMPLETE, true, '', $userNotification);
}
}
/**
* Order can be closed just in case when we have refunded amount.
* In case of "0" grand total order checking ForcedCanCreditmemo flag
*/
elseif (floatval($this->getTotalRefunded()) || (!$this->getTotalRefunded()
&& $this->hasForcedCanCreditmemo())
) {
if ($this->getState() !== self::STATE_CLOSED) {
$this->_setState(self::STATE_CLOSED, true, '', $userNotification);
}
}
}
if ($this->getState() == self::STATE_NEW && $this->getIsInProcess()) {
$this->setState(self::STATE_PROCESSING, true, '', $userNotification);
}
return $this;
}
要回答您的问题:您可以通过使用自己的方法覆盖_checkState()
方法来实现您尝试执行的操作,该方法允许设置STATE_PROCESSING
。
请注意,这很可能会导致创建Magento既不知道也不期望或无法处理的新状态上下文。
如果你的改变造成严重破坏,请不要怪我。你已被警告^^