Drupal → Получить Product Display по Product ID

14.05.2014

Функция возвращает ноду Product display по Product ID:

Способ 1

function modulename_get_product_display_by_product_id($product_id, $bundle = 'product_display', $field_name = 'field_product') {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node');
  $query->propertyCondition('type', $bundle);
  $query->fieldCondition($field_name, 'product_id', $product_id);
  $query->range(0, 1);
  $result = $query->execute();
  if ($result) {
    $product_display_nid = key($result['node']);
    return node_load($product_display_nid);
  }
}

Способ 2

function modulename_get_product_display_by_product_id($product_id, $bundle = 'product_display', $field_name = 'field_product') {
  $product_display_nid = db_select('field_data_' . $field_name, 'f')
    ->fields('f', array('entity_id'))
    ->condition('f.' . $field_name . '_product_id', $product_id)
    ->condition('f.bundle', $bundle)
    ->range(0, 1)
    ->execute()
    ->fetchField();
  return node_load($product_display_nid);
}

Использование:

$product_display = modulename_get_product_display_by_product_id(123);
Написанное актуально для
Commerce 1
Похожие записи

Комментарии

Гость
14.05.2014, 12:18

Пара вопросов:
1) почему не через db_select()?
2) теоретически один товар может быть в нескольких дисплеях, а этот код вернет только один nid.

1. EntityFieldQuery для этого больше подходит
2. уберите $query->range(0, 1), замените node_load на node_load_multiple

Игорь
09.06.2016, 10:31

Я чуть переделал, мне так удобнее.
Сейчас у меня три типа вариаций т дисплеев. Типы у них совпадают.

/**
 * Получим $nid продукт-дисплея по $product - он же может быть и $product_id !
 */
function modulename_get_nid_by_product($product) {
  if (!($product instanceof EntityMetadataWrapper)) {
    $product = entity_metadata_wrapper('commerce_product', $product);
  }  
  
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node');
  $query->propertyCondition('type', $product->type->value() );
  $query->fieldCondition('field_product', 'product_id', $product->product_id->value());
  $query->range(0, 1);
  $result = $query->execute();
  if ($result) {
    $product_display_nid = key($result['node']);
    return $product_display_nid;
    // return node_load($product_display_nid);
  }
}
Игорь
09.06.2016, 10:36

Без этой строчки тоже работает!

// $query->propertyCondition('type', $bundle);

Добавить комментарий