ВопросПрограммный вывод заголовков нод относящихся к определенной ноде

Есть 2 типа нод: коллекции и продукты. В одном типе нод (продукт) есть поле node reference на другой тип нод (коллекция). Задача состоит в том, чтобы на странице продукта сделать список заголовков продуктов, которые которые относятся к этой же коллекции.

Надеюсь, понятно изъяснил :) Спасибо.

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Так а в чём проблема-то ?) Пишите запрос в базу данных по полю со связью и вытаскивайте все остальные связи :) Мануал в помощь.

02.12.2012 18:23
Аватар пользователя Топикстартер
Топикстартер написал:

Спасибо! Я попробовал сделать примерно то же самое через EntityFieldQuery. К примеру вывести тайтл ноды коллекции, относящейся к той же фабрике, что и текущая, но опубликованной после. Нечто вроде листалки как у тебя в блоге (предыдущий пост--следующий пост)

function collection_next_links() {
 
  // get next title
  $qnext = new EntityFieldQuery();
  $qnext -> entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'collection')
    ->propertyOrderBy('created', collection_created(), '<')
    ->propertyCondition('status', 1)
    ->propertyOrderBy('created', 'DESC')
    ->fieldCondition('field_fab_ref', 'nid', fabric_reference(), '=')
    ->range(0,1);
  $next_node = $qnext->execute();
 
  if (!empty($next_node)) {
    $nids = array_keys($next_node['node']);
    $next_load = node_load($nids);
    return l(t($next_load->title), 'node/' .  $next_load->nid, array('attributes' => array('class' => array('next'))));
  } return '';
}
 
function fabric_reference() {
  if(arg(0)=='node' && is_numeric(arg(1)) && (arg(2)!=='edit') && (arg(2)!=='delete')) {
    $node = node_load(arg(1));
    $fabrefid = $node->field_fab_ref['und'][0]['nid'];
    return $fabrefid;
  }
  return '';
}
 
function collection_created() {
  if(arg(0)=='node' && is_numeric(arg(1)) && (arg(2)!=='edit') && (arg(2)!=='delete')) {
    $node = node_load(arg(1));
    $created = $node->created;
    return $created;
  }
  return '';
}

но он выводит последнюю опубликованную ноду, которая относится к данной фабрике... Может подскажешь, где я тут набедокурил? И вообще в чем разница EntityFieldQuery и db_select?

04.12.2012 19:08
Аватар пользователя Spleshka
Spleshka написал:

Если я правильно тебя понял - то вот так должна выглядеть рабочая функция:

function collection_next_links() {
 
  // Load node object from menu.
  $fabric = menu_get_object();
  if (empty($fabric->type) || (!empty($fabric->type) && $fabric->type != 'collection')) {
    return '';
  }
 
  // Get reference to another fabric.
  $field_reference = 'field_fab_ref';
  $field_items = field_get_items('node', $fabric, $field_reference);
  if (empty($field_items[0]['nid'])) {
    return '';
  }
  $fabric_reference = $field_items[0]['nid'];
 
  // Get next fabric title.
  $qnext = new EntityFieldQuery();
  $qnext->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', $fabric->type)
    ->propertyOrderBy('created', $fabric->created, '>')
    ->propertyCondition('status', NODE_PUBLISHED)
    ->propertyOrderBy('created', 'DESC')
    ->fieldCondition($field_reference, 'nid', $fabric_reference, '=')
    ->range(0, 1);
  $next_node = $qnext->execute();
 
  if (!empty($next_node)) {
    $nids = array_keys($next_node['node']);
    $next_load = node_load($nids);
    return l(t($next_load->title), 'node/' .  $next_load->nid, array('attributes' => array('class' => array('next'))));
  }
 
  return '';
}

Теперь отвечаю на вопрос в чем разница EntityFieldQuery и db_select?:

1. EntityFieldQuery обёртка над db_select.
2. db_select обёртка над db_query.
3. db_query обёртка над обычным mysql_query.
4. mysql_query позволяет напрямую отправлять строковый запрос в базу данных.

Т.е. EntityFieldQuery - не более, чем удобная обёртка над простыми запросами к бд.

05.12.2012 21:24
Аватар пользователя Топикстартер
Топикстартер написал:

Спасибо за науку! :)
Решил несколько более громоздким способом. Надо будет попробовать твоим методом.

10.12.2012 15:55

Комментировать