Magento 2: come aggiornare lo stato dell'ordine a livello di codice nel modulo personalizzato?


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

Per favore, dimmi come aggiorno lo stato dell'ordine in Magento 2?

Risposte:


19

Puoi farlo come segue

dichiarare sotto lo spazio dei nomi

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

Spero che sia di aiuto


grazie per la risposta @Dhaval Drcsystems voglio aggiornare solo lo stato dell'ordine
Rahul Katoch

Puoi fare riferimento a questo modello in modo da avere un'idea migliore Magento \ Vendite \ Modello \ Ordine \ Pagamento Controlla qui come stanno elaborando l'ordine con il codice.
Dhaval Solanki,

il codice sopra mostra \ Magento \ Vendite \ Modello \ Ordine non trovato errore
Jaisa

Puoi per favore mostrarmi il tuo file?
Dhaval Solanki il

Come aggiornare lo stato dell'ordine personalizzato? Se ho uno stato chiamato "sent_to_print"?
jafar pinjar,

12

Aggiornamento dello stato dell'ordine

Per aggiornare lo stato e lo stato dell'ordine in modo programmatico al fine di definire lo stato e lo stato in questo formato. Avviare l'oggetto ordine nella funzione di costruzione e utilizzare l'oggetto ordine nella funzione personalizzata per aggiornarlo. Per aggiornare lo stato dell'ordine a livello di codice nel modello, ottenere l'oggetto ordine dalla funzione di costruzione.

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

Email nuovo ordine

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

grazie mille per la risposta @calypso ma voglio aggiornare solo lo stato dell'ordine
Rahul Katoch

@Rahulocodewire È anche nei commenti.
Gelanivishal,

@ calypso, per favore, spiega dove ho inserito questo codice nel mio modulo
Rahul Katoch,

come faccio a mostrare lo stato in sospeso nel controller?
Rahul Katoch,

5

Poiché load () e save () ora sono obsoleti (perché :)

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

Ho usato OrderRepositoryInterface per caricare e salvare l'ordine:

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

Spero che sia d'aiuto


come aggiornare lo stato dell'ordine personalizzato?
jafar pinjar,

3

Grazie a @medmek e alla risposta @ prince-patel. Come domanda di @jafar-pinjar sullo stato dell'ordine personalizzato, le chiamate setState e setStatus possono accettare il codice di stato. Ad esempio, viene creato il codice di stato personalizzato "a pagamento". Per aggiornare lo stato / stato a un ordine:

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

Per aggiornare lo stato dell'ordine:

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

Spero che aiuti qualcuno là fuori.


1
ID incrementale è come # 3000001469-1, non 1234. 1234 è piuttosto ID ordine
Greck

Grazie per averlo segnalato @Greck. Aggiornato la risposta.
qgor,

2

Magento 2.2.2 Funziona solo nel modo seguente!

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

Ma l'unico problema che ho è che non aggiorna lo stato completo: inserisci qui la descrizione dell'immagine

Aggiorna solo nella griglia e quanto segue: inserisci qui la descrizione dell'immagine

Inoltre, non è possibile creare una nuova fattura, spedizione e nota di credito. Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.