Возможно ли программно перевести состояние заказа в обработку из полного?


Я пытаюсь перевести состояние заказа в обработку из полного. вот код

class TempName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
     $this->loadLayout(array('default'));
     $this->renderLayout();

     $order = Mage::getModel('sales/order');
     $order->loadByIncrementId(100000041);
     $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, 'Gateway has authorized the payment.');
     $order->save();
    }
}

?>

Приведенный выше код может обновить состояние заказа от ожидающего/ожидающего платежа до обработки, но я не могу обновить состояние заказа от завершения до обработки. Кто-нибудь может, в чем проблема?

Author: hkguile, 2014-04-10

1 answers

По умолчанию вы не можете настроить состояние заказа, когда он завершен. Это происходит потому, что это государство защищено.

Более пристальный взгляд на код объясняет нам, почему:

При вызове setState в классе Mage_Sales_Model_Order запускается следующее.

public function setState($state, $status = false, $comment = '', $isCustomerNotified = null)
{
    return $this->_setState($state, $status, $comment, $isCustomerNotified, true);
}

Который, как вы можете видеть, пузырится прямо до _setState.

protected function _setState($state, $status = false, $comment = '',
    $isCustomerNotified = null, $shouldProtectState = false)
{
    // attempt to set the specified state
    if ($shouldProtectState) {
        if ($this->isStateProtected($state)) {
            Mage::throwException(
                Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state)
            );
        }
    }
    $this->setData('state', $state);

    // add status history
    if ($status) {
        if ($status === true) {
            $status = $this->getConfig()->getStateDefaultStatus($state);
        }
        $this->setStatus($status);
        $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again
        $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility
    }
    return $this;
}

, в котором все переданные состояния проверяются с помощью метода isStateProtected.

Проверьте, что этот метод сообщает нам, что "полное" состояние защищено. Таким образом блокируется для дальнейших обновлений.

public function isStateProtected($state)
{
    if (empty($state)) {
        return false;
    }
    return self::STATE_COMPLETE == $state || self::STATE_CLOSED == $state;
}

Когда заказ завершен, обычно ему выставляется счет, он отправляется и т.д. Так почему же вы хотите изменить состояние обратно на "обработку"? Это означало бы, что заказ больше не отправляется, в то время как отгрузка, вероятно, уже создана. Это, вероятно, доставит вам некоторые проблемы в дальнейшем.

Теперь, по крайней мере, вы знаете, почему не можете изменить порядок. Надеюсь, это поможет вам!

 5
Author: Tim Hofman, 2014-04-12 09:10:07