3

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

ここで現在のコードを取得しました。そのページには、Magento 1.3.2.4 でテスト済みと書かれていますが、私は Magento 1.6.x を使用しています。たぶんそれが問題ですか?

詳細を提供する必要がある場合はお知らせください。ご協力いただきありがとうございます。

4

1 に答える 1

2

ここで Magento のバージョンの問題が発生しているとは思いません。

特定の状況下では、Magento は単に注文の状態を に戻すことを許可していませんMage_Sales_Model_Order::STATE_PROCESSING

たとえば、通常、Mage_Sales_Model_Order::STATE_PROCESSINGすでに払い戻し (クレジットメモ) が行われている注文に状態を保存することはできません。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 が認識も期待も処理もできない新しい状態コンテキストが作成される可能性が高いことに注意してください。

あなたの変更が大混乱を引き起こしたとしても、私を責めないでください。警告されました^^

于 2011-12-04T19:32:29.760 に答える