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()เป็นวิธีที่ถูกต้อง:

  • ไอเท็มแบบง่ายเดียวไม่มี parent => ที่มองเห็นได้
  • รายการที่กำหนดค่าได้นั้นไม่มี parent => มองเห็นได้
  • รายการแบบง่ายที่เกี่ยวข้องมี parent => ไม่ปรากฏ

ทราบว่าน่าเสียดายที่ ณ getItems()เป็นเพียงส่วนหนึ่งของสัญญาบริการในMagento\Sales\Api\Data\OrderInterface


ขอบคุณผู้ชาย แต่ getAllVisibleitems () ส่งคืนผลิตภัณฑ์ที่เรียบง่ายและกำหนดค่าร่วมกันดังนั้นจึงไม่สมเหตุสมผลถ้ารูปภาพต่อไปนี้สามารถช่วย imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

ภาพดูถูกต้อง หรือนี่คือสิ่งที่คุณต้องการไม่ใช่สิ่งที่คุณมี?
เฟเบียน Schmengler

มันควรจะคืนสินค้าจากรถเข็นดังนั้นเพียงสองผลิตภัณฑ์ง่าย ๆ จาก config และอีกอย่างที่มันเป็น; ฉันทำตามตรรกะนี้ถ้า ($ productItem-> getProductType () == "ง่าย" && ($ productItem-> getParentItem ()) {ดำเนินการต่อ; } เนื่องจากผลิตภัณฑ์ที่เรียบง่ายของการกำหนดค่าไม่ได้ส่งคืนราคา
Sajid Unar

1
มีความแตกต่างอย่างมากระหว่างการใช้งาน getAllVisibleItems ใน Magento 1 และ Magento 2 ในขณะที่ผลิตภัณฑ์ M1 สำหรับเด็ก (ที่กำหนดค่าได้, รวมเป็นกลุ่ม ฯลฯ ) จะไม่แสดงขึ้นมาใน M2 แม้ว่าการนำไปใช้จะเหมือนกัน $ item-> getParentItemId () จะส่งคืนค่าว่างใน M2 สำหรับรายการลูก ไม่ว่าจะเป็นข้อบกพร่องหรือไม่พฤติกรรมของรุ่นนั้นจะแตกต่างกันไปตามเวอร์ชั่นวีโอไอพีที่คุณใช้งาน
Ricardo Martins

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;
    }

ขอบคุณสำหรับการตอบกลับ แต่เนื่องจากฉันอธิบายว่ามันใช้งานไม่ได้ตามที่คาดหวังโปรดดูรูปภาพรถเข็นรูปภาพ imgur.com/8ADtnUQและแก้จุดบกพร่องภาพimgur.com/LnMMuOM
Sajid Unar

0

คุณสามารถใช้ Item Loop และแยกไอเท็มชายด์โดยใช้รหัสต่อไปนี้:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.