it-swarm.com.de

Commerce erhält Produkt-IDs aus der Bestellung

Meine Frage ist einfach: Wie erhalte ich die Produkt-IDs aus einer Handelsbestellung mit Drupal Code? Ich habe momentan so etwas:

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

Hoffentlich kann jemand diese Frage beantworten :)

12
user5706

Ich kann mich nicht an die genaue Struktur des Commerce-Produktreferenzfelds erinnern, aber Sie müssen so etwas tun.

Warnung: Dieser Codestil funktioniert bei vielen Aufträgen nicht, da der interne Cache für die Werbebuchungsentitäten zu viel Speicher benötigt. Dies ist ein Problem, wenn Sie Tausende von Bestellungen haben.

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

Mit dem Entity-Metadaten-Wrapper können Sie außerdem Folgendes tun:

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

Der wichtige Teil hierbei ist die Überprüfung des Typs der Werbebuchung, damit Sie keine Versandposten oder andere Arten von Werbebuchungen in Ihre Liste der Produkt-IDs aufnehmen. Außerdem mit dem Wrapper-Hinweis, dass ich den "Roh" -Wert des Felds "Commerce_Produkt" für die Werbebuchung verwendet habe. Dies liegt daran, dass der "Wert" das vollständig geladene referenzierte Produkt ist, während der "rohe" Wert einfach die Produkt-ID ist.

22
Ryan Szrama

Wenn Sie nicht ganze Objekte (Werbebuchungen, Bestell- und Handelsprodukte) laden müssen, können Sie eine Abfrage wie folgt ausführen:

 $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;
3
tomas.teicher