Magento2 Maneira Correta de Obter Itens do Pedido

10

Estou trabalhando na extensão de pagamento M2, nosso comerciante precisa de nós para enviar detalhes dos itens junto com o pedido

Tudo funciona bem, mas $order->getAllItems();ou $order->getAllVisibleItems();retornando produtos pai simples e configuráveis, para

se eu tiver 2 produtos no carrinho

  • 1 Produto Simples
  • 1 Associado ao produto configurável

então, ao invés de obter dois produtos, estou recebendo três; um produto simples e associado e seu produto pai;

Posso tentar extrair produtos corretos, mas tenho certeza de que deve haver outra

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

Respostas:

12

É assim que os diferentes métodos para obter itens de um pedido funcionam:

  • getItems(): retorna a matriz de itens da coleção de itens de pedidos carregados
  • getAllItems(): retorna a matriz de todos os itens que não estão marcados como excluídos
  • getAllVisibleItems(): retorna a matriz de todos os itens que não estão marcados como excluídos e não têm um item pai

Portanto, para obter apenas o produto configurável e não o produto associado, getAllVisibleItems()é o método correto:

  • o único item simples não possui um pai => visível
  • o item configurável não possui um pai => visível
  • o item simples associado possui um pai => não visível

Observe que, infelizmente, a partir do apenas getItems()faz parte do contrato de serviço noMagento\Sales\Api\Data\OrderInterface

Fabian Schmengler
fonte
Graças homem, mas getAllVisibleitems () retornando simples e de configuração produtos em conjunto de modo que não fazer sentido i se imagens a seguir podem ajudar imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar
A imagem parece correta. Ou é isso que você quer, não o que você tem?
Fabian Schmengler
Ele deve devolver os itens do carrinho, para apenas dois produtos simples, um da configuração e outro como ele é; Eu fiz essa lógica se ($ productItem-> getProductType () == "simples" && ($ productItem-> getParentItem ())) {continue; } Desde simples produto de configuração não estava retornando preço
Sajid Unar
11
Há uma enorme diferença entre a implementação de getAllVisibleItems no Magento 1 e Magento 2. Enquanto no M1 produtos filhos (configuráveis, empacotados etc.) NÃO são exibidos, no M2 eles são. Embora a implementação seja a mesma, $ item-> getParentItemId () retornará nulo em M2 para itens filhos. Seja um bug ou não, seu comportamento varia de acordo com a versão do Magento que você está usando.
Ricardo Martins
2

A melhor maneira de obter itens de pedidos é usando $order->getAllVisibleItems()

Explicado por fschmengler acima,

getAllItems(): Esta função retorna a matriz de todos os itens do carrinho com o produto simples de configuração também.

Você obtém três produtos porque usa, $order->getAllItems() tem que usar o $order->getAllVisibleItems()método para obter o produto original.

Você pode verificar mais referências do arquivo 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
fonte
Obrigado pela resposta, mas como eu explicar a sua não funciona como esperado ver imagens seguintes carrinho Imagem imgur.com/8ADtnUQ e depuração imagem imgur.com/LnMMuOM
Sajid Unar
0

você pode usar o loop Item e excluir o item filho pelo seguinte código:

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