Список нод без использования views

Есть люди, которые очень не любят модуль Views и всячески стараются от него избавиться. В принципе я не отношусь к таким, но иногда ставить его на простой проект действительно лень. Можно обойтись несложным решением. Предположим нам нужно вывести список из нод, определенного типа. Пусть это будут новости.

Вот одно из решений найденое мною в интернете:

  1. <?php
  2. // Запрос к базе данных
  3. $nodes = db_select('node', 'n')
  4.               ->fields('n')
  5.               ->extend('PagerDefault') // Подключаем класс «пагинатора».
  6.               ->limit(2) // Передаем ему параметр: выводить не более 2 материалов на страницу.
  7.               ->condition('n.type', 'news') // Тип материала: новость, машинное имя.
  8.               ->execute(); // Пуск!
  9.  
  10. foreach ($nodes as $n) {
  11.   $url = drupal_get_path_alias('node/'.$n->nid); // Формируем ссылку на ноду.
  12.   // Формируем массив элементов будущего списка.
  13.   $items[] = '<a href="'.url($url, array('absolute'=>true)).'">'.$n->title.'</a>'.
  14.              '<p>Добавлено: '.format_date($n->created, 'medium').'</p>';
  15. }
  16.  
  17. print theme('item_list', array('items' => $items)). // Выводим список.
  18.       theme('pager', array('tags'=>array(0=>'‹‹',1=>'‹',3=>'›',4=>'››'), 'quantity' => 1)); // «Пагинатор».
  19.  
  20. unset($url, $n, $nodes, $items);
  21. ?>

Здесь используется переопределение пагинатора. Честно сказать у меня он как то криво заработал. Ну может дело было в моем сайте )

Пояснения к коду:

  • array('tags'=>array(0=>'‹‹',1=>'‹',3=>'›',4=>'››') - тексты для ссылок постраничной навигации: перейти на первую страницу, предыдущую, следующую и соответственно последнюю. Нумерация 0, 1, 3, 4 необходимое условие, а не опечатка автора сей статьи.
  • 'quantity' => 1 — показывать будем не более 1 линка на конкретную ноду одновременно.

Всё это конечно весело и прикольно, но слишком примитивно. С этим кодом мы можем выводить только заголовки материалов, а как быть с полями? Пришлось делать свой более сложный вариант:

  1. <?php
  2. if (!function_exists('news_titles')) {
  3. function news_titles($td) { //определяем функцию news_titles с аргументом $td — разделом таксономии
  4. $query = new EntityFieldQuery();
  5. $query->entityCondition('entity_type', 'node'); // тип материала — нода
  6. $query->propertyCondition('status', 1); // статус — опубликован
  7. $query->propertyCondition('promote', 1); // статус — закреплен на главной
  8. $query->propertyCondition('type', 'news'); // тип — новость
  9. $query->fieldCondition('field_news_section', 'tid', $td); // условие — поле таксономии равно переменной $td
  10. $query->propertyOrderBy('created', 'DESC'); // сортировка по дате создания ASC / DESC
  11. $query->range(0, 1); // кол-во отбираемых метариалов — 1
  12.  
  13. $result = $query->execute(); // запускаем выполнение запроса
  14. $nodes = $result['node']; // отделяем массив с индексом 'node'
  15.  
  16. foreach ($nodes as $n) { // прогоняем массив 'node'
  17. $nid = ($n->nid); // получаем номер ноды
  18. $link = db_select('node', 'link') // формируем запрос к базе
  19.   ->fields('link', array('title', 'created')) // получаем поля 'title' и 'created'
  20.   ->condition('link.nid', $nid) // условие по номеру ноды
  21.   ->execute(); // запускаем запрос
  22.  
  23. foreach ($link as $link) { // для каждой ссылки
  24. $url = drupal_get_path_alias('node/'.$n->nid); // формируем ссылку на ноду.
  25. // формируем массив элементов будущего списка.
  26. $items[] = '<div class="date">'.format_date($link->created, 'custom', 'd/m').'</div>'.'<a href="'.url($url, array('absolute'=>true)).'">'.$link->title.'</a>';
  27. } // конец foreach ($link as $link)
  28.  
  29. print theme('item_list', array('items' => $items)); // выводим список.
  30. } // конец foreach ($nodes as $n)
  31. } // конец функции news_tiles
  32. } // конец проверки function news_tiles exist
  33. ?><br />// ну и вывод сам блок новостей и акций
  34. <div class="news clearfix">
  35. <div class="title">
  36. <a href="/news">Новости</a>
  37. </div>
  38. <?php news_titles(6); ?> // раздел таксономии 6 (новости)
  39. </div>
  40. <div class="actions clearfix">
  41. <div class="title">
  42. <a href="/actions">Акции</a>
  43. </div>
  44. <?php news_titles(7); ?> // раздел таксономии 7 (акции)
  45. </div>

Вот такой код. Вставляем его в блок и выводим в нужном месте. Не забываем включить формат текста 'php код', иначе ничего работать не будет