Magento 2:カスタムモジュールでプログラムによって注文ステータスを更新する方法


11
$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order')->load($orderId); 
$order->setState("processing")->setStatus("processing");
$order->save();

Magento 2で注文ステータスを更新する方法を教えてください。

回答:


19

あなたは次のようにそれを行うことができます

名前空間の下で宣言する

use Magento\Sales\Model\Order;

$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order') ->load($orderId);
$orderState = Order::STATE_PROCESSING;
$order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
$order->save();

お役に立てれば


返信ありがとう@Dhaval Drcsystems私は更新注文のステータスのみを必要としています
Rahul Katoch

このモデルを参照すると、より良いアイデアを得ることができますMagento \ Sales \ Model \ Order \ Paymentコードで注文を処理する方法をここで確認してください。
Dhaval Solanki 2017

上記のコードは\ Magento \ Sales \ Model \ Order not foundエラーを示しています
Jaisa

ファイルを見せていただけますか?
Dhaval Solanki 2017

カスタムオーダーステータスを更新する方法 「sent_to_print」というステータスがある場合は?
jafar pinjar 2018

12

注文状態の更新

注文のステータスとステータスをプログラムで順番に更新するには、ステータスとステータスをこの形式で定義します。構成関数で注文オブジェクトを開始し、カスタム関数でその注文オブジェクトを使用して更新します。モデルでプログラムによって注文状態を更新するには、関数constructから注文オブジェクトを取得します。

public function __construct(
    \Magento\Sales\Model\Order $order
){
    $this->order = $order;
}
public function updateorder(){
    $order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true);
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING);
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference');
    $order->save();
}

新しい注文メール

$orderid = '10000000';
$order = $this->_objectManager->get('Magento\Sales\Model\Order')->loadByIncrementId($orderid);
$this->_objectManager->get('Magento\Sales\Model\Order\Email\Sender\OrderSender')->send($order);

返信@calypsoに感謝しますが、注文ステータスのみを更新します
Rahul Katoch

@Rahulocodewireそれもコメントです。
gelanivishal 2017年

@ calypsoこのコードをモジュールのどこに配置するか説明してください
Rahul Katoch

コントローラーで保留状態を表示するにはどうすればよいですか?
Rahul Katoch

5

以来負荷()保存()現在は非推奨されている(なぜなら:)

* @deprecated 100.1.0 because entities must not be responsible for their own loading.
* Service contracts should persist entities. Use resource model "load" or collections to implement
* service contract model loading operations.

OrderRepositoryInterfaceを使用して注文を読み込み、保存しました。

use Magento\Sales\Api\OrderRepositoryInterface;

public function __construct(
    OrderRepositoryInterface $orderRepository,
    ...
) {
    $this->orderRepository = $orderRepository;
}

...
$order = $this->orderRepository->get($orderId);
$order->setState(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);
$order->setStatus(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);

try {
    $this->orderRepository->save($order);
} catch (\Exception $e) {
    $this->logger->error($e);
    $this->messageManager->addExceptionMessage($e, $e->getMessage());
}

それが役に立てば幸い


カスタムオーダーステータスを更新する方法
jafar pinjar 2018

3

Magento 2.2.2これは以下の方法でのみ機能します!

    $order = $this->order->loadByIncrementId('000000001');
    //$order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference again and again');
    //$order->save();

しかし、私が持っている唯一の問題は、それが完全にステータスを更新しないことです: ここに画像の説明を入力してください

グリッド内の以下のみを更新します。 ここに画像の説明を入力してください

また、新しい請求書、配送、クレジットメモを作成することもできません。ありがとう


3

@medmekと@ prince-patelの回答に感謝します。カスタムオーダーステータスに関する@ jafar-pinjarからの質問として、setStateおよびsetStatus呼び出しはステータスコードを取得できます。たとえば、カスタムステータスコード「有料」が作成されます。ステータス/状態を注文に更新するには:

...
use \Magento\Sales\Api\OrderRepositoryInterface;

class nameOfTheClass {
    ...
    protected $_orderRepository;
    ...
    public function __construct(..., OrderRepositoryInterface $orderRepository, ...){

        $this->_orderRepository = $orderRepository;
        ...
    }
    ...
    public function setOrderStatus($orderID, $statusCode){
        try{
            // obtain the order with the order ID
            $order = $this->_orderRepository->get($orderID);
            $order->setState($statusCode)->setStatus($statusCode);
            $this->_orderRepository->save($order);
            return true;
        } catch (\Exception $e){
            // add some logging here
            return false;
        }
    }
    ...
}

注文ステータスを更新するには:

$orderID = 1234; // this is the order ID
$code = 'paid';
$this->setOrderStatus($orderID, $code);

それが誰かを助けることを願っています。


1
増分IDは1234ではなく#3000001469-1のようです。1234はむしろ注文ID
Greck

@Greckを指摘してくれてありがとう。応答を更新しました。
qgor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.