Magento2正确获取订单商品的方式


11

我正在开发M2付款扩展,我们的商人需要我们与订单一起发送商品详细信息

一切正常,但$order->getAllItems();或者$order->getAllVisibleItems();返回简单且可配置的父产品,因此

如果我的购物车中有2种产品

  • 1个简单产品
  • 1个可配置产品的关联

因此,我得到的不是3种产品,而是2种; 一个简单的关联产品及其父产品;

我可以尝试提取正确的产品,但我敢肯定它一定是其他产品

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

Answers:


13

这是从订单获取物料的不同方法的工作方式:

  • getItems():从已加载的订单项目集合返回项目数组
  • getAllItems():返回未标记为已删除的所有项目的数组
  • getAllVisibleItems():返回未标记为已删除并且没有父项的所有项的数组

因此,仅获取可配置产品而不是其关联产品getAllVisibleItems()是正确的方法:

  • 单个简单项目没有父级=> 可见
  • 可配置项没有父级=> 可见
  • 相关的简单项目有一个父级=> 不可见

请注意,不幸的是,自getItems()Magento\Sales\Api\Data\OrderInterface


谢谢男人,但是getAllVisibleitems()一起返回了简单和配置产品,因此如果下面的图像可以帮助 imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

图像看起来正确。还是这是您想要的,而不是您拥有的?
Fabian Schmengler '16

它应该已经从购物车中退回了物品,所以只有两个简单的产品,一个来自config,另外一个是它; 如果($ productItem-> getProductType()==“ simple” &&($ productItem-> getParentItem())){继续;}因为配置简单的产品没有返回价格
Sajid Unar

1
Magento 1和Magento 2中getAllVisibleItems的实现之间存在巨大差异。在M1中,未显示子产品(可配置,捆绑销售等),而在M2中则未显示。尽管实现相同,但是$ item-> getParentItemId()在M2中为子项返回null。无论是否是错误,其行为都会根据您使用的Magento版本而有所不同。
里卡多·马丁斯

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循环并通过以下代码排除子项:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.