Функция возвращает ноду 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
Комментарии
Пара вопросов:
1) почему не через db_select()?
2) теоретически один товар может быть в нескольких дисплеях, а этот код вернет только один nid.
1. EntityFieldQuery для этого больше подходит
2. уберите $query->range(0, 1), замените node_load на node_load_multiple
добавил вариант с db_select
Я чуть переделал, мне так удобнее.
Сейчас у меня три типа вариаций т дисплеев. Типы у них совпадают.
Без этой строчки тоже работает!
Добавить комментарий