Order Magento 2でアイテムを取得する


9

私の目的は、Magento 2インスタンス内で注文が行われたときに注文をバックエンドシステムに送信することです。

注文オブジェクトを送信するコードが機能しています。私の質問は、取得する最適なアプローチは何かということですitemデータ(例えばpricesubtotaltotalsku、など)。

以下を使用して、注文とアイテムを取得しています。

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

$items価格、SKUなどを取得するために反復処理するのが最善の方法collection/methodですか、それともMagento2 を使用する必要がありますか?

ありがとう


print_r(orderId->getAllItems())出力のすべての項目を?
CodeForGood

回答:


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

あなたはそれをobjectManagerを使って行いました


17
オブジェクトマネージャーの使用は、Mage 2
Slimshadddyyy

print_r(orderId-> getAllItems())はすべてのアイテムを出力しますか?
CodeForGood

23

Orderオブジェクトをロードする正しい方法(それ自体がアイテム情報を運ぶ)は、Repositoryオブジェクトを使用する方法です。

コンストラクターに注文リポジトリーを挿入する

protected $orderRepository;

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

そして必要なメソッドで次のように使用します:

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

リポジトリオブジェクトの詳細については、http//alanstorm.com/magento_2_understanding_object_repositoriesをご覧ください。


1
依存性注入を使用する正しい方法に賛成です!答えとしてマークされている必要があります。
ロングMKグエン

使用する必要があります $order->getAllVisibleItems()
HaFiz Umer

これは、使用するかどうか、あなたの条件に依存getAllVisibleItems()VSgetAllItems()
MagePsycho

print_r(($ order-> getAllItems())はすべてのアイテムを出力しますか?
CodeForGood

10

注文アイテムを取得するのに役立つコードの下(私は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();

    }
}

それが機能する場合、他の人を助ける答えを受け入れます


他の人がやって来て、これを機能させようとしても機能しない場合は、を使用して注文を読み込めませんでしたload(1)。しかし、私はを使用してロードする注文情報を取得することができましたloadByIncrementId($orderId)
circlesix 2016

7

使用する場合

$order->getAllVisibleItems()

の代わりに

$order->getAllItems()

あなたはより良い結果を得るでしょう


詳細な説明:

sales_order_itemテーブルを見ると、注文の各アイテムに2つの行があり、1つは不要なデータを含み、もう1つはおそらく必要なデータを含むことがわかります。ええと、getAllItems()を使用するとこれらの2行が表示されますが、getAllVisibleItems()を使用すると、有用なデータを含む行のみが表示されます。これがお役に立てば幸いです。


「良い」方法は?それは少しあいまいです。
マイク

2
より具体的に申し訳ありませんが、sales_order_itemテーブルを見ると、注文の各アイテムに2つの行があり、1つは不要なデータを含み、もう1つはおそらく必要なデータを含むことがわかります。 。ええと、getAllItems()を使用するとこれらの2行が表示されますが、getAllVisibleItems()を使用すると、有用なデータを含む行のみが表示されます。これがお役に立てば幸いです。
Char

print_r(orderId-> getAllItems())はすべてのアイテムを出力しますか?
CodeForGood
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.