Magento2 ऑर्डर आइटम प्राप्त करने का सही तरीका


11

मैं M2 पेमेंट एक्सटेंशन पर काम कर रहा हूं, हमारे व्यापारी को ऑर्डर के साथ आइटम विवरण भेजने की आवश्यकता है

सब कुछ ठीक काम करता है $order->getAllItems();या $order->getAllVisibleItems();सरल और विन्यास योग्य मूल उत्पादों को वापस करता है

अगर मेरे पास कार्ट में 2 उत्पाद हैं

  • 1 सरल उत्पाद
  • 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 

जवाबों:


13

यह है कि एक ऑर्डर कार्य से आइटम प्राप्त करने के विभिन्न तरीके:

  • getItems(): लोड किए गए ऑर्डर आइटम संग्रह से आइटमों की सरणी देता है
  • getAllItems(): उन सभी मदों की सरणी देता है जिन्हें हटाए जाने के रूप में चिह्नित नहीं किया गया है
  • getAllVisibleItems(): उन सभी मदों की सरणी देता है जो हटाए गए के रूप में चिह्नित नहीं हैं और जिनके पास मूल आइटम नहीं है

तो केवल विन्यास योग्य उत्पाद और उसके संबद्ध उत्पाद को प्राप्त करने के लिए, getAllVisibleItems()सही तरीका है:

  • एकल सरल आइटम में माता-पिता => दृश्यमान नहीं है
  • कॉन्फ़िगर करने योग्य आइटम में पैरेंट => दृश्यमान नहीं है
  • संबद्ध साधारण आइटम में कोई पैरेंट => दिखाई नहीं देता है

ध्यान दें कि दुर्भाग्य से, के रूप में केवल getItems()सेवा अनुबंध का हिस्सा हैMagento\Sales\Api\Data\OrderInterface


धन्यवाद आदमी, लेकिन getAllVanishitems () सरल और कॉन्फ़िगर उत्पादों को एक साथ लौटा रहा है, इसलिए इसका कोई मतलब नहीं है अगर निम्नलिखित चित्र imgur.com/8ADtnUQ imgur.com/LnMMuOM
साजिद उनार

छवि सही दिखती है। या यह वह है जो आप चाहते हैं, न कि आपके पास क्या है?
फैबियन शेंगलर

इसमें कार्ट से आइटम को वापस करना चाहिए ताकि विन्यास से सिर्फ दो सरल उत्पाद हो और दूसरा जैसा हो; मैंने यह तर्क किया (यदि $ productItem-> getProductType () == "सरल" && ($ productItem-> getParentItem ())) जारी रखें; } चूँकि विन्यास का सरल उत्पाद वापस नहीं आ रहा था
साजिद उनार

1
Magento 1 और Magento 2 में getAllVanishItems के कार्यान्वयन के बीच एक बड़ा अंतर है। जबकि एम 1 बच्चों के उत्पादों में (कॉन्फ़िगर करने योग्य, बंडल किए गए, आदि) एम 2 में प्रदर्शित नहीं होते हैं, वे हैं। हालांकि कार्यान्वयन समान है, $ आइटम-> getParentItemId () बच्चों के आइटम के लिए M2 में शून्य वापस आ जाएगा। यह बग है या नहीं, यह व्यवहार आपके द्वारा उपयोग किए जा रहे 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
साजिद उनार

0

आप आइटम लूप का उपयोग कर सकते हैं और निम्नलिखित कोड द्वारा बच्चे के आइटम को बाहर कर सकते हैं:

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

foreach ($order->getAllItems as $_item) {
     if(!$_item->getData('has_children')) { 
        continue; 
     } else {
        $productIds[]=$_item->getProductId();
     } 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.