Друпализмы. Выводим комментарии на отдельной странице
26.01.07Довольно странно, что в Друпале до сих пор никто не реализовал такую полезную и нужную многим функцию, как вывод комментариев на отдельной странице. В настройках модуля comment.module есть лишь опция позволяющая выводить на отдельной странице форму для отправки комментариев, однако сами сообщения всегда рисуются на той же странице, что и нода.
Первое что приходит на ум это лезть в код модуля и чего-то там хачить. Однако сам по себе такой подход не верный. Позволить себе хачить можно разве что сторонний модуль, который не входит в поставку Друпала. Да и то я иду на такое лишь в крайних случаях, если масштаб правок предполагается довольной большой (это уже назsвается создание своего модуля на основе чужого). В нашем же случае лучше обойтись без хаков, тем более что способы есть. Один из них я использовал в реальном проекте.
Основан этот способ на возможности создавать в Друпале так называемые «снипеты», или вставки php-кода в текст ноды. Задачу по выводу комментариев на отдельной странице я сам для себя сформулировал так:
1. Комментарии выводятся на странице с адресом /comments?nid=x, где x это номер ноды, которой принадлежат комментарии.
2. На странице с нодой генерировать ссылку «Прочитать комментарии», которая ведет на отдельную страницу с комментариями к этой ноде.
Первое что нужно сделать, это создать новую ноду типа story и присвоить ей алиас comments. В эту ноду вставляем php-снипет следующего вида:
$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), необходимо в нужное место вставить код вида:
Обратите внимание, что в теме обычно простым условием различают вариант, когда нода показывается в списке других нод из того же терма таксономии, и когда она выводится отдельно на всю страницу. Вышеприведенный кусочек кода нужно вставить в ту часть, которая отвечает за вывод ноды на отдельной странице, при этом не забудьте убрать там вывод переменной $links, иначе комментарии у вас будут и на отдельной странице, и на странице с нодой.
Евгений Тимашёв