Magento 2: Comment mettre à jour l'état des commandes par programme dans un module personnalisé?


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

Veuillez me dire comment je mets à jour l'état de ma commande dans Magento 2?

Réponses:


19

Vous pouvez le faire comme suit

déclarer sous l'espace de noms

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

J'espère que cela t'aides


merci pour la réponse @Dhaval Drcsystems je veux seulement mettre à jour le statut de la commande
Rahul Katoch

Vous pouvez vous référer à ce modèle afin d'avoir une meilleure idée Magento \ Sales \ Model \ Order \ Payment Vérifiez ici comment ils traitent la commande avec le code.
Dhaval Solanki

le code ci-dessus affiche l'erreur \ Magento \ Sales \ Model \ Order not found
Jaisa

Pouvez-vous me montrer votre dossier?
Dhaval Solanki

Comment mettre à jour le statut d'une commande personnalisée? Si j'ai un statut appelé 'sent_to_print'?
jafar pinjar

12

Mise à jour de l'état de la commande

Pour mettre à jour l'état et l'état de la commande de manière programmatique afin de définir l'état et l'état dans ce format. Initiez l'objet order dans la fonction de construction et utilisez cet objet order dans la fonction personnalisée pour le mettre à jour. Pour mettre à jour l'état de la commande par programme dans le modèle, récupérez l'objet de commande à partir de la fonction de construction.

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

Nouvel e-mail de commande

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

grand merci pour la réponse @calypso mais je veux mettre à jour uniquement le statut de la commande
Rahul Katoch

@Rahulocodewire Il est également en commentaire.
gelanivishal

@ calypso veuillez expliquer où j'ai mis ce code dans mon module
Rahul Katoch

comment afficher l'état en attente dans le contrôleur?
Rahul Katoch

5

Puisque load () et save () sont obsolètes maintenant (parce que :)

* @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.

J'ai utilisé OrderRepositoryInterface pour charger et enregistrer la commande:

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

J'espère que cela aide


comment mettre à jour le statut d'une commande personnalisée?
jafar pinjar

3

Magento 2.2.2 Cela ne fonctionne que de la manière suivante!

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

Mais le seul problème que j'ai, c'est qu'il ne met pas à jour complètement le statut: entrez la description de l'image ici

Il ne met à jour que dans la grille et ce qui suit: entrez la description de l'image ici

Il n'est également pas possible de créer de nouvelles factures, frais d'expédition et avoir. Merci


3

Merci à @medmek et @ prince-patel de répondre. À la question de @ jafar-pinjar concernant le statut de la commande personnalisée, les appels setState et setStatus peuvent prendre le code d'état. Par exemple, le code d'état personnalisé "payé" est créé. Pour mettre à jour l'état / l'état d'une commande:

...
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;
        }
    }
    ...
}

Pour mettre à jour le statut de la commande:

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

J'espère que cela aide quelqu'un là-bas.


1
l'identifiant incrémentiel est comme # 3000001469-1, pas 1234. 1234 est plutôt l'identifiant de commande
Greck

Merci d'avoir signalé @Greck. Mise à jour de la réponse.
qgor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.