Magento2の正しい注文方法


10

私は私たちの商人が注文と一緒にアイテムの詳細を送信する必要があるM2支払い拡張に取り組んでいます

すべて正常に動作しますが$order->getAllItems();$order->getAllVisibleItems();単純で構成可能な親製品を返すため、

カートに2つの商品がある場合

  • 1シンプルな製品
  • 1関連する構成可能製品

したがって、2つの製品を入手する代わりに、3つの製品を入手します。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 

回答:


12

これは、注文からアイテムを取得するさまざまな方法が機能する方法です。

  • getItems():読み込まれた注文アイテムコレクションからアイテムの配列を返します
  • getAllItems():削除済みとしてマークされていないすべてのアイテムの配列を返します
  • getAllVisibleItems():削除済みとしてマークされておらず、親アイテムを持たないすべてのアイテムの配列を返します

したがって、構成可能な製品のみを取得し、その関連製品getAllVisibleItems()は取得しないことが正しい方法です。

  • 単一の単純なアイテムには親がありません=> 表示
  • 構成可能アイテムには親がありません=> 表示
  • 関連付けられたシンプルアイテムには親があります=> 表示されません

残念ながら、のようなことに留意されたいのみgetItems()サービス契約での一部でありますMagento\Sales\Api\Data\OrderInterface


感謝の男が、以下の画像は助けることができるならば、その意味は、私をしていないので、一緒に簡単で、設定の製品を返すgetAllVisibleitems() imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

画像は正しいようです。それとも、あなたが持っているものではなく、あなたが望むものですか?
Fabian Schmengler、2016

カートからアイテムを返す必要があるので、2つの単純な製品(1つはconfigから、もう1つはそのまま)です。($ productItem-> getProductType()== "simple" &&($ productItem-> getParentItem())){の場合、このロジックを実行しました。} configの単純な製品が価格を返さなかったため
Sajid Unar

1
Magento 1とMagento 2のgetAllVisibleItemsの実装には大きな違いがあります。M1の子製品(構成可能、バンドルなど)は表示されませんが、M2では表示されます。実装は同じですが、$ item-> getParentItemId()は、子アイテムのM2でnullを返します。バグかどうかにかかわらず、動作は使用しているMagentoのバージョンによって異なります。
Ricardo Martins

2

注文アイテムを取得する最良の方法は、 $order->getAllVisibleItems()

上記のfschmenglerによって説明された、

getAllItems(): この関数は、config simple productを含むカートのすべてのアイテムの配列も返します。

あなたはあなたがオリジナルの製品を手に入れる方法を使わ$order->getAllItems() なければならないので、あなたは3つの製品$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ループを使用して子アイテムを除外できます。

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