Magento2 Sipariş ürünlerini almanın doğru yolu


11

M2 Ödeme Uzantısı üzerinde çalışıyorum, tüccarımız siparişle birlikte ürün detaylarını göndermemize ihtiyaç duyuyor

Her şey iyi ama çalışıyor $order->getAllItems();ya $order->getAllVisibleItems();dönen basit ve böylece yapılandırılabilir ebeveyn ürünleri

Sepetinizde 2 ürün varsa

  • 1 Basit Ürün
  • 1 Yapılandırılabilir ürünle ilişkili

iki ürün almak yerine üç ürün alıyorum; bir basit, ilişkili ürün ve ana ürünü;

Doğru ürünleri çıkarmayı deneyebilirim ama eminim başka bir şey olmalı

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

Yanıtlar:


13

Bir siparişten ürün almak için farklı yöntemler şu şekilde çalışır:

  • getItems(): yüklü sipariş kalemi koleksiyonundan öğe dizisini döndürür
  • getAllItems(): silinmiş olarak işaretlenmeyen tüm öğelerin dizisini döndürür
  • getAllVisibleItems(): silinmiş olarak işaretlenmeyen ve bir üst öğeye sahip olmayan tüm öğelerin dizisini döndürür

Dolayısıyla, ilişkili ürünü değil, yalnızca yapılandırılabilir ürünü elde getAllVisibleItems()etmek doğru yöntemdir:

  • tek bir basit öğenin üst öğesi yok => görünür
  • yapılandırılabilir öğenin bir üst öğesi yok => görünür
  • ilişkili basit öğenin bir üst öğesi var => görünmez

Ne yazık ki, getItems()hizmet sözleşmesinin yalnızca bir bölümüMagento\Sales\Api\Data\OrderInterface


Teşekkürler adam ama getAllVisibleitems () basit ve yapılandırma ürünlerini birlikte döndürerek, bu yüzden aşağıdaki görüntüleri izlemeniz i mantıklı değilse, imgur.com/8ADtnUQ imgur.com/LnMMuOM
Sajid Unar

Görüntü doğru görünüyor. Yoksa istediğin bu mu, sahip olduğun değil mi?
Fabian Schmengler

Biri config ve diğeri olduğu gibi sadece iki basit ürün sepetten ürün iade olmalıdır; ($ ProductItem-> getProductType () == "basit" && ($ productItem-> getParentItem ())) {devam ederse bu mantığı yaptım. } config'in basit ürünü fiyat döndürmediği için
Sajid Unar

1
Magento 1 ve Magento 2'de getAllVisibleItems'in uygulanması arasında büyük bir fark vardır. Uygulama aynı olsa da, $ item-> getParentItemId (), alt öğeler için M2'de null değerini döndürür. Bu bir hata olsun ya da olmasın, davranışı kullandığınız Magento sürümüne göre değişir.
Ricardo Martins

3

Sipariş kalemleri almanın en iyi yolu $order->getAllVisibleItems()

Yukarıdaki fschmengler tarafından açıklanmıştır,

getAllItems(): Bu işlev, yapılandırma basit ürünü ile birlikte tüm sepet öğelerinin dizisini döndürür.

Üç ürün alıyorsunuz çünkü orijinal ürün elde $order->getAllItems() etmek için $order->getAllVisibleItems()yöntem kullanmak zorundasınız .

Dosyadan daha fazla referansı kontrol edebilirsiniz 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;
    }

Cevabınız için teşekkür ederim ama beklediğim gibi çalışmadığını açıkladığım için aşağıdaki resim sepetine bakın Resim imgur.com/8ADtnUQ ve hata ayıklama görüntüsü imgur.com/LnMMuOM
Sajid Unar

0

Öğe döngüsünü kullanabilir ve alt öğeyi aşağıdaki kodla hariç tutabilirsiniz:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.