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


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


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


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


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!


"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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.