Magento2 Richtiger Weg, um Bestellartikel zu erhalten

10

Ich arbeite an der M2-Zahlungserweiterung. Unser Händler benötigt uns, um Artikeldetails zusammen mit der Bestellung zu senden

Alles funktioniert gut, aber $order->getAllItems();oder $order->getAllVisibleItems();einfache und konfigurierbare übergeordnete Produkte zurückgeben

wenn ich 2 Produkte im Warenkorb habe

  • 1 einfaches Produkt
  • 1 Zugehöriges konfigurierbares Produkt

Anstatt zwei Produkte zu bekommen, bekomme ich drei. ein einfaches, assoziiertes Produkt und sein Mutterprodukt;

Ich kann versuchen, korrekte Produkte zu extrahieren, aber ich bin sicher, dass es ein anderes sein muss

    /** @var \Magento\Sales\Model\Order $order */
    $order = $payment->getOrder();
    /**
     * Get All Items of Products
     */
    $productItems = $order->getAllItems() // returning 3 products where I have 2 in cart 
    $productItemsTest = $order->getAllVisibleItems(); // returning 3 products where I have 2 in cart 
Sajid Unar
quelle

Antworten:

12

So funktionieren die verschiedenen Methoden zum Abrufen von Artikeln aus einer Bestellung:

  • getItems(): Gibt ein Array von Artikeln aus der Sammlung geladener Bestellartikel zurück
  • getAllItems(): Gibt ein Array aller Elemente zurück, die nicht als gelöscht markiert sind
  • getAllVisibleItems(): Gibt ein Array aller Elemente zurück, die nicht als gelöscht markiert sind und kein übergeordnetes Element haben

Um also nur das konfigurierbare Produkt und nicht das zugehörige Produkt zu erhalten, getAllVisibleItems() ist also die richtige Methode :

  • Das einzelne einfache Element hat kein übergeordnetes Element => sichtbar
  • Für das konfigurierbare Element ist kein übergeordnetes Element => sichtbar
  • Das zugehörige einfache Element hat ein übergeordnetes Element => nicht sichtbar

Beachten Sie, dass ab leider nur getItems()noch Teil des Servicevertrags inMagento\Sales\Api\Data\OrderInterface

Fabian Schmengler
quelle
Vielen Dank, Mann, aber getAllVisibleitems () gibt einfache und konfigurierte Produkte zusammen zurück, so dass es keinen Sinn macht, wenn folgende Bilder helfen können. Imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar
Das Bild sieht korrekt aus. Oder ist es das, was du willst, nicht das, was du hast?
Fabian Schmengler
Es sollte die Artikel aus dem Warenkorb zurückgegeben haben, also nur zwei einfache Produkte, eines aus der Konfiguration und eines wie es ist; Ich habe diese Logik gemacht, wenn ($ productItem-> getProductType () == "simple" && ($ productItem-> getParentItem ())) {continue; } da einfaches Produkt der Konfiguration nicht Preis zurückgab
Sajid Unar
1
Es gibt einen großen Unterschied zwischen der Implementierung von getAllVisibleItems in Magento 1 und Magento 2. Während in M1 untergeordnete Produkte (konfigurierbar, gebündelt usw.) NICHT angezeigt werden, werden sie in M2 angezeigt. Obwohl die Implementierung dieselbe ist, gibt $ item-> getParentItemId () in M2 für untergeordnete Elemente null zurück. Unabhängig davon, ob es sich um einen Fehler handelt oder nicht, hängt das Verhalten von der verwendeten Magento-Version ab.
Ricardo Martins
2

Der beste Weg, um Bestellartikel zu erhalten, ist die Verwendung $order->getAllVisibleItems()

Erklärt von fschmengler oben,

getAllItems(): Diese Funktion gibt auch ein Array aller Warenkorbartikel mit dem einfachen Produkt config zurück.

Sie erhalten drei Produkte, weil Sie verwenden $order->getAllItems() müssen$order->getAllVisibleItems() Methode verwenden, um das Originalprodukt zu erhalten.

Sie können weitere Referenzen aus der Datei überprüfen vendor/magento/module-quote/Model/Quote.php

/**
     * Retrieve quote items array
     *
     * @return array
     */
    public function getAllItems()
    {
        $items = [];
        foreach ($this->getItemsCollection() as $item) {
            /** @var \Magento\Quote\Model\ResourceModel\Quote\Item $item */
            if (!$item->isDeleted()) {
                $items[] = $item;
            }
        }
        return $items;
    }

    /**
     * Get array of all items what can be display directly
     *
     * @return \Magento\Quote\Model\Quote\Item[]
     */
    public function getAllVisibleItems()
    {
        $items = [];
        foreach ($this->getItemsCollection() as $item) {
            //echo $item->getId()."<br>";
            if (!$item->isDeleted() && !$item->getParentItemId()) {
                $items[] = $item;
            }
        }
        return $items;
    }
Rakesh Jesadiya
quelle
Vielen Dank für die Antwort, aber wie ich erkläre, funktioniert es nicht wie erwartet. Siehe folgenden Bildkorb Image imgur.com/8ADtnUQ und Debugging von image imgur.com/LnMMuOM
Sajid Unar
0

Sie können die Item-Schleife verwenden und das untergeordnete Item durch den folgenden Code ausschließen:

/** @var \Magento\Sales\Model\Order $order */
$order = $payment->getOrder();

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
Dinesh Kumar
quelle