xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Функция возвращает ноду 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
Похожие записи

Комментарии RSS

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

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

добавил вариант с db_select

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

/**
 * Получим $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);
  }
}

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании