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 :)


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

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.


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;

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.