Magento2 Cara yang Benar untuk mendapatkan barang-barang Pemesanan

10

Saya sedang mengerjakan Perpanjangan Pembayaran M2, pedagang kami membutuhkan kami untuk mengirim detail barang bersama dengan pesanan

Semuanya berfungsi dengan baik tetapi $order->getAllItems();atau $order->getAllVisibleItems();mengembalikan produk induk yang sederhana dan dapat dikonfigurasi

jika saya memiliki 2 produk dalam Troli

  • 1 Produk Sederhana
  • 1 Terkait dengan produk yang dapat dikonfigurasi

jadi alih-alih mendapatkan dua produk, saya mendapatkan tiga; satu produk sederhana yang terkait dan produk induknya;

Saya dapat mencoba mengekstrak produk yang benar tetapi saya yakin pasti ada beberapa yang lain

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

Jawaban:

12

Inilah cara berbagai metode untuk mendapatkan item dari pesanan berfungsi:

  • getItems(): mengembalikan berbagai item dari koleksi item pesanan yang dimuat
  • getAllItems(): mengembalikan array semua item yang tidak ditandai sebagai terhapus
  • getAllVisibleItems(): mengembalikan array semua item yang tidak ditandai sebagai terhapus dan tidak memiliki item induk

Jadi untuk mendapatkan hanya produk yang dapat dikonfigurasi dan bukan produk terkait, getAllVisibleItems()adalah metode yang benar:

  • item tunggal sederhana tidak memiliki induk => terlihat
  • item yang dapat dikonfigurasi tidak memiliki induk => terlihat
  • item sederhana yang terkait memiliki induk => tidak terlihat

Perhatikan bahwa sayangnya, pada hanya getItems()merupakan bagian dari kontrak layanan diMagento\Sales\Api\Data\OrderInterface

Fabian Schmengler
sumber
Terima kasih, tetapi getAllVisibleitems () mengembalikan produk sederhana dan konfigurasi bersama sehingga tidak masuk akal jika gambar berikut dapat membantu imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar
Gambar terlihat benar. Atau ini yang Anda inginkan, bukan yang Anda miliki?
Fabian Schmengler
Seharusnya mengembalikan item dari kereta sehingga hanya dua produk sederhana satu dari konfigurasi dan lainnya seperti itu; Saya melakukan logika ini jika ($ productItem-> getProductType () == "simple" && ($ productItem-> getParentItem ())) {continue; } karena produk konfigurasi yang sederhana tidak mengembalikan harga
Sajid Unar
1
Ada perbedaan besar antara implementasi getAllVisibleItems di Magento 1 dan Magento 2. Sementara di M1 produk anak-anak (dari yang dapat dikonfigurasi, dibundel, dll) TIDAK ditampilkan, dalam M2 mereka. Meskipun implementasinya sama, $ item-> getParentItemId () akan mengembalikan null dalam M2 untuk item anak-anak. Apakah itu bug atau tidak, perilakunya bervariasi sesuai dengan versi Magento yang Anda gunakan.
Ricardo Martins
2

Cara terbaik untuk mendapatkan barang pesanan adalah menggunakan $order->getAllVisibleItems()

Dijelaskan oleh fschmengler di atas,

getAllItems(): Fungsi ini mengembalikan array semua item keranjang dengan produk konfigurasi yang sederhana juga.

Anda mendapatkan tiga produk karena Anda telah menggunakan $order->getAllItems() Anda harus menggunakan $order->getAllVisibleItems()metode untuk mendapatkan produk asli.

Anda dapat memeriksa lebih banyak referensi dari 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;
    }
Rakesh Jesadiya
sumber
Terima kasih atas balasan tetapi seperti yang saya jelaskan tidak berfungsi seperti yang diharapkan lihat gambar berikut keranjang Gambar imgur.com/8ADtnUQ dan men -debug gambar imgur.com/LnMMuOM
Sajid Unar
0

Anda dapat menggunakan Item loop dan mengecualikan item anak dengan kode berikut:

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