Улучшаем форум. Часть 3

Главные вкладки

Аватар пользователя selff selff 27 декабря 2007 в 19:26

Часть 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;
}
?>

продолжение следует...

Комментарии

Аватар пользователя Separator@drupal.org Separator@drupal.org 28 декабря 2007 в 5:49

Отлично работает Smile Только $forum_topic_list_header[3] = array('data' => 'Просмотров'); заменил на $forum_topic_list_header[3] = array('data' => t('Reads')); иначе кодировка глючила, приходилось файл в utf8 сохранять, а так в любом случае работает, да и как-то более грамотно

Аватар пользователя job job 30 декабря 2007 в 13:32

Этот вариант для форума 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;
}
?>

Аватар пользователя sza sza 31 декабря 2007 в 18:21

ну модуль продвинутого форума + функции в template.php

Если честно, охота сделать минимум "телодвижений", но чтобы форум смотрелся покруче. Smile

Аватар пользователя clubwave.ru clubwave.ru 3 января 2008 в 21:25

нареканий нет, как и альтернатив.. ну это не столкьо форум сколько проект по развыитию встроенного форума в основном при помощи стистемы шаблонов