У Drupal есть многолетняя проблема, которую разработчики по каким-то причинам не хотят решать: в случае, если комментарии занимают несколько страниц, неправильно формируются ссылки к новым комментариям в трекере и при переход по такой ссылке открывается первая страница комментариев, хотя пользователь ожидает открытия новых. Здесь описывается применение патча, который разрешает эту проблему.
К сожалению, без правки модулей не обойтись, но вроде и не ядро
Затрагиваемые файлы
modules/comments/comment.module
modules/forum/forum.module
modules/tracker/tracker.module
Поехали
1) Открываем файл modules/comments/comment.module, переходим к строке 315,
заменяем код
<?php
'href' => "node/$node->nid",
?>
на следующий:
<?php
'href' => "node/$node->nid",
'query' => comment_new_page_count($all, $new, $node->nid),
?>
1а) Переходим в конец файла, ниже всего существующего кода вставляем описание новой функции:
<?php
/**
* New function to calculate page number for first new comment.
*/
function comment_new_page_count($num_comments, $new_replies, $nid) {
$comments_per_page = _comment_get_display_setting('comments_per_page');
$mode = _comment_get_display_setting('mode');
$order = _comment_get_display_setting('sort');
$pagenum = NULL;
if ($num_comments <= $comments_per_page || ($mode<3 && $order == 1)) {
//Only one page of comments or flat forum and newest first.
//First new comment will always be on first page
$pageno = 0;
}
else {
if ($mode < 3){
//Flat comments and oldest first
$count = $num_comments - $new_replies;
}
else {
//Threaded comments. See the documentation for comment_render().
if ($order == 1) {
//Newest first: find the last thread with new comment
$result = db_query('(SELECT thread FROM {comments} WHERE nid = %d AND status = 0 ORDER BY timestamp DESC LIMIT %d) ORDER BY thread DESC LIMIT 1', $nid, $new_replies);
$thread = db_result($result);
$result_count = db_query("SELECT COUNT(*) FROM {comments} WHERE nid = %d AND status = 0 AND thread > '" . $thread . "'", $nid);
}
else {
//Oldest first: find the first thread with new comment
$result = db_query('(SELECT thread FROM {comments} WHERE nid = %d AND status = 0 ORDER BY timestamp DESC LIMIT %d) ORDER BY SUBSTRING(thread, 1, (LENGTH(thread) - 1)) LIMIT 1', $nid, $new_replies);
$thread = substr(db_result($result), 0, -1);
$result_count = db_query("SELECT COUNT(*) FROM {comments} WHERE nid = %d AND status = 0 AND SUBSTRING(thread, 1, (LENGTH(thread) - 1)) < '" . $thread . "'", $nid);
}
$count = db_result($result_count);
}
$pageno = $count / $comments_per_page;
}
if ($pageno >= 1) {
$pagenum = "page=" . intval($pageno);
}
return $pagenum;
}
?>
2) Открываем файл modules/forum/forum.module, переходим к строке 1001,
заменяем строку
<?php
array('data' => $topic->num_comments . ($topic->new_replies ? '<br />'. l(format_plural($topic->new_replies, '1 new', 'count new'), "node/$topic->nid", NULL, NULL, 'new') : ''), 'class' => 'replies'),
?>
на строку
<?php
array('data' => $topic->num_comments . ($topic->new_replies ? '<br />'. l(format_plural($topic->new_replies, '1 new', 'count new'), "node/$topic->nid", NULL, comment_new_page_count($topic->num_comments, $topic->new_replies, $topic->nid), 'new') : ''), 'class' => 'replies'),
?>
3) Открываем файл modules/tracker/tracker.module, переходим к строке 104,
меняем код
<?php
$comments .= l(format_plural($new, '1 new', 'count new'), "node/$node->nid", NULL, NULL, 'new');
?>
на следующий:
<?php
$comments .= l(format_plural($new, '1 new', 'count new'), "node/$node->nid", NULL, comment_new_page_count($node->comment_count, $new, $node->nid), 'new');
?>
4) Сохраняем изменения во всех файлах, не забыв сделать это в кодировке UTF8, заливаем на хост, сбрасываем кеш, любуемся результатом.
Источник:
http://drupal.org/files/issues/threaded.patch.txt
Примечание: строки "<?php" и "?>" копировать не надо.
Комментарии
Может стоит на друпал.орг написать?
Смотрите "Источник:"
не заметил
Как это сделать для Drupal 5? После вставки большого кода вниз страницы - сайт перестает работать.
Спасибо за материал! Хм, как я понимаю, в версии 6.7 такой проблемы уже нет, потому что при переходе из трекера я попадаю на правильную страницу комментариев. Зато у меня некоторые пользователи жалуются на редирект — говорят, что Друпал их перекидывает на первую страницу комментариев даже тогда, когда сам комментарий должен появиться на второй странице. При этом у меня лично всё в порядке. Думаю, где искать ошибку.
Спасибо за решение. К сожалению, оно устарело для новых версий шестерки. Ищу подходящий патч - пока безрезультатно.
на drupal 5, с установленным модулем Advanced forum не работает
Возникла данная проблема в версии 6.16
Я так понимаю что в последних версиях друпала этот патч не работает. Перекопал друпал.орг однако решения так и не нашёл. Неужели больше ни у кого не возникало такой проблемы за последний год?
бред. И главное не нужно никому. Неужели ни у кого нет хорошо посещаемых сайтов с последними комментами??? очень странно.
Такой только у [user=Sinkora]
Решение нашлось?
Нет в этом месте такого кода. Drupal 6.20.
Тем более модуль лежит в папке comment, а не comments. Этот кусок там встречается ДВА раза на строке 420 и 430. Заменять обе?
В остальных файлах даже строчек таких нет!
forum.module - 952 строки
tracker.module - 76 строк
Искомых кусков кода нет.
Выходит ваше решение - шляпа.
Выходит — вы не обращаете внимание на дату публикации оригинального поста.
жаль, что никто не смог решить проблему. вот дела. Даже за деньги не решается.