Le commerce obtient les identifiants des produits de la commande

12

Ma question est simple: comment obtenir les identifiants de produit d'une commande commerciale avec le code Drupal? J'ai quelque chose comme ça en ce moment:

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

J'espère que quelqu'un pourra répondre à cette question :)

user5706
la source
Avez-vous essayé var_dump ($ order); à l'intérieur de votre 2e foreach?
saadlulu

Réponses:

9

Je ne me souviens pas de la structure exacte du champ de référence de produit commercial, mais vous devez faire quelque chose comme ça.

Attention, ce style de code ne fonctionnera pas sur de nombreuses commandes, car le cache interne des entités d'élément de ligne utilisera trop de mémoire. Ce sera un problème si vous avez des milliers de commandes.

$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
la source
Merci, cela fonctionne. J'ai eu l'idée que l'exécution d'une requête sur les tables de commerce était également une option. Là, un ordre de relation - le produit aurait pu être établi avec le champ sku.
user5706
Moi aussi. Dommage que lorsque j'ai un ID de commande, je ne peux pas simplement interroger l'ID de produit, mais je dois charger autant d'objets.
tomas.teicher
Ce n'est pas une bonne pratique d'utiliser directement «und». Si vous êtes certain que votre code ne sera utilisé que sur un site non traduit, vous pouvez utiliser la constante LANGUAGE_NONE - mais il est préférable de l'utiliser field_get_items()pour obtenir les éléments du champ, et parcourir à la place. Ainsi foreach ($order->commerce_line_items['und'] as $line) { ... }devient $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, etc. Ou, utilisez entity_metadata_wrapper, qui prend automatiquement en compte les langues.
KingAndy
22

En utilisant l'encapsuleur de métadonnées d'entité, vous pouvez également faire:

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 partie importante ici consiste à vérifier le type de l'élément de campagne, afin de ne pas finir par inclure des éléments de campagne d'expédition ou d'autres types d'éléments de campagne dans votre liste d'ID de produit. De plus, avec le wrapper, j'ai utilisé la valeur "brute" du champ commerce_product sur l'élément de campagne. En effet, la "valeur" serait le produit référencé entièrement chargé, tandis que la valeur "brute" est simplement l'ID du produit.

Ryan Szrama
la source
3

Si vous n'avez pas besoin de charger des objets entiers (éléments de campagne, produits de commande et de commerce), vous pouvez exécuter une requête comme celle-ci:

 $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
la source
mapper les données à la base de données peut être une tâche assez intimidante .. merci pour cette information de mappage .. recherche depuis 2 jours
mjs
En théorie, d'autres types d'entités pourraient utiliser le champ commerce_product, donc la jointure serait plus appropriéeJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
KingAndy