Ticaret, ürün kimliklerini siparişten alır


12

Sorum basit: Ürün kimliklerini Drupal kodlu bir ticari siparişten nasıl alabilirim? Şu anda böyle bir şey var:

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

Umarım birisi bu soruya cevap verebilir :)


Var_dump ($ order); foreach'inizin içinde mi?
saadlulu

Yanıtlar:


9

Ticari ürün referans alanının tam yapısını hatırlayamıyorum, ancak böyle bir şey yapmanız gerekiyor.

Satır öğesi varlıkları için dahili önbellek çok fazla bellek kullanacağından bu kod stilini uyarmak birçok siparişte çalışmaz. Binlerce siparişiniz varsa bu bir sorun olacaktır.

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

Teşekkürler, bu işe yarıyor. Ticaret tablolarında bir sorgu çalıştırmanın da bir seçenek olduğu fikrini aldım. Sku alanı ile bir ilişki emri - ürün kurulmuş olabilir.
user5706

Ben de. Yazık ki ben sipariş ID var, ben sadece ürün IDS sorgulamak değil, ama çok fazla nesne yüklemek zorunda.
tomas.teicher

Doğrudan 'und' kullanmak harika bir uygulama değildir. Eğer ediyorsanız belli kodunuzu sadece bir çevrilmemiş sitesinde kullanılacaktır, sen LANGUAGE_NONE sabiti kullanabilirsiniz - ama kullanmak daha iyi uygulamadır field_get_items()yerine o aracılığıyla yinelerler sahadan ürün almak için, ve. Yani foreach ($order->commerce_line_items['und'] as $line) { ... }olur $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, otomatik olarak dikkate dilleri alır kullanım entity_metadata_wrapper, vb Or.
KingAndy

22

Varlık meta veri sarmalayıcısını kullanarak şunları da yapabilirsiniz:

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

Buradaki önemli kısım, satır öğesinin türünü kontrol etmektir; bu nedenle, ürün kimlikleri listenize gönderim satır öğelerini veya diğer satır öğesi türlerini dahil etmezsiniz. Ayrıca, sarıcı uyarı ile ben satır öğesinde commerce_product alanının "ham" değerini kullandığımı. Bunun nedeni, "raw" değerinin yalnızca ürün kimliğini oluşturması, "value" ın tam olarak yüklenen referans ürünü olmasıdır.


3

Tüm nesneleri (satır öğeleri, sipariş ve ticaret ürünleri) yüklemeniz gerekmiyorsa, sorguyu şu şekilde çalıştırabilirsiniz:

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

veri DB eşlemek oldukça zor bir görev olabilir .. bu eşleme bilgi için teşekkürler .. 2 günden beri bu arıyor
mjs

Teoride, diğer varlık türleri commerce_product alanını kullanıyor olabilir, bu yüzden Join daha uygun olurJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
KingAndy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.