Il commercio ottiene gli ID prodotto dall'ordine


12

La mia domanda è semplice: come posso ottenere gli ID prodotto da un ordine commerciale con il codice Drupal? Ho qualcosa del genere al momento:

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

Spero che qualcuno sia in grado di rispondere a questa domanda :)


Hai provato var_dump ($ order); nella tua seconda foreach?
Saadlulu,

Risposte:


9

Non ricordo l'esatta struttura del campo di riferimento del prodotto commerciale, ma devi fare qualcosa del genere.

Avviso questo stile di codice non funzionerà su molti ordini poiché la cache interna per le entità dell'elemento pubblicitario utilizzerà troppa memoria. Questo sarà un problema se hai migliaia di ordini.

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

Grazie, funziona. Ho avuto l'idea che anche l'esecuzione di una query sulle tabelle di commercio fosse un'opzione. C'è un ordine di relazione - il prodotto avrebbe potuto essere stabilito con il campo sku.
user5706,

Anch'io. Peccato che quando ho un ID ordine, non posso solo interrogare gli ID prodotto, ma devo caricare così tanti oggetti.
tomas.teicher,

Non è una buona pratica usare 'und' direttamente. Se sei certo che il tuo codice verrà utilizzato solo su un sito non tradotto, puoi utilizzare la costante LANGUAGE_NONE, ma è consigliabile utilizzare questa opzione field_get_items()per ottenere gli elementi dal campo e scorrere invece quello. Così foreach ($order->commerce_line_items['und'] as $line) { ... }diventa $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, ecc. Oppure, entity_metadata_wrapper, che tiene automaticamente conto delle lingue.
KingAndy

22

Utilizzando il wrapper metadati entità, è possibile anche:

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

La parte importante qui sta controllando il tipo di elemento pubblicitario, quindi non finirai per includere gli elementi pubblicitari di spedizione o altri tipi di elementi pubblicitari nel tuo elenco di ID prodotto. Inoltre, con il wrapper noto che ho usato il valore "grezzo" del campo commerce_product sull'elemento pubblicitario. Questo perché il "valore" sarebbe il prodotto di riferimento a pieno carico, mentre il valore "grezzo" è semplicemente l'ID del prodotto.


3

Se non è necessario caricare interi oggetti (elementi pubblicitari, ordini e prodotti commerciali) È possibile eseguire query in questo modo:

 $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;

mappare i dati su DB può essere un compito piuttosto scoraggiante .. grazie per questa informazione di mappatura .. lo
sto

In teoria altri tipi di entità potrebbero utilizzare il campo commerce_product, quindi Join sarebbe più appropriatoJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
KingAndy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.