Magento2 Prawidłowy sposób na zdobycie przedmiotów z zamówienia

11

Pracuję nad rozszerzeniem płatności M2, aby nasz sprzedawca potrzebował nas, aby wraz z zamówieniem przesłać szczegóły produktu

Wszystko działa dobrze, ale $order->getAllItems();lub $order->getAllVisibleItems();zwracanie prostych i konfigurowalnych produktów nadrzędnych tak

jeśli mam 2 produkty w koszyku

  • 1 prosty produkt
  • 1 Powiązany z konfigurowalnym produktem

więc zamiast dostać dwa produkty, otrzymuję trzy; jeden prosty, powiązany produkt i jego produkt macierzysty;

Mogę spróbować wyodrębnić prawidłowe produkty, ale jestem pewien, że to musi być jakiś inny

    /** @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
źródło

Odpowiedzi:

13

Oto jak działają różne metody uzyskiwania przedmiotów z zamówienia:

  • getItems(): zwraca tablicę elementów z kolekcji ładowanych elementów zamówienia
  • getAllItems(): zwraca tablicę wszystkich elementów, które nie są oznaczone jako usunięte
  • getAllVisibleItems(): zwraca tablicę wszystkich elementów, które nie są oznaczone jako usunięte i nie mają elementu nadrzędnego

Tak więc, aby uzyskać tylko produkt konfigurowalny, a nie produkt powiązany, getAllVisibleItems()jest poprawna metoda:

  • pojedynczy prosty element nie ma elementu nadrzędnego => widoczny
  • element konfigurowalny nie ma elementu nadrzędnego => widoczny
  • powiązany element prosty ma element nadrzędny => niewidoczny

Pamiętaj, że niestety od dnia getItems()jest tylko częścią umowy o świadczenie usług wMagento\Sales\Api\Data\OrderInterface

Fabian Schmengler
źródło
Dzięki człowieku, ale getAllVisibleitems () zwraca razem produkty proste i konfiguracyjne, więc nie ma to sensu, jeśli poniższe zdjęcia mogą pomóc imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar
Obraz wygląda poprawnie. A może tego chcesz, a nie tego, co masz?
Fabian Schmengler,
Powinien zwrócić przedmioty z koszyka, więc tylko dwa proste produkty, jeden z konfiguracji, a drugi taki, jaki jest; Zrobiłem tę logikę, jeśli ($ productItem-> getProductType () == "simple" && ($ productItem-> getParentItem ())) {kontynuuj; } ponieważ prosty produkt config nie zwracał ceny
Sajid Unar
1
Istnieje ogromna różnica między implementacją getAllVisibleItems w Magento 1 i Magento 2. Podczas gdy w M1 produkty potomne (konfigurowalne, pakietowe itp.) NIE są wyświetlane, w M2 są. Chociaż implementacja jest taka sama, $ item-> getParentItemId () zwróci null w M2 dla elementów potomnych. Niezależnie od tego, czy jest to błąd, czy nie, jego zachowanie różni się w zależności od używanej wersji Magento.
Ricardo Martins
3

Najlepszym sposobem na zdobycie przedmiotów zamówienia jest użycie $order->getAllVisibleItems()

Wyjaśniony przez fschmenglera powyżej,

getAllItems(): Ta funkcja zwraca tablicę wszystkich pozycji koszyka z produktem config simple.

Otrzymujesz trzy produkty, ponieważ używasz $order->getAllItems() , musisz użyć $order->getAllVisibleItems()metody, aby uzyskać oryginalny produkt.

Możesz sprawdzić więcej referencji z pliku 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
źródło
Dzięki za odpowiedź, ale jak wyjaśnię, nie działa zgodnie z oczekiwaniami, zobacz następujące obrazy koszyk Obraz imgur.com/8ADtnUQ i obraz debugujący imgur.com/LnMMuOM
Sajid Unar
0

możesz użyć pętli elementu i wykluczyć element potomny za pomocą następującego kodu:

/** @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
źródło