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 :)
Réponses:
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.
la source
field_get_items()
pour obtenir les éléments du champ, et parcourir à la place. Ainsiforeach ($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.En utilisant l'encapsuleur de métadonnées d'entité, vous pouvez également faire:
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.
la source
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:
la source
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')