Magento2 Correct Way pour obtenir des articles de commande

10

Je travaille sur l'extension de paiement M2, notre marchand a besoin de nous pour envoyer les détails des articles avec la commande

Tout fonctionne bien mais $order->getAllItems();ou $order->getAllVisibleItems();renvoyer des produits parents simples et configurables afin

si j'ai 2 produits dans le panier

  • 1 produit simple
  • 1 Associé de produit configurable

donc au lieu d'obtenir deux produits, j'en reçois trois; un produit simple et associé et son produit parent;

Je peux essayer d'extraire les produits corrects mais je suis sûr que ce doit être un autre

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

Réponses:

12

Voici comment fonctionnent les différentes méthodes pour obtenir des articles d'une commande:

  • getItems(): renvoie un tableau d'articles de la collection d'articles de la commande chargée
  • getAllItems(): renvoie un tableau de tous les éléments qui ne sont pas marqués comme supprimés
  • getAllVisibleItems(): renvoie un tableau de tous les éléments qui ne sont pas marqués comme supprimés et qui n'ont pas d'élément parent

Donc, pour obtenir uniquement le produit configurable et non son produit associé, getAllVisibleItems()c'est la bonne méthode:

  • l'élément simple simple n'a pas de parent => visible
  • l'élément configurable n'a pas de parent => visible
  • l'élément simple associé a un parent => non visible

Notez que malheureusement, à partir de seule une getItems()partie du contrat de serviceMagento\Sales\Api\Data\OrderInterface

Fabian Schmengler
la source
Merci l'homme mais getAllVisibleitems () renvoyant des produits simples et de configuration ensemble, donc cela n'a pas de sens si les images suivantes peuvent aider imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar
L'image semble correcte. Ou est-ce ce que vous voulez, pas ce que vous avez?
Fabian Schmengler
Il devrait avoir renvoyé les articles du panier, donc seulement deux produits simples, l'un de config et l'autre tel quel; J'ai fait cette logique si ($ productItem-> getProductType () == "simple" && ($ productItem-> getParentItem ())) {continue; } puisque le simple produit de config ne retournait pas le prix
Sajid Unar
1
Il y a une énorme différence entre l'implémentation de getAllVisibleItems dans Magento 1 et Magento 2. Alors que dans M1, les produits enfants (configurables, groupés, etc.) ne sont PAS affichés, en M2, ils le sont. Bien que l'implémentation soit la même, $ item-> getParentItemId () retournera null en M2 pour les éléments enfants. Qu'il s'agisse d'un bogue ou non, son comportement varie en fonction de la version de Magento que vous utilisez.
Ricardo Martins
2

La meilleure façon d'obtenir des articles de commande est d'utiliser $order->getAllVisibleItems()

Expliqué par fschmengler ci-dessus,

getAllItems(): Cette fonction renvoie également un tableau de tous les articles du panier avec un produit simple de configuration.

Vous obtenez trois produits parce que vous l'utilisez, $order->getAllItems() vous devez utiliser la $order->getAllVisibleItems()méthode pour obtenir le produit original.

Vous pouvez vérifier plus de référence à partir du fichier 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
la source
Merci pour la réponse, mais comme je l'explique, cela ne fonctionne pas comme prévu, voir le panier d'images suivant Image imgur.com/8ADtnUQ et image de débogage imgur.com/LnMMuOM
Sajid Unar
0

vous pouvez utiliser la boucle d'élément et exclure l'élément enfant par le code suivant:

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