वाणिज्य उत्पाद ऑर्डर से उत्पाद आईडी प्राप्त करते हैं


12

मेरा प्रश्न सरल है: मुझे ड्रुपल कोड के साथ वाणिज्य क्रम से उत्पाद आईडी कैसे मिलेगा? मेरे पास इस समय ऐसा कुछ है:

  $orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
  foreach($orders as $order) {
    foreach ($order->commerce_line_items['und'] as $line) {
        $line_id = $line['line_item_id'];
        // ... product id, where are you?
    }

उम्मीद है कि कोई इस सवाल का जवाब देने में सक्षम है :)


क्या आपने var_dump ($ ऑर्डर) की कोशिश की है; अपने 2 वें अंदर?
सादालुलु

जवाबों:


9

मुझे वाणिज्य उत्पाद संदर्भ क्षेत्र की सटीक संरचना याद नहीं है, लेकिन आपको ऐसा कुछ करने की आवश्यकता है।

चेतावनी यह कोड शैली कई आदेशों पर काम नहीं करेगी क्योंकि लाइन आइटम संस्थाओं के लिए आंतरिक कैश बहुत अधिक मेमोरी का उपयोग करेगा। यदि आपके पास हजारों आदेश हैं तो यह एक समस्या होगी।

$orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
foreach($orders as $order) {
  foreach ($order->commerce_line_items['und'] as $line) {
    $line_item = commerce_line_item_load($line['line_item_id']);
    $product_id = $line_item->commerce_product['und']...
  }
}

धन्यवाद, यह काम करता है। मुझे यह विचार आया कि वाणिज्य तालिकाओं पर एक क्वेरी चलाना भी एक विकल्प था। एक संबंध आदेश - उत्पाद को स्क्यू क्षेत्र के साथ स्थापित किया जा सकता था।
user5706

मैं भी। अफ़सोस कि जब मेरे पास ऑर्डर आईडी है, तो मैं सिर्फ उत्पाद आईडीएस को क्वेरी नहीं कर सकता, लेकिन मुझे इतनी वस्तुओं को लोड करना होगा।
tomas.teicher

सीधे तौर पर 'und' का उपयोग करना कोई बड़ी बात नहीं है। यदि आप निश्चित हैं कि आपका कोड केवल अनारक्षित साइट पर उपयोग किया जाएगा, तो आप LANGUAGE_NONE निरंतर का उपयोग कर सकते हैं - लेकिन field_get_items()फ़ील्ड से आइटम प्राप्त करने के लिए इसका उपयोग करना बेहतर है , और इसके बजाय इसके माध्यम से पुनरावृत्ति करें। तो foreach ($order->commerce_line_items['und'] as $line) { ... }बन जाता है $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, आदि या, का उपयोग करें Unit_metadata_wrapper, जो स्वचालित रूप से भाषाओं को ध्यान में रखता है।
किंगएंडी

22

इकाई मेटाडेटा आवरण का उपयोग करना, आप भी कर सकते हैं:

foreach (commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE) as $order) {
  $product_ids = array();
  foreach (entity_metadata_wrapper('commerce_order', $order)->commerce_line_items as $delta => $line_item_wrapper) {
    if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
      $product_ids[] = $line_item_wrapper->commerce_product->raw();
    }
  }
}

यहां महत्वपूर्ण हिस्सा लाइन आइटम के प्रकार की जांच कर रहा है, इसलिए आप अपनी उत्पाद आईडी की सूची में शिपिंग लाइन आइटम या अन्य प्रकार की लाइन आइटम शामिल नहीं करते हैं। इसके अतिरिक्त, रैपर नोटिस के साथ कि मैंने लाइन आइटम पर वाणिज्य_प्रकार क्षेत्र के "कच्चे" मूल्य का उपयोग किया। ऐसा इसलिए है क्योंकि "मान" पूरी तरह से लोडेड संदर्भित उत्पाद होगा, जबकि "कच्चा" मूल्य केवल उत्पाद आईडी है।


3

यदि आपको संपूर्ण ऑब्जेक्ट (लाइन आइटम, ऑर्डर और कॉमर्स उत्पाद) लोड करने की आवश्यकता नहीं है, तो आप इस तरह क्वेरी चला सकते हैं:

 $args = array(
    ':order_id' => $order_id,

);
$product_ids = db_query("SELECT p.commerce_product_product_id 
   FROM {commerce_line_item} li 
   JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id) 
   WHERE li.order_id = :order_id AND li.type = 'product'", $args)->fetchCol();
return $product_ids;

DB को डेटा मैप करना काफी चुनौतीपूर्ण काम हो सकता है .. इस मैपिंग की जानकारी के लिए धन्यवाद .. 2 दिनों से इसे खोज रहा है
mjs

सिद्धांत रूप में अन्य इकाई प्रकार JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
कॉमर्स_प्रोडक्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.