Комерція отримує ідентифікатори товару від замовлення


12

Моє запитання просте: Як отримати ідентифікатор товару з комерційного замовлення з кодом Drupal? У мене є щось подібне на даний момент:

  $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 ($ order); всередині вашого 2-го передвигу?
saadlulu

Відповіді:


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

Дякую, це працює. У мене з’явилася думка, що запуск запиту за комерційними таблицями також є варіантом. Там порядок взаємозв'язку - продукт міг бути встановлений із полем sku.
користувач5706

Я також. Шкода, що коли у мене є ідентифікатор замовлення, я не можу просто запитувати ідентифікатор продукту, але мені доведеться завантажити стільки об'єктів.
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) { ... }і т. Д. Або скористайтеся entit_metadata_wrapper, який автоматично враховує мови.
KingAndy

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();
    }
  }
}

Важливою частиною тут є перевірка типу позиції, тому ви не будете включати позиції або інші типи позицій у свій список ідентифікаторів товару. Крім того, із зазначенням обгортки, що я використовував "необроблене" значення поля commerce_product у позиції. Це тому, що "значення" було б повністю завантаженим посиланням продуктом, тоді як "сировинним" значенням є просто ідентифікатор продукту.


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 дні
міс

Теоретично інші типи юридичних осіб можуть використовувати поле commerce_product, тому JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
приєднання
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.