Handel otrzymuje identyfikatory produktu z zamówienia

12

Moje pytanie jest proste: jak uzyskać identyfikator produktu z zamówienia handlowego z kodem Drupal? W tej chwili mam coś takiego:

  $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?
    }

Mam nadzieję, że ktoś jest w stanie odpowiedzieć na to pytanie :)

użytkownik5706
źródło
Czy próbowałeś var_dump ($ order); w twoim drugim foreach?
saadlulu

Odpowiedzi:

9

Nie pamiętam dokładnej struktury pola referencyjnego produktu handlowego, ale musisz zrobić coś takiego.

Ostrzeżenie: ten styl kodu nie będzie działał na wielu zamówieniach, ponieważ wewnętrzna pamięć podręczna jednostek elementu zamówienia zużyje zbyt dużo pamięci. Będzie to problem, jeśli masz tysiące zamówień.

$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']...
  }
}
googletorp
źródło
Dzięki, to działa. Wpadłem na pomysł, że uruchomienie zapytania w tabelach handlowych było również opcją. Istnieje zamówienie relacji - produkt mógł zostać ustanowiony z polem SKU.
user5706
Ja też. Szkoda, że ​​kiedy mam identyfikator zamówienia, nie mogę po prostu zapytać o IDS produktu, ale muszę załadować tyle obiektów.
tomas.teicher
Bezpośrednie używanie „und” nie jest dobrą praktyką. Jeśli masz pewność, że Twój kod będzie używany tylko w nieprzetłumaczonej witrynie, możesz użyć stałej LANGUAGE_NONE - ale lepiej jest użyć tego, field_get_items()aby pobrać elementy z pola i iterować przez to. Więc foreach ($order->commerce_line_items['und'] as $line) { ... }staje $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }itp Albo użycie entity_metadata_wrapper, który automatycznie wykonuje językach pod uwagę.
KingAndy
22

Korzystając z opakowania metadanych encji, możesz także:

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

Ważną częścią jest tutaj sprawdzenie rodzaju elementu zamówienia, aby nie dopuścić do umieszczenia elementów zamówienia lub innych rodzajów elementów na liście identyfikatorów produktów. Dodatkowo, z uwagi na opakowanie, użyłem „surowej” wartości pola commerce_product w elemencie zamówienia. Wynika to z faktu, że „wartość” byłaby w pełni załadowanym produktem referencyjnym, a „surowa” wartość to po prostu identyfikator produktu.

Ryan Szrama
źródło
3

Jeśli nie musisz ładować całych obiektów (elementów zamówienia, zamówień i produktów handlowych), możesz uruchomić zapytanie w ten sposób:

 $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;
tomas.teicher
źródło
mapowanie danych do DB może być dość trudnym zadaniem .. dzięki za te informacje mapowania .. szukam tego od 2 dni
mjs
Teoretycznie inne typy jednostek mogłyby korzystać z pola commerce_product, więc JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
Łączenie