Magento2 Đúng cách để có được các mục đặt hàng


10

Tôi đang làm việc với Gia hạn thanh toán M2, người bán của chúng tôi cần chúng tôi gửi chi tiết mặt hàng cùng với đơn hàng

Tất cả mọi thứ hoạt động tốt nhưng $order->getAllItems();hoặc $order->getAllVisibleItems();trả lại các sản phẩm cha mẹ đơn giản và cấu hình để

nếu tôi có 2 sản phẩm trong giỏ hàng

  • 1 sản phẩm đơn giản
  • 1 Liên kết của sản phẩm cấu hình

Vì vậy, thay vì nhận được hai sản phẩm, tôi nhận được ba sản phẩm; một sản phẩm đơn giản, liên quan và sản phẩm mẹ của nó;

Tôi có thể thử trích xuất các sản phẩm chính xác nhưng tôi chắc chắn đó phải là một số sản phẩm khác

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

Câu trả lời:


12

Đây là cách các phương thức khác nhau để có được các mục từ một đơn đặt hàng hoạt động:

  • getItems(): trả về mảng các mục từ bộ sưu tập mục đơn hàng đã tải
  • getAllItems(): trả về mảng của tất cả các mục không được đánh dấu là đã xóa
  • getAllVisibleItems(): trả về mảng của tất cả các mục không được đánh dấu là đã xóa và không có mục cha

Vì vậy, để chỉ nhận được sản phẩm có thể định cấu hình và không phải sản phẩm được liên kết, getAllVisibleItems()là phương pháp chính xác:

  • mục đơn giản không có cha mẹ => hiển thị
  • mục có thể định cấu hình không có cha mẹ => hiển thị
  • mục đơn giản được liên kết có cha mẹ => không hiển thị

Lưu ý rằng thật không may, kể từ chỉ getItems()là một phần của hợp đồng dịch vụ trongMagento\Sales\Api\Data\OrderInterface


Cảm ơn người đàn ông nhưng getAllVisibleitems () trả lại các sản phẩm đơn giản và cấu hình cùng nhau để không có ý nghĩa gì nếu những hình ảnh sau đây có thể giúp imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

Hình ảnh có vẻ chính xác. Hay đây là những gì bạn muốn, không phải những gì bạn có?
Fabian Schmengler

Nó nên trả lại các mục từ giỏ hàng để chỉ hai sản phẩm đơn giản là một từ cấu hình và một sản phẩm khác; Tôi đã thực hiện logic này nếu ($ productItem-> get SẢNtType () == "đơn giản" && ($ productItem-> getParentItem ())) {continue; } vì sản phẩm đơn giản của cấu hình không trả lại giá
Sajid Unar

1
Có một sự khác biệt rất lớn giữa việc triển khai getAllVisibleItems trong Magento 1 và Magento 2. Trong khi ở các sản phẩm trẻ em M1 (có thể cấu hình, đóng gói, v.v.) thì KHÔNG được hiển thị, trong M2 chúng là. Mặc dù việc triển khai là như nhau, $ item-> getParentItemId () sẽ trả về null trong M2 cho các mục con. Cho dù đó có phải là lỗi hay không, hành vi của nó sẽ thay đổi tùy theo phiên bản Magento bạn đang sử dụng.
Ricardo Martins

2

Cách tốt nhất để có được các mục đặt hàng là sử dụng $order->getAllVisibleItems()

Giải thích bởi fschmengler ở trên,

getAllItems(): Hàm này trả về mảng của tất cả các mục của giỏ hàng với cấu hình sản phẩm đơn giản.

Bạn nhận được ba sản phẩm vì bạn đã sử dụng, $order->getAllItems() bạn phải sử dụng $order->getAllVisibleItems()phương pháp để có được sản phẩm gốc.

Bạn có thể kiểm tra thêm tài liệu tham khảo từ tập tin 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;
    }

Cảm ơn bạn đã trả lời nhưng vì tôi giải thích nó không hoạt động như mong đợi, hãy xem hình ảnh sau đây giỏ hàng Image imgur.com/8ADtnUQ và gỡ lỗi hình ảnh imgur.com/LnMMuOM
Sajid Unar

0

bạn có thể sử dụng vòng lặp Item và loại trừ mục con theo mã sau:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.