Я не думаю, что у вас возникла проблема с версией 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 не знает, не ожидает и не может обработать.
Если ваши изменения приведут к хаосуне вините меняВы были предупреждены ^^