УрокКак поменять направление списка комментариев и вынести форму комментариев наверх
По мало понятным мне причинам в седьмом Друпале нет возможности поменять направленость списка комментарив. Безусловно, для блогов вполне удобен "коробочный" вариант - старые комментарии вверху, новые внизу, а форма комментариев вообще в конце страницы. Однако могу привести пример сайта с сериалами: на одной странице есть плеер со всеми сериями сериала, а под ним располагаются комментарии. А теперь представьте, что серии постоянно добавляются в плеер, и в комментариях идёт живое обсуждение. И далеко не каждый пользователь захочет каждый раз пролистывать сотню-другую комментариев, чтобы почитать последние и/или написать своё мнение. И таких примеров можно привести много. Поэтому исключение возможности поменять направление комментариев, на мой взгляд, грубая ошибка. Однако что сделано - то сделано, и сейчас я расскажу как восстановить справедливость.
Шаг первый. Меняем направление списка комментариев.
Первое, что надо сделать, это имплементировать в своём модуле hook_query_TAG_alter(). Выборка комментарив из базы помечена тэгом comment_filter, чем мы и воспользуемся:
/** * Implements hook_query_TAG_alter(). */ function ИМЯМОДУЛЯ_query_comment_filter_alter(QueryAlterableInterface $query) { // Убираем сортировку по умолчанию. $order =& $query->getOrderBy(); unset($order['torder']); // Выставляем правильную сортировку. $query->orderBy('c.cid', 'DESC'); }
После сброса кэша список всех ваших комментариев поменяет своё направление (новые будут сверху). Но теперь надо и форму комментариев перебросить наверх, а то нелогично получается - комменты сверху, а форма комментов снизу.
Шаг второй. Меняем положение формы комментариев.
Для того, чтобы вынести форму комментариев над списком комментариев, достаточно создать в корне темы файл comment-wrapper.tpl.phpс вот таким содержимым:
<div id="comments" class="<?php print $classes; ?>"<?php print $attributes; ?>> <?php if ($content['comment_form']): ?> <h2 class="title comment-form"><?php print t('Add new comment'); ?></h2> <?php print render($content['comment_form']); ?> <?php endif; ?> <?php if ($content['comments'] && $node->type != 'forum'): ?> <?php print render($title_prefix); ?> <h2 class="title"><?php print t('Comments'); ?></h2> <?php print render($title_suffix); ?> <?php endif; ?> <?php print render($content['comments']); ?> </div>
По сути, я взял файл comment-wrapper.tpl.php из модуля ядра comment и скопировал его в корень темы. После чего поменял местами вывод списка комментариев и формы комментариев.
После сброса кэша форма появиться над списком комментариев.
Шаг третий. Плюшки.
Первых двух шагов для выполнения поставленной задачи вполне хватает. Однако я бы предложил добавить удобства при работе с комментариями и поставить модуль ajax comments. После его установки комментарии будут добавляться в список без перезагрузки страницы - красиво, чёрт побери! Но есть один нюанс - комментарии будут добавляться в конец списка (как и предполагалось комментариям из "коробки"). Для того, чтобы комменты добавлялись в начало списка, нужно имплементировать в своём модуле ещё один хук, который меняет поведение модуля ajax comments:
/** * Implements hook_ajax_render_alter(). */ function ИМЯМОДУЛЯ_ajax_render_alter(&$commands) { foreach ($commands as $key => $command) { if ($command['method'] == 'append' && $command['selector'] == '#comment-wrapper') { $commands[$key]['method'] = 'prepend'; } } }
Снова сброс кэша - профит!
Шаг четвёртый. Полёт фантазии.
Теперь, в качестве самостоятельной работы, остаётся темизировать форму комментариев и сами комментарии в наиболее красивом варианте. В одной из своих последних работ я сделал комментарии наподобие вконтактовских:
Удачи в разработке!
- Spleshka
- 30.05.2012
- 23086
Комментарии
А темизацию формы комментирования comment-form как лучше делать :
с помощью hook_form_FORM_ID_alter или с помощью hook_theme и добавления функции темизации для формы (к примеру theme_comment_form) ?
Я имею ввиду оборачивание элементов в определенные теги и скрытие ненужных элементов .
По сути можно делать и там и там. Но более правильно это делать в функциях темизации - т.к. это непосредственно относится ко внешнему виду формы. Плюс она гарантировано отработает после выполнения всех альтеров формы, что дает уверенность в том, что к вам придет уже обработанная всеми модулями форма.
Поправьте: "Однако могу привести сайта с сериалами" :-)
Спасибо, поправил.
А как узнать, каким тегом помечена та или иная выборка из базы?
Посмотреть на запрос :) Вот например как собирается запрос для комментариев:
Добавляется 2 тэга и даже нода в качестве метаданных.
если 2 тега добавлено, то можно любой из них юзать, так?
да
В случае нескольких страниц комментариев постоянная ссылка на комменты будет вести не туда куда нужно.
Сделал как у Вас написано!В принципе все работает, но есть одно НО. Когда добавляешь ответы к комментариям то в начале они становятся правильно ну то есть под тем комментарием на который ты отвечаешь, а после перезагрузки страницы поднимается в самый вверх.Не подскажите как с этим бороться?
а что если нужно отфильтровать по какому-то дополнительному полю комментариев? которое добавлено... Это нужно как-то джоинить таблицу?
Да, просто добавляете таблицу с помощью join'a.
Если при таком подходе более одной страницы комментариев - т.е. включается пагинатор внизу, то добавление комментария даже после всех операций в статье - приводит к тому что пагинатор переключается на свою последнюю страницу, несмотря на то что комментарий добавился в начало списка. Как отключить этот авто-переход?
- тут мужик нашел решение!
http://www.drupal.ru/node/88787#comment-507040 - тут, в прошлый раз почему то ссылка не вставилась.
И всеж таки ваш способ не работает для ветвящихся комментариев. Или может как-то можно заставить его работать?
К сожалению, на данный момент ветвящиеся комментарии действительно не поддерживаются.
Нашел модуль sort_comments он решает проблему с ветвящимися комментариями
Занятно. Благодарю.
Давно пользуюсь связкой Sort comments, AJAX Comments,
/**
* Implements hook_ajax_render_alter().
*/
function ИМЯТЕМЫ_ajax_render_alter(&$commands) {
foreach ($commands as $key => $command) {
if ($command['method'] == 'append' && $command['selector'] == '#comment-wrapper') {
$commands[$key]['method'] = 'prepend';
}
}
}
Но, в последнее время вылезает замечание "Notice: Undefined index: method в функции ИМЯТЕМЫ_ajax_render_alter()" .
Что бы это могло быть.
Не все ajax команды имеют метод. Просто добавьте проверку:
Спасибо большое. Всё отлично работает :)
Голова кипит уже!!!
Как мне links Добавить комментарий перенести под комментарии??
Или форму комментариев поставить выше самих комментариев???
Уже нервы не выдерживают - 4-й день не могу сделать.
Всем день добрый!
Возник такой вопрос, поменять направление списка комментариев для конкретного типа материала. Спасибо!
Вопрос решен, воспользовался модулем Sort Comments, не смотря на dev работает норм.
Интересно, как все же сделать что ветвящиеся комментарии не переносились на другую страницу, то есть чтобы ветка полностью отображалась на одной странице? Очень нужно найти решение, может кто подскажет?
будьте добры, пните в направлении темизации комментариев, а конкретно вывода username над комментарием, а не сбоку
Что значит имя модуля ?
Делаю как у вас в первом но пишет ошибку на последнем не могли бы вы сказать правильно ли я понимаю что в имени модуля нужно писать имя файла ? и cjmment filtre у всех такой тег или нет и что делать если у меня нет тега по выборке комментариев из базы ?
Применил хук для аякса, но комментарии все равно добавляются в конец. В чем проблема? Название темы прописал.
Спасибо, уважаемый!
Ajax не работает, добавляет в конец
В общем начал копаться в модуле Ajax comments и увидел там строку
// Check sort by comment_goodness.
там шла проверка переменной, но самой переменно установки не было, задав в гугл получил модуль https://www.drupal.org/project/comment_goodness
Этот модуль певернет комменты, выведет форму вверх и решит проблему с пейджером комментов. Настраивается в Типе материала.
остается вопрос по ajax переключению пейджера, либо подгрузке комментов
Комментировать