Як створити відправлення в Magento 2 програмно?

Процес обробки замовлень в Magento 2 складається з численних кроків. Одним із останніх є створення відправлення (shipment). Це доволі просте завдання, проте важливо знати як впоратися з ним якнайшвидше.

З одного боку, ви можете створити відправлення через адмін панель. З цим методом можна легко впоратися, не витрачаючи багато часу. З іншого боку, ви можете надавати перевагу альтернативі — створенню відправлення в Magento програмно. І у цій статті ви більше про це дізнаєтеся. 

Створення відправлення через dependency injection

Це один із найбільш поширених шляхів створення відправлення. Отож, для того, щоб створити відправлення в Magento 2 програмно за допомогою dependency injection, використайте такий код:

<?php

namespace Vendor\ModuleName;
class ClassName
{
    public $orderRepository;
    public $convertOrder;
    public $shipmentNotifier;
    public function __construct(
        \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
    ) {
        $this->productRepository = $productRepository;
    }
    public function createShipmentForOrder($orderId)
    {
        $order = $this->orderRepository->get($orderId);
        if (!$order->canShip()) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __("You can't create the Shipment of this order.")
            );
        }
        $orderShipment = $this->convertOrder->toShipment($order);
        foreach ($order->getAllItems() as $orderItem) {
            // Check virtual item and item Quantity
            if (!$orderItem->getQtyToShip() || $orderItem->getIsVirtual()) {
                continue;
            }
            $qty = $orderItem->getQtyToShip();
            $shipmentItem = $this->convertOrder->itemToShipmentItem($orderItem)->setQty($qty);
            $orderShipment->addItem($shipmentItem);
        }
        $orderShipment->register();
        $orderShipment->getOrder()->setIsInProcess(true);
        // Save created Order Shipment
        $orderShipment->save();
        $orderShipment->getOrder()->save();
        $this->shipmentNotifier->notify($orderShipment);
    }
}

Створення відправлення через object manager

Попри те, що це широко відомий спосіб виконання завдань, пов'язаних з Magento, працювати з ним потрібно обережно, оскільки він приховує справжні залежності класу. 

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get(Magento\Framework\App\State::class);
$state->setAreaCode('adminhtml');
$orderRepository = $objectManager->create(\Magento\Sales\Api\OrderRepositoryInterface::class);
$convertOrder = $objectManager->create(\Magento\Sales\Model\Convert\Order::class);
$shipmentNotifier = $objectManager->create(\Magento\Shipping\Model\ShipmentNotifier::class);
$orderId = 26;
$order = $orderRepository->get($orderId);
if (!$order->canShip()) {
   throw new \Magento\Framework\Exception\LocalizedException(
       __("You can't create the Shipment of this order.")
   );
}
$orderShipment = $convertOrder->toShipment($order);
foreach ($order->getAllItems() as $orderItem) {
   // Check virtual item and item Quantity
   if (!$orderItem->getQtyToShip() || $orderItem->getIsVirtual()) {
       continue;
   }
   $qty = $orderItem->getQtyToShip();
   $shipmentItem = $convertOrder->itemToShipmentItem($orderItem)->setQty($qty);
   $orderShipment->addItem($shipmentItem);
}
$orderShipment->register();
$orderShipment->getOrder()->setIsInProcess(true);
// Save created Order Shipment
$orderShipment->save();
$orderShipment->getOrder()->save();
// Send Shipment Email
$shipmentNotifier->notify($orderShipment);

Ось так ви можете створити відправлення в Magento 2 програмно. Не так вже й складно, чи не так? Якщо ви надаєте перевагу виконанню пов'язаних з Magento завдань за допомогою кодування, тоді обов'язково спробуйте ці рішення.

Проте може статися так, що покупці захочуть скасувати відправлення, попри те, що ви його вже створили. Тому буде корисно дізнатися як скасувати відправлення в Magento 2, щоб уникнути будь-яких перешкод під час обробки замовлень.