Вывод списка последних нод, связанных с определенным словарем.

Две функции нижеприведенного сниппета позволят вывести заголовки самых последних из добавленных нод с привязкой к определенному словарю.

Заголовки, конечно же, будут ссылками на страницу с полным текстом ноды. Последние N нод(лимиты выставляем в коде) будут отображены для каждого из термина выбранного словаря. Примерная структура такова:

ТЕРМИН 1

  • нода раз
  • нода два
  • нода три
  • ...
  • и т.д. в зависимости от выставленных лимитов

ТЕРМИН 2

  • нода раз
  • нода два
  • нода три
  • ...

ТЕРМИН 3

  • нода раз
  • нода два
  • нода три
  • ...

Решение «нарыто» в джунглях drupal.org, и слегка «отрихтовано» своим напильником.

<?php
function get_nodes($tid, $limit, &$nodos_mostrados) {
    $result = db_query(db_rewrite_sql("SELECT n.title, n.nid, n.changed
    FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid
    WHERE tn.tid = %d AND n.status = 1
    ORDER BY n.created DESC LIMIT %d"
), $tid, $limit);

    while ($anode = db_fetch_object($result)) {
          if (!in_array ($anode->nid, $nodos_mostrados)) {
             $nodos_mostrados[]=$anode->nid;
             $changed = date('d.m.y', $anode->changed);//Тут настраиваем вывод даты последней редакции ноды. Если не нужно, то можно просто ампутировать эту переменную ($changed) и ее вывод(ниже).
             $items[] = l($anode->title, "node/". $anode->nid) . " ($changed)";
          }
    }
    if(!$items) {
        return;
    } else {
        return theme_item_list($items);
    }
}

// vid = ID нужного словаря
function printRelatedVocabulary($vid, $limit=5) //Цеферкой пять у нас обозначен лимит на ноды для каждого из терминов.
{
  $nodos_mostrados=array();
  $result = db_query("SELECT tid, name FROM {term_data} WHERE vid = %d", $vid);
  while ($t = db_fetch_object($result)) {
      $nodes = get_nodes($t->tid,$limit, $nodos_mostrados);
      if ($nodes) {
          print "<h2> $t->name </h2>";
          print $nodes;
      }
  }
}

printRelatedVocabulary(1); // 1 - это ID словаря в нашем примере.
?>

Не могу не напомнить. Если вы решите сделать несколько блоков с данным сниппетом, выводя списки из нескольких словарей на одной странице, то не забудьте поменять для каждого название функций. В противном случае с вашим Друпалом произойдет мини-инфаркт и он сильно побледнеет(побелеет).

Dalay

Комментарии

Fatal error: Cannot redeclare get_nodes() (previously declared in /home/growpeac/public_html/includes/common.inc(1699) : eval()'d code:2) in /home/growpeac/public_html/includes/common.inc(1699) : eval()'d code on line 20

название функции поменял..подскажите..как исправить пожалуйста

Вам русский что ли не родной?

* user warning: Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT node.title, node.nid, node.changed FROM node INNER JOIN term_node ON node.nid = term_node.nid INNER JOIN node_access na ON na.nid = n.nid WHERE (na.grant_view >= 1 AND ((na.gid = 0 AND na.realm = 'all') OR (na.gid = 0 AND na.realm = 'content_access_author') OR (na.gid = 1 AND na.realm = 'content_access_rid'))) AND ( term_node.tid = 8 AND node.status = 1 )ORDER BY node.created DESC LIMIT 5 in /home/tauzpua/domains/malom.zp.ua/public_html/includes/common.inc(1695) : eval()'d code on line 6.
* user warning: Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT node.title, node.nid, node.changed FROM node INNER JOIN term_node ON node.nid = term_node.nid INNER JOIN node_access na ON na.nid = n.nid WHERE (na.grant_view >= 1 AND ((na.gid = 0 AND na.realm = 'all') OR (na.gid = 0 AND na.realm = 'content_access_author') OR (na.gid = 1 AND na.realm = 'content_access_rid'))) AND ( term_node.tid = 1 AND node.status = 1 )ORDER BY node.created DESC LIMIT 5 in /home/tauzpua/domains/malom.zp.ua/public_html/includes/common.inc(1695) : eval()'d code on line 6.

Вот такой прикол вылазит при заходе на сайт гостем. Под админкой - все нормально. Есть желание помочь?

В первом запросе к бд в кодах просто были прописаны «жестко» названия таблиц, без учета возможного префикса. Исправил, пробуйте.

Спасибо огромное! Все работает.
Исходя из моих нулевых знаний в php ваша помощь неоценима :-)