Thương mại nhận id sản phẩm từ đơn đặt hàng


12

Câu hỏi của tôi rất đơn giản: Làm cách nào để tôi nhận được id sản phẩm từ đơn đặt hàng thương mại với mã Drupal? Tôi có một cái gì đó như thế này vào lúc này:

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

Hy vọng ai đó có thể trả lời câu hỏi này :)


Bạn đã thử var_dump ($ order); bên trong bài giảng thứ 2 của bạn?
saadlulu

Câu trả lời:


9

Tôi không thể nhớ cấu trúc chính xác của trường tham chiếu sản phẩm thương mại, nhưng bạn cần phải làm một cái gì đó như thế này.

Cảnh báo kiểu mã này sẽ không hoạt động trên nhiều đơn hàng vì bộ đệm trong cho các thực thể chi tiết đơn hàng sẽ sử dụng quá nhiều bộ nhớ. Đây sẽ là một vấn đề nếu bạn có hàng ngàn đơn đặt hàng.

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

Cảm ơn, điều này làm việc. Tôi có ý tưởng rằng chạy một truy vấn trên các bảng thương mại cũng là một tùy chọn. Có một trật tự mối quan hệ - sản phẩm có thể đã được thiết lập với trường sku.
dùng5706

Tôi cũng vậy. Đáng tiếc là khi tôi có ID đơn hàng, tôi không thể truy vấn IDS sản phẩm, nhưng tôi phải tải rất nhiều đối tượng.
tomas.te Rich 22/11/13

Đó không phải là cách thực hành tuyệt vời để sử dụng 'und' trực tiếp. Nếu bạn chắc chắn mã của mình sẽ chỉ được sử dụng trên một trang web chưa được dịch, bạn có thể sử dụng hằng số LANGUAGE_NONE - nhưng tốt hơn hết là sử dụng field_get_items()để lấy các mục từ trường và thay vào đó lặp đi lặp lại. Vì vậy, foreach ($order->commerce_line_items['und'] as $line) { ... }trở thành $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, v.v. Hoặc, sử dụng entity_metadata_wrapper, tự động đưa ngôn ngữ vào tài khoản.
KingAndy

22

Sử dụng trình bao bọc siêu dữ liệu thực thể, bạn cũng có thể làm:

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

Phần quan trọng ở đây là kiểm tra loại chi tiết đơn hàng, vì vậy bạn không kết thúc bao gồm chi tiết đơn hàng vận chuyển hoặc các loại chi tiết đơn hàng khác trong danh sách ID sản phẩm của bạn. Ngoài ra, với thông báo trình bao bọc mà tôi đã sử dụng giá trị "thô" của trường Commerce_product trên mục hàng. Điều này là do "giá trị" sẽ là sản phẩm được tham chiếu đầy đủ, trong khi giá trị "thô" chỉ đơn giản là ID sản phẩm.


3

Nếu bạn không cần tải toàn bộ đối tượng (chi tiết đơn hàng, đơn hàng và sản phẩm thương mại) Bạn có thể chạy truy vấn như thế này:

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

ánh xạ dữ liệu tới DB có thể là một nhiệm vụ khá khó khăn .. cảm ơn vì thông tin ánh xạ này .. đã tìm kiếm nó từ 2 ngày
mjs

Về lý thuyết, các loại thực thể khác có thể đang sử dụng trường JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
Commerce_product
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.