Artikel auf Bestellung Magento 2 abrufen

9

Mein Ziel ist es, eine Bestellung an unser Backend-System zu senden, wenn eine Bestellung in unserer Magento 2-Instanz aufgegeben wird.

Der Code zum Senden des Bestellobjekts funktioniert. Meine Frage ist , was der optimale Ansatz ist abzurufen itemDaten (zB price, subtotal, total, sku, etc.).

Ich verwende Folgendes, um die Bestellung und die Artikel abzurufen.

$orderId = $this->_order->load($order);
$billing = $orderId->getBillingAddress();
$items = $orderId->getAllItems();
foreach ($items as $item) {
        $itemPrice = $item->getPrice();
        $itemSku = $item->getSku();
}

Ist das Durchlaufen $items, um Preis, SKU usw. zu erhalten, der beste Weg oder gibt es ein Magento2, das collection/methodich verwenden sollte?

Vielen Dank

user20719
quelle
Gibt print_r(orderId->getAllItems())alle Elemente aus?
CodeForGood

Antworten:

10
$order = $this->_objectManager->create('Magento\Sales\Model\Order')->load($orderId);
$orderItems = $order->getAllItems();

Sie haben es mit objectManager gemacht

Pratik
quelle
17
Die Verwendung des Objektmanagers wird in Mage 2
Slimshadddyyy am
Gibt print_r (orderId-> getAllItems ()) alle Elemente aus?
CodeForGood
23

Die richtige Methode zum Laden des Bestellobjekts (das die Artikelinformationen in sich trägt) erfolgt über Repository-Objekte.

Fügen Sie das Auftragsrepository in Ihren Konstruktor ein

protected $orderRepository;

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

und in der erforderlichen Methode verwenden als:

$order = $this->orderRepository->get($orderId);
foreach ($order->getAllItems() as $item) {
// var_dump($item->getData());
}

Weitere Informationen zu Repository-Objekten: http://alanstorm.com/magento_2_understanding_object_repositories

MagePsycho
quelle
1
für die korrekte Verwendung der Abhängigkeitsinjektion hochgestuft! Sollte als Antwort markiert worden sein.
Long MK Nguyễn
sollte verwenden $order->getAllVisibleItems()
HaFiz Umer
Es hängt von Ihrer Anforderung ab, ob Sie getAllVisibleItems()vsgetAllItems()
MagePsycho
Gibt print_r (($ order-> getAllItems ()) alle Elemente aus?
CodeForGood
10

unten i Code, der Ihnen hilft, Bestellartikel zu erhalten (ich habe in Block-Klasse aufgerufen)

<?php
namespace Sugarcode\Test\Block;

class Test extends \Magento\Framework\View\Element\Template
{
    protected $order;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Sales\Model\Order $order,
        array $data = []
    ) {
        $this->order = $order;
        parent::__construct($context, $data);
    }



    public function _prepareLayout()
    {
        return parent::_prepareLayout();
    }
    public function getOrderItems()
    {
        $order=$this->order->load(1);

        return $order->getItems();

    }
}

Wenn es funktioniert, akzeptiere die Antwort, die anderen hilft

Pradeep Kumar
quelle
Falls andere vorbeikommen und versuchen, dies zum Laufen zu bringen, dies aber nicht können, konnte ich die Bestellung nicht mit laden load(1). Aber ich konnte die Bestellinformationen zum Laden mit bekommen loadByIncrementId($orderId).
Kreise sechs
7

Wenn du benutzt

$order->getAllVisibleItems()

Anstatt

$order->getAllItems()

Sie erhalten bessere Ergebnisse


Weitere Erläuterungen:

Wenn Sie sich die Tabelle sales_order_item ansehen, werden Sie feststellen, dass es für jeden Artikel in der Bestellung zwei Zeilen gibt, eine mit nutzlosen Daten und die andere mit den Daten, die Sie wahrscheinlich benötigen würden. Wenn Sie getAllItems () verwenden, erhalten Sie diese beiden Zeilen, aber wenn Sie getAllVisibleItems () verwenden, erhalten Sie nur die Zeilen mit den nützlichen Daten. Ich hoffe das hilft dir!

Verkohlen
quelle
"Besser" wie? Das ist ein bisschen vage.
Mike
2
Wenn Sie sich die Tabelle sales_order_item ansehen, werden Sie feststellen, dass für jeden Artikel in der Bestellung zwei Zeilen vorhanden sind, eine mit nutzlosen Daten und die andere mit den Daten, die Sie wahrscheinlich benötigen würden . Wenn Sie getAllItems () verwenden, erhalten Sie diese beiden Zeilen, aber wenn Sie getAllVisibleItems () verwenden, erhalten Sie nur die Zeilen mit den nützlichen Daten. Ich hoffe das hilft dir!
Char
Gibt print_r (orderId-> getAllItems ()) alle Elemente aus?
CodeForGood