Зашел на форум и подумал: неудобно как-то - нельзя посомтреть новые сообщения только для форума. Трекер общий, все в кучу валится. Отсеять сообщения по типу материала или автору нельзя. Разве что отсортировать, но это все не то. И решил убить котенка.
Открыл tracker.module, вписал в функцию tracker_menu() следующее:
<?php
$items['tracker/forum'] = array(
'title' => 'Recent topics',
'page callback' => 'tracker_page_forum',
'access arguments' => array('access content'),
'weight' => 1,
'file' => 'tracker.pages.inc',
); ?>
Затем открыл tracker.pages.inc, скопировал функцию tracker_page() в tracker_page_forum() и привел ее к такому виду:
<?php
/**
* Показывает обновленные или новые темы форума.
* В запросы добавлено AND n.type = \'forum\' чтобы отсеять форумские сообщения
*/
function tracker_page_forum($account = NULL, $set_title = FALSE) {
// Add CSS
drupal_add_css(drupal_get_path('module', 'tracker') .'/tracker.css', 'module', 'all', FALSE);
if (
$account) {
if ($set_title) {
// When viewed from user/%user/track, display the name of the user
// as page title -- the tab title remains Track so this needs to be done
// here and not in the menu definiton.
drupal_set_title(check_plain($account->name));
}
// TODO: These queries are very expensive, see http://drupal.org/node/105639
$sql = 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND n.type = \'forum\' AND (n.uid = %d OR c.uid = %d) ORDER BY last_updated DESC';
$sql = db_rewrite_sql($sql);
$sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND n.type = \'forum\' AND (n.uid = %d OR c.uid = %d)';
$sql_count = db_rewrite_sql($sql_count);
$result = pager_query($sql, 25, 0, $sql_count, COMMENT_PUBLISHED, $account->uid, $account->uid);
}
else {
$sql = 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE n.status = 1 AND n.type = \'forum\' ORDER BY last_updated DESC';
$sql = db_rewrite_sql($sql);
$sql_count = 'SELECT COUNT(n.nid) FROM {node} n WHERE n.status = 1 AND n.type = \'forum\'';
$sql_count = db_rewrite_sql($sql_count);
$result = pager_query($sql, 25, 0, $sql_count);
}
$rows = array();
while ($node = db_fetch_object($result)) {
// Determine the number of comments:
$comments = 0;
if ($node->comment_count) {
$comments = $node->comment_count;
if (
$new = comment_num_new($node->nid)) {
$comments .= '<br />';
$comments .= l(format_plural($new, '1 new', 'count new'), "node/$node->nid", array('query' => comment_new_page_count($node->comment_count, $new, $node), 'fragment' => 'new'));
}
}
// Добавим проверку чтобы показывать лишь обновленные или новые темы форума
if ($new) $rows[] = array(
check_plain(node_get_types('name', $node->type)),
l($node->title, "node/$node->nid") .' '. theme('mark', node_mark($node->nid, $node->changed)),
theme('username', $node),
array('class' => 'replies', 'data' => $comments),
t('!time ago', array('!time' => format_interval(time() - $node->last_updated)))
);
}
if (!
$rows) {
$rows[] = array(array('data' => t('No posts available.'), 'colspan' => '5'));
}
$header = array(t('Type'), t('Post'), t('Author'), t('Replies'), t('Last updated'));
$output = '<div id="tracker">';
$output .= theme('table', $header, $rows);
// Чтобы не показывался левый пейджер, задаем макс. число элементов (count($rows))
$output .= theme('pager', NULL, 25, count($rows));
$output .= '</div>';
return
$output;
}
?>
Одним котенком меньше, зато «Новые сообщения» для форума есть
Любителям котят предлагаю рассказать почему подобные типы сортировок недоступны из ядра и не добавляются другими модулями?
Комментарии
Как любитель котят настоятельно рекомендую Views
Не люблю Views и считаю, что все обновления должны отслеживаться через модуль Tracker, ибо зачем плодить сущности?
Так а зачем было трогать котят, если это можно было сделать в своем модуле?
а я трекер как модуль отключил, ибо не русский он (3новый), а еще не работала ссылка "мои публикации"
Я не умею
Да по большому счету вы уже все сделали.
1. Создайте папку (напр., chemical_tracker),
2. в ней файл chemical_tracker.info с таким содержанием:
description = Chemical Tracker rocks!
core = 6.x
3. Потом еще файл chemical_tracker.module, в котором впишите:
function chemical_tracker_menu() {
// Вставьте пункт меню описанный в статье (но без атрибута 'file')
}
// А сюда полностью функцию, которая в статье, но сразу в
// начале функции пропишите такое (без коммента, естественно):
//
// module_load_include( 'inc', 'tracker', 'tracker.pages');
И все! Делов-то.
Химический Али, как проделаешь что написал neochief — воскреси котенка плиз
Ааааааааа.....
пасть порву за котят.
ЗЫ. а еще есть такой хук: "hook_menu_alter"
http://api.drupal.org/api/function/hook_menu_alter/6
Али, напиши модуль и похорони котенка на индейском кладбище.
Пытаюсь сделать модуль. Устанавливается, но в меню соотв. пункта не появляется. Перехожу по tracker/forum - страница не найдена.
forum_tracker.info
<?php
name = Forum Tracker
description = Makes «New Messages» page.
dependencies[] = forum
dependencies[] = tracker
package = Other
version = 6.x-0.1
core = 6.x
?>
forum_tracker.module
<?php /**
* Implementation of hook_help().
*/
function forum_tracker_help($path, $arg) {
switch ($path) {
case 'admin/help#forum_tracker':
$output = '<p>'. t('The Forum Tracker module allows you to see new topics and replies in the forum as in the tracker.') .'</p>';
return $output;
}
} /**
* Implementation of hook_menu().
*/
function forum_tracker_menu() {
$items['tracker/forum'] = array(
'title' => 'Recent topics and replies',
'page callback' => 'tracker_page_forum',
'access arguments' => array('access content'),
'weight' => 1,
);
}
/**
* Shows new topics and replies in the forum.
*/
function tracker_page_forum($account = NULL, $set_title = FALSE) {
module_load_include( 'inc', 'tracker', 'tracker.pages');
// как и раньше
}?>
Может стоит добавить в хук меню :
'type' => MENU_CALLBACK
Нужно делать так:
<?php
function forum_tracker_menu() {
$items['tracker/forum'] = array(
'title' => 'Recent topics and replies',
'page callback' => 'tracker_page_forum',
'access arguments' => array('access content'),
'weight' => 1,
);
return $items;
}?>
функция должна возвращать итемы
и не забудьте сделать сброс кеша или зайти на страницу со списком модулей, т.к. меню кешируется.
Да, родил про возврат сам еще до падения сайта, потом не мог отписаться Большое спасибо.
Новая проблема: желаю добавить ссылку на это вверху форума, там, где он выводит ссылку на создание новой темы.
Ссылка на добавление темы выводится в forums.tpl.php, а определяется в модуле forum функцией function template_preprocess_forums(&$variables).
Как мне туда врубиться из своего модуля и добавить свою ссылку?
print_r($variables);
// и дальше смотрим куда что вставлять
}
Только нужно почистить кеш после добавления функции.
Большое спасибо за помощь всем, и особенно Neochief!
В результате родился модуль forum_tracker. Он вставляет над списком форумов ссылку на страницу, где выводится список новых тем и сообщений на форуме аля трекер.
Модуль в приложении. Прошу погонять и сообщить об ошибках.
Попробуем, спасибо!