Главная - Дневник - Друпализмы. Выводим комментарии на отдельной странице
 

Друпализмы. Выводим комментарии на отдельной странице

Довольно странно, что в Друпале до сих пор никто не реализовал такую полезную и нужную многим функцию, как вывод комментариев на отдельной странице. В настройках модуля comment.module есть лишь опция позволяющая выводить на отдельной странице форму для отправки комментариев, однако сами сообщения всегда рисуются на той же странице, что и нода.

Первое что приходит на ум это лезть в код модуля и чего-то там хачить. Однако сам по себе такой подход не верный. Позволить себе хачить можно разве что сторонний модуль, который не входит в поставку Друпала. Да и то я иду на такое лишь в крайних случаях, если масштаб правок предполагается довольной большой (это уже назsвается создание своего модуля на основе чужого). В нашем же случае лучше обойтись без хаков, тем более что способы есть. Один из них я использовал в реальном проекте.

Основан этот способ на возможности создавать в Друпале так называемые «снипеты», или вставки php-кода в текст ноды. Задачу по выводу комментариев на отдельной странице я сам для себя сформулировал так:

1. Комментарии выводятся на странице с адресом /comments?nid=x, где x — это номер ноды, которой принадлежат комментарии.

2. На странице с нодой генерировать ссылку «Прочитать комментарии», которая ведет на отдельную страницу с комментариями к этой ноде.

Первое что нужно сделать, это создать новую ноду типа story и присвоить ей алиас comments. В эту ноду вставляем php-снипет следующего вида:

$max = 1000;
$nid = str_replace('/comments?nid=', '', $_SERVER['REQUEST_URI']);
$output = '';
if ($nid != $_SERVER['REQUEST_URI'])
{
  $query = 'SELECT nid,cid,name,comment,timestamp FROM {comments} com WHERE com.nid='.$nid.' order by timestamp desc ';
  $result = db_query_range($query, 0, $max);
  while ($comment = db_fetch_object($result))
  {
    $output .= '<strong>'.$comment->name.'</strong><br>';
    $output .= format_date($comment->timestamp, $type = 'custom', $format = 'Y-m-d H:i', $timezone = NULL);
    $output .= '<p>'.$comment->comment.'</p>';
  }
  $output .= '<a href="comment/reply/'.$nid.'#comment_form">Оставить отзыв</a> | ';
  $output .= '<a href="'.drupal_get_path_alias('node/'.$nid).'">Вернуться на страницу с описанием</a>';
  print $output;
}
else
{
  print 'А как вы сюда попали?';
}

В этом примере в переменную $max записывается максимальное количество комментариев, которые могут быть выведены на страницу. Я записал туда заведомо большее число. Этот подход удобен, если вам нужно вывести не все, а лишь 5 или 10 последних комментариев. Достаточно просто изменить $max. Далее скрипт получает из адресной строки значение параметра nid (номер ноды). Если нода была вызвана с параметром nid, то скрипт выполняет запрос к БД и получает комментарии для заданной ноды. В цикле while уже остается вопрос техники, вывести комментарии на страницу. В выводе используется полезная функция format_date() для форматирования даты из timestamp. Также обратите внимание на функцию drupal_get_path_alias(), которая позволяет определить алиас для ноды, если таковой существует. Ветка else в примере срабатывает если нода будет открыта без параметра nid. Я вставил туда вывод текстового сообщения ’А как вы сюда попали?’, ну а вы можете обрабатывать эту ситуацию иначе.

Вторая часть задачи, генерация ссылки «Прочитать комментарии» на странице с нодой, решается просто. В файл с темой, который отвечает за вывод ноды (обычно node.tpl.php), необходимо в нужное место вставить код вида:

print '<a href="comments?nid='.$nid.'">Прочитать комментарии</a>';

Обратите внимание, что в теме обычно простым условием различают вариант, когда нода показывается в списке других нод из того же терма таксономии, и когда она выводится отдельно на всю страницу. Вышеприведенный кусочек кода нужно вставить в ту часть, которая отвечает за вывод ноды на отдельной странице, при этом не забудьте убрать там вывод переменной $links, иначе комментарии у вас будут и на отдельной странице, и на странице с нодой.

Евгений Тимашёв