Lấy vật phẩm trên Order Magento 2


9

Mục tiêu của tôi là gửi một đơn đặt hàng đến hệ thống phụ trợ của chúng tôi khi một đơn hàng được đặt trong phiên bản Magento 2 của chúng tôi.

Mã để gửi đối tượng đặt hàng đang làm việc. Câu hỏi của tôi là phương pháp tối ưu để lấy được những gì itemdữ liệu (ví dụ như price, subtotal, total, sku, vv).

Tôi đang sử dụng những điều sau đây để lấy lại đơn hàng và vật phẩm.

$orderId = $this->_order->load($order);
$billing = $orderId->getBillingAddress();
$items = $orderId->getAllItems();
foreach ($items as $item) {
        $itemPrice = $item->getPrice();
        $itemSku = $item->getSku();
}

Là lặp đi lặp lại $itemsđể có được giá, sku, vv cách tốt nhất hoặc có Magento2 collection/methodtôi nên sử dụng?

Cảm ơn


print_r(orderId->getAllItems())đầu ra tất cả các mặt hàng?
CodeForood

Câu trả lời:


10
$order = $this->_objectManager->create('Magento\Sales\Model\Order')->load($orderId);
$orderItems = $order->getAllItems();

Bạn đã thực hiện nó bằng objectManager


17
Việc sử dụng trình quản lý đối tượng không được khuyến khích trong Mage 2
Slimshadddyyy

Print_r (orderId-> getAllItems ()) có xuất ra tất cả các mục không?
CodeForood

23

Cách chính xác để tải đối tượng Order (sẽ tự mang thông tin vật phẩm) là thông qua các đối tượng Kho lưu trữ.

Tiêm kho lưu trữ đơn hàng trong hàm tạo của bạn

protected $orderRepository;

public function __construct(
    ...
    \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
    ....
) {
    ....
    $this->orderRepository = $orderRepository;
    ....
}

và sử dụng trong phương pháp cần thiết như:

$order = $this->orderRepository->get($orderId);
foreach ($order->getAllItems() as $item) {
// var_dump($item->getData());
}

Để biết thêm về Đối tượng Kho lưu trữ: http://alanstorm.com/magento_2_under Hiểu_object_Vpose khu vực


1
nâng cao cho cách sử dụng chính xác tiêm phụ thuộc! Nên đã được đánh dấu là câu trả lời.
Long MK Nguyễn

nên sử dụng $order->getAllVisibleItems()
HaFiz Umer

Nó phụ thuộc vào yêu cầu của bạn, có nên sử dụng getAllVisibleItems()vsgetAllItems()
MagePologistso

Print_r (($ order-> getAllItems ()) có xuất ra tất cả các mục không?
CodeForood

10

bên dưới mã tôi sẽ giúp bạn có được các mục đặt hàng (tôi đã gọi trong lớp Block)

<?php
namespace Sugarcode\Test\Block;

class Test extends \Magento\Framework\View\Element\Template
{
    protected $order;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Sales\Model\Order $order,
        array $data = []
    ) {
        $this->order = $order;
        parent::__construct($context, $data);
    }



    public function _prepareLayout()
    {
        return parent::_prepareLayout();
    }
    public function getOrderItems()
    {
        $order=$this->order->load(1);

        return $order->getItems();

    }
}

nếu nó hoạt động chấp nhận câu trả lời sẽ giúp người khác


Trong trường hợp những người khác đến và thử và làm cho nó hoạt động nhưng không thể, tôi không thể tải đơn hàng bằng cách sử dụng load(1). Nhưng tôi đã có thể lấy thông tin đặt hàng để tải bằng cách sử dụng loadByIncrementId($orderId).
circleix

7

Nếu bạn dùng

$order->getAllVisibleItems()

Thay vì

$order->getAllItems()

Bạn sẽ nhận được kết quả tốt hơn


Giải thích thêm:

Nếu bạn xem bảng sales_order_item, bạn sẽ thấy rằng có hai hàng cho mỗi mục theo thứ tự, một trong số chúng có dữ liệu vô dụng và một hàng khác có dữ liệu mà bạn có thể cần. Chà, nếu bạn sử dụng getAllItems () bạn sẽ nhận được hai dòng đó, nhưng nếu bạn sử dụng getAllVisibleItems () bạn sẽ chỉ nhận được các hàng có dữ liệu hữu ích. Tôi hy vọng điều này sẽ giúp bạn!


"Tốt hơn" thế nào? Điều đó hơi mơ hồ.
Mike

2
Xin lỗi vì không cụ thể hơn, nếu bạn xem bảng sales_order_item bạn sẽ thấy rằng có hai hàng cho mỗi mục theo thứ tự, một trong số chúng có dữ liệu vô dụng và một hàng khác có dữ liệu mà bạn có thể cần . Chà, nếu bạn sử dụng getAllItems () bạn sẽ nhận được hai dòng đó, nhưng nếu bạn sử dụng getAllVisibleItems () bạn sẽ chỉ nhận được các hàng có dữ liệu hữu ích. Tôi hy vọng điều này sẽ giúp bạn!
Char

Print_r (orderId-> getAllItems ()) có xuất ra tất cả các mục không?
CodeForood
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.