অর্ডার থেকে পণ্যগুলি আইডি পেয়ে থাকে


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 তম foreach ভিতরে?
সাদলুলু

উত্তর:


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']...
  }
}

ধন্যবাদ, এটি কাজ করে। আমি ধারণা পেয়েছিলাম যে বাণিজ্য টেবিলগুলিতে ক্যোয়ারী চালানোও একটি বিকল্প ছিল। সেখানে একটি সম্পর্কের ক্রম - স্কু ক্ষেত্রের সাথে পণ্যটি প্রতিষ্ঠিত হতে পারে।
ব্যবহারকারী5706

আমিও. আফসোস যে আমার যখন অর্ডার আইডি রয়েছে তখন আমি কেবল পণ্য আইডিএসে কোয়েরি করতে পারি না, তবে আমাকে এতগুলি অবজেক্ট লোড করতে হবে।
tomas.teicher

সরাসরি 'আনড' ব্যবহার করা দুর্দান্ত অনুশীলন নয়। আপনি যদি নিশ্চিত হন যে আপনার কোডটি কেবল একটি অনিবন্ধিত সাইটে ব্যবহার করা হবে তবে আপনি 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) { ... }বা অ্যান্টিটি_মেটাডেটা_র্যাপার ব্যবহার করুন, যা স্বয়ংক্রিয়ভাবে ভাষাগুলিকে অ্যাকাউন্টে নেয়।
কিংঅ্যান্ডি

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;

ডিবিতে ডেটা ম্যাপ করা বেশ দু: খজনক কাজ হতে পারে .. এই ম্যাপিং তথ্যের জন্য ধন্যবাদ .. 2 দিন থেকে এটি অনুসন্ধান করা হয়েছে
এমজেএস

তত্ত্ব অনুসারে অন্যান্য সত্তা প্রকারের JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
কমার্স_প্রডাক্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.