Magento2 Modo corretto per ottenere gli articoli dell'ordine


11

Sto lavorando su M2 Payment Extension il nostro commerciante ha bisogno di noi per inviare i dettagli degli articoli insieme all'ordine

Tutto funziona bene ma $order->getAllItems();o $order->getAllVisibleItems();restituendo prodotti genitori semplici e configurabili così

se ho 2 prodotti nel carrello

  • 1 prodotto semplice
  • 1 Associato al prodotto configurabile

quindi invece di ottenere due prodotti ne ottengo tre; un prodotto semplice associato e il suo prodotto principale;

Posso provare a estrarre i prodotti corretti ma sono sicuro che deve essere un altro

    /** @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 

Risposte:


13

Ecco come funzionano i diversi metodi per ottenere articoli da un ordine:

  • getItems(): restituisce un array di articoli dalla raccolta degli articoli dell'ordine caricati
  • getAllItems(): restituisce un array di tutti gli elementi che non sono contrassegnati come eliminati
  • getAllVisibleItems(): restituisce un array di tutti gli elementi che non sono contrassegnati come eliminati e non hanno un elemento padre

Quindi, per ottenere solo il prodotto configurabile e non il prodotto associato, getAllVisibleItems()è il metodo corretto:

  • il singolo elemento semplice non ha un parent => visibile
  • l'elemento configurabile non ha un parent => visibile
  • l'elemento semplice associato ha un parent => non visibile

Si noti che, purtroppo, come di solo getItems()fa parte del contratto di servizio inMagento\Sales\Api\Data\OrderInterface


Grazie amico ma getAllVisibleitems () che restituisce prodotti semplici e di configurazione insieme, quindi non ha senso se le seguenti immagini possono aiutare imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

L'immagine sembra corretta. O è questo quello che vuoi, non quello che hai?
Fabian Schmengler,

Dovrebbe aver restituito gli articoli dal carrello, quindi solo due semplici prodotti uno da Config e l'altro così com'è; Ho fatto questa logica se ($ productItem-> getProductType () == "simple" && ($ productItem-> getParentItem ())) {continue; } poiché il semplice prodotto di configurazione non stava restituendo il prezzo
Sajid Unar

1
C'è una grande differenza tra l'implementazione di getAllVisibleItems in Magento 1 e Magento 2. Mentre in M1 i prodotti per bambini (configurabili, raggruppati, ecc.) NON sono visualizzati, in M2 lo sono. Sebbene l'implementazione sia la stessa, $ item-> getParentItemId () restituirà null in M2 per gli elementi figlio. Che si tratti di un bug o meno, il suo comportamento varia in base alla versione di Magento che stai utilizzando.
Ricardo Martins,

3

Il modo migliore per ottenere gli articoli dell'ordine sta usando $order->getAllVisibleItems()

Spiegato da fschmengler sopra,

getAllItems(): Questa funzione restituisce un array di tutti gli articoli del carrello con la configurazione del prodotto semplice.

Ottieni tre prodotti perché hai usato $order->getAllItems() devi usare il $order->getAllVisibleItems()metodo per ottenere il prodotto originale.

Puoi controllare più riferimenti dal file 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;
    }

Grazie per la risposta, ma come spiego non funziona come previsto, vedere le seguenti immagini carrello Immagine imgur.com/8ADtnUQ e immagine di debug imgur.com/LnMMuOM
Sajid Unar

0

è possibile utilizzare il ciclo Item ed escludere l'elemento figlio con il seguente codice:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.