Magento2 Правильний спосіб отримання товарів для замовлення


11

Я працюю над розширенням платежів M2, нам потрібен наш торговець, щоб надіслати деталі деталей разом із замовленням

Все працює відмінно , але $order->getAllItems();і $order->getAllVisibleItems();повертається прості і конфігуруються батьківські продукти , так

якщо у мене в кошику є 2 продукти

  • 1 Простий продукт
  • 1 Пов'язаний з настроюваним продуктом

тож замість отримання двох продуктів я отримую три; один простий асоційований продукт та його материнський продукт;

Я можу спробувати витягти правильні продукти, але я впевнений, що це повинен бути якийсь інший

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

Відповіді:


13

Ось як працюють різні способи отримання предметів із замовлення:

  • getItems(): повертає масив елементів із завантаженої колекції предметів замовлення
  • getAllItems(): повертає масив усіх елементів, які не позначені як видалені
  • getAllVisibleItems(): повертає масив усіх елементів, які не позначені як видалені та не мають батьківського елемента

Отже, щоб отримати тільки продукт, що може настроюватися, а не його асоційований продукт, getAllVisibleItems()є правильним методом:

  • єдиний простий елемент не має батьківського виду =>
  • елемент, який може налаштовуватися, не має видно батьків =>
  • асоційований простий елемент має батько => не видно

Зауважте, що, на жаль, станом на тільки getItems()є частиною договору на обслуговування в РосіїMagento\Sales\Api\Data\OrderInterface


Спасибі людина, але getAllVisibleitems () повертає прості та конфігурують продукти разом, так що це не має сенсу, якщо наступні зображення можуть допомогти imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

Зображення виглядає правильно. Або це те, що ти хочеш, а не те, що маєш?
Фабіан Шменглер

Він повинен мати повернути товари з кошика, тож два простих продукти, один із конфігурації та інший, як є; Я зробив цю логіку, якщо ($ productItem-> getProductType () == "простий" && ($ productItem-> getParentItem ())) {продовжити; } оскільки простий продукт конфігурації не повертав ціну
Садід Унар

1
Існує величезна різниця між реалізацією getAllVisibleItems в Magento 1 та Magento 2. У той час як у дітей M1 продукти (налаштовані, в комплекті тощо) НЕ відображаються, у M2 вони є. Хоча реалізація однакова, $ item-> getParentItemId () поверне null в M2 для дітей елементів. Будь-яка помилка чи ні, її поведінка залежить від версії Magento, яку ви використовуєте.
Рікардо Мартінс

3

Найкращий спосіб отримати товари для замовлення $order->getAllVisibleItems()

Пояснив fschmengler вище,

getAllItems(): Ця функція також повертає масив усіх предметів кошика з конфігурацією простого продукту.

Ви отримуєте три продукти, тому що у вас є використання, $order->getAllItems() ви повинні використовувати $order->getAllVisibleItems()метод, щоб отримати оригінальний продукт.

Ви можете перевірити більше посилання з файлу 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;
    }

Дякуємо за відповідь, але, як я пояснюю, вона не працює, як очікувалося, дивіться наступні зображення в кошику Image imgur.com/8ADtnUQ та налагоджувальне зображення imgur.com/LnMMuOM
Sajid Unar

0

ви можете використовувати цикл Item і виключити дочірній елемент за допомогою наступного коду:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.