Правильный редирект к новым комментариям (работа над ошибками Drupal)

Аватар пользователя Химический Али Химический Али 6 ноября 2008 в 17:23

У 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<&& $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"NULLNULL'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"NULLcomment_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"NULLNULL'new');
?>

на следующий:

<?php
$comments 
.= l(format_plural($new'1 new''count new'), "node/$node->nid"NULLcomment_new_page_count($node->comment_count$new$node->nid), 'new');
?>

4) Сохраняем изменения во всех файлах, не забыв сделать это в кодировке UTF8, заливаем на хост, сбрасываем кеш, любуемся результатом.

Источник:

http://drupal.org/files/issues/threaded.patch.txt

Примечание: строки "<?php" и "?>" копировать не надо.

0 Thanks

Комментарии

Аватар пользователя НовичОК НовичОК 9 января 2009 в 18:33

Как это сделать для Drupal 5? После вставки большого кода вниз страницы - сайт перестает работать.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 10 января 2009 в 13:34

Спасибо за материал! Хм, как я понимаю, в версии 6.7 такой проблемы уже нет, потому что при переходе из трекера я попадаю на правильную страницу комментариев. Зато у меня некоторые пользователи жалуются на редирект — говорят, что Друпал их перекидывает на первую страницу комментариев даже тогда, когда сам комментарий должен появиться на второй странице. При этом у меня лично всё в порядке. Думаю, где искать ошибку.

Аватар пользователя Jishnu@drupal.org Jishnu@drupal.org 9 июня 2009 в 10:03

Спасибо за решение. К сожалению, оно устарело для новых версий шестерки. Ищу подходящий патч - пока безрезультатно. :(

Аватар пользователя chegor86 chegor86 26 апреля 2010 в 23:19

Возникла данная проблема в версии 6.16
Я так понимаю что в последних версиях друпала этот патч не работает. Перекопал друпал.орг однако решения так и не нашёл. Неужели больше ни у кого не возникало такой проблемы за последний год?

Аватар пользователя НовичОК НовичОК 10 октября 2010 в 17:29

бред. И главное не нужно никому. :) Неужели ни у кого нет хорошо посещаемых сайтов с последними комментами??? очень странно.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 10 октября 2010 в 19:19
"НовичОК" wrote:

бред. И главное не нужно никому. :) Неужели ни у кого нет хорошо посещаемых сайтов с последними комментами??? очень странно.

Такой только у [user=Sinkora]

Аватар пользователя big boy big boy 23 декабря 2012 в 12:25
"Химический Али" wrote:

1) Открываем файл modules/comments/comment.module, переходим к строке 315,
заменяем код
<?php
               'href' => "node/$node->nid",
?>

Нет в этом месте такого кода. Drupal 6.20.
Тем более модуль лежит в папке comment, а не comments. Этот кусок там встречается ДВА раза на строке 420 и 430. Заменять обе?

Аватар пользователя big boy big boy 23 декабря 2012 в 12:27

В остальных файлах даже строчек таких нет!
forum.module - 952 строки
tracker.module - 76 строк

Искомых кусков кода нет.
Выходит ваше решение - шляпа.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 25 декабря 2012 в 2:58
big boy wrote:

В остальных файлах даже строчек таких нет!
forum.module - 952 строки
tracker.module - 76 строк

Искомых кусков кода нет.
Выходит ваше решение - шляпа.

Выходит — вы не обращаете внимание на дату публикации оригинального поста.