Часть 3 посвящается странице отдельного форума (т.е. Список топиков).
Это продолжение работы над форумом.
Предыдущая часть здесь www.drupal.ru/node/10511
Задача 1. Вывести в столбце "Последнее сообщение" - заголовок самого сообщения.
Задача 2. Вывести кол-во просмотров топиков (нодов) - в отдельный столбец.
Это будет несортируемый столбец (сделать сортировку значительно сложнее, потому что запрос находится вне переопределяемых функций).
Обратите внимание на состояние и настройки модуля статистики ( Statistics ) /admin/logs/settings
Он необходим для отображения кол-ва просмотров топика.
Открываем template.php и переопределяем функцию theme_forum_topic_list :
function MY-THEME-NAME_forum_topic_list($tid, $topics, $sortby, $forum_per_page) {
global $forum_topic_list_header;
if ($topics) {
//
// следующий запрос собирает с каждой ноды этой страницы данного форума
// содержимое поля "Заголовок комментария" , "Количество просмотров ноды"
// для того чтобы ограничить данный запрос только текущей страницей
// есть два пути: либо разбирать переменные $sortby, $forum_per_page и
// подключать в этот запрос их ограничение, либо формировать список
// нодов из переменной $topics и использовать их в запросе как условие
// я пошёл по второму пути как более лёгкому
//
$nodes = "(";
foreach ($topics as $t) { $nodes.="$t->nid,"; }
$nodes = substr($nodes,0,-1).")";
$sql = "
SELECT n.nid,
COALESCE(c.subject,'') AS `replay`,
COALESCE(nc.totalcount,0) AS `views`
FROM {node} AS n
LEFT JOIN {comments} AS c ON c.nid = n.nid
LEFT JOIN {node_counter} AS nc ON nc.nid = n.nid
WHERE n.nid IN $nodes
";
$result = db_query(db_rewrite_sql($sql));
$nodereplay = array();
while ($nr = db_fetch_object($result)){
$nodereplay[$nr->nid]->replay = $nr->replay;
$nodereplay[$nr->nid]->views = $nr->views;
}
//
// я добавляю еще один столбец в заголовок таблицы - "кол-во просмотров",
// смещая остальные
//
$forum_topic_list_header[5] = $forum_topic_list_header[4];
$forum_topic_list_header[4] = $forum_topic_list_header[3];
$forum_topic_list_header[3] = array('data' => 'Просмотров');
foreach ($topics as $topic) {
// folder is new if topic is new or there are new comments since last visit
if ($topic->tid != $tid) {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => check_plain($topic->title), 'class' => 'title'),
array('data' => l(t('This topic has been moved'), "forum/$topic->tid"), 'colspan' => '3')
);
}
else {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => l($topic->title, "node/$topic->nid"), 'class' => 'topic'),
array('data' => $topic->num_comments . ($topic->new_replies ? '
'. l(format_plural($topic->new_replies, '1 new', 'count new'), "node/$topic->nid", NULL, NULL, 'new') : ''), 'class' => 'replies'),
//
// вот он добавленный столбец - Просмотры
//
array('data' => $nodereplay[$topic->nid]->views,'class'=> 'topic-views'),
array('data' => theme('forum_format', $topic), 'class' => 'created'),
//
// а это изменённый столбец с указанием последнего комментария
//
array('data' => (isset($nodereplay[$topic->nid]->replay) ? l ($nodereplay[$topic->nid]->replay,"node/$topic->nid",array('title'=>$nodereplay[$topic->nid]->replay, 'class'=>'replay-topic') , NULL , 'new')."
\n" : '') . theme('forum_format', $topic->last_reply ), 'class' => 'last-reply')
);
}
}
}
$output = theme('table', $forum_topic_list_header, $rows);
$output .= theme('pager', NULL, $forum_per_page, 0);
return $output;
}
?>
продолжение следует...
Комментарии
Спасибо! Очень полезный рецепт - в закладки!
Отлично работает Только $forum_topic_list_header[3] = array('data' => 'Просмотров'); заменил на $forum_topic_list_header[3] = array('data' => t('Reads')); иначе кодировка глючила, приходилось файл в utf8 сохранять, а так в любом случае работает, да и как-то более грамотно
респект
на заметку на всяк случай
Этот вариант для форума Drupal 6.х. Всего две правки.
<?php
function MY-THEME-NAME_forum_topic_list($tid, $topics, $sortby, $forum_per_page) {
global $forum_topic_list_header;
if ($topics) {
//
// следующий запрос собирает с каждой ноды этой страницы данного форума
// содержимое поля "Заголовок комментария" , "Количество просмотров ноды"
// для того чтобы ограничить данный запрос только текущей страницей
// есть два пути: либо разбирать переменные $sortby, $forum_per_page и
// подключать в этот запрос их ограничение, либо формировать список
// нодов из переменной $topics и использовать их в запросе как условие
// я пошёл по второму пути как более лёгкому
//
$nodes = "(";
foreach ($topics as $t) { $nodes.="$t->nid,"; }
$nodes = substr($nodes,0,-1).")";
$sql = "
SELECT n.nid,
COALESCE(c.subject,'') AS `replay`,
COALESCE(nc.totalcount,0) AS `views`
FROM {node} AS n
LEFT JOIN {comments} AS c ON c.nid = n.nid
LEFT JOIN {node_counter} AS nc ON nc.nid = n.nid
WHERE n.nid IN $nodes
";
$result = db_query(db_rewrite_sql($sql));
$nodereplay = array();
while ($nr = db_fetch_object($result)){
$nodereplay[$nr->nid]->replay = $nr->replay;
$nodereplay[$nr->nid]->views = $nr->views;
}
//
// я добавляю еще один столбец в заголовок таблицы - "кол-во просмотров",
// смещая остальные
//
$forum_topic_list_header[5] = $forum_topic_list_header[4];
$forum_topic_list_header[4] = $forum_topic_list_header[3];
$forum_topic_list_header[3] = array('data' => t('Reads'));
foreach ($topics as $topic) {
// folder is new if topic is new or there are new comments since last visit
if ($topic->tid != $tid) {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => check_plain($topic->title), 'class' => 'title'),
array('data' => l(t('This topic has been moved'), "forum/$topic->tid"), 'colspan' => '3')
);
}
else {
$rows[] = array(
array('data' => theme('forum_icon', $topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
array('data' => l($topic->title, "node/$topic->nid"), 'class' => 'topic'),
array('data' => $topic->num_comments . ($topic->new_replies ? '
'. l(format_plural($topic->new_replies, '1 new', 'count new'), "node/$topic->nid", NULL, NULL, 'new') : ''), 'class' => 'replies'),
//
// вот он добавленный столбец - Просмотры
//
array('data' => $nodereplay[$topic->nid]->views,'class'=> 'topic-views'),
array('data' => theme('forum_submitted', $topic),'class' => 'created'),
//
// а это изменённый столбец с указанием последнего комментария
//
array('data' => (isset($nodereplay[$topic->nid]->replay) ?
l ($nodereplay[$topic->nid]->replay,"node/$topic->nid",
array('title'=>$nodereplay[$topic->nid]->replay, 'class'=>'replay-topic') , NULL , 'new').
"
\n" : '') . theme('forum_submitted', $topic->last_reply ), 'class' => 'last-reply')
);
}
}
}
$output = theme('table', $forum_topic_list_header, $rows);
$output .= theme('pager', NULL, $forum_per_page, 0);
return $output;
}
?>
Андрей, к вам просьба огромная, может вы все-таки модуль создадите с этими апгрейдами?
Зачем модуль, это же шаблоны темы.
ну модуль продвинутого форума + функции в template.php
Если честно, охота сделать минимум "телодвижений", но чтобы форум смотрелся покруче.
Просто копируете функции в template.php
Движений минимум
модуль есть на эту тему http://drupal.org/project/advanced_forum
clubwave.ru, вы как сами использовали его, нареканий нет?
нареканий нет, как и альтернатив.. ну это не столкьо форум сколько проект по развыитию встроенного форума в основном при помощи стистемы шаблонов
то есть я этот код вставила в template.php. но у меня вот такое вышло
проверьте, что Вы этот код вставили в нужной кодировке (обычно utf8).