2009
27
Июн
Вывод списка последних нод, связанных с определенным словарем.
Две функции нижеприведенного сниппета позволят вывести заголовки самых последних из добавленных нод с привязкой к определенному словарю.
Заголовки, конечно же, будут ссылками на страницу с полным текстом ноды. Последние 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 словаря в нашем примере.
?>
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 ваша помощь неоценима :-)