УрокКак поменять направление списка комментариев и вынести форму комментариев наверх

По мало понятным мне причинам в седьмом Друпале нет возможности поменять направленость списка комментарив. Безусловно, для блогов вполне удобен "коробочный" вариант - старые комментарии вверху, новые внизу, а форма комментариев вообще в конце страницы. Однако могу привести пример сайта с сериалами: на одной странице есть плеер со всеми сериями сериала, а под ним располагаются комментарии. А теперь представьте, что серии постоянно добавляются в плеер, и в комментариях идёт живое обсуждение. И далеко не каждый пользователь захочет каждый раз пролистывать сотню-другую комментариев, чтобы почитать последние и/или написать своё мнение. И таких примеров можно привести много. Поэтому исключение возможности поменять направление комментариев, на мой взгляд, грубая ошибка. Однако что сделано - то сделано, и сейчас я расскажу как восстановить справедливость.

Шаг первый. Меняем направление списка комментариев.

Первое, что надо сделать, это имплементировать в своём модуле 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';
    }
  }
}

Снова сброс кэша - профит!

Шаг четвёртый. Полёт фантазии.

Теперь, в качестве самостоятельной работы, остаётся темизировать форму комментариев и сами комментарии в наиболее красивом варианте. В одной из своих последних работ я сделал комментарии наподобие вконтактовских:

comments.png

Удачи в разработке!

Комментарии

Аватар пользователя drup.by
drup.by написал:

А темизацию формы комментирования comment-form как лучше делать :
с помощью hook_form_FORM_ID_alter или с помощью hook_theme и добавления функции темизации для формы (к примеру theme_comment_form) ?
Я имею ввиду оборачивание элементов в определенные теги и скрытие ненужных элементов .

30.05.2012 23:38
Аватар пользователя Spleshka
Spleshka написал:

По сути можно делать и там и там. Но более правильно это делать в функциях темизации - т.к. это непосредственно относится ко внешнему виду формы. Плюс она гарантировано отработает после выполнения всех альтеров формы, что дает уверенность в том, что к вам придет уже обработанная всеми модулями форма.

31.05.2012 03:38
Аватар пользователя unic
unic написал:

Поправьте: "Однако могу привести сайта с сериалами" :-)

31.05.2012 08:24
Аватар пользователя Spleshka
Spleshka написал:

Спасибо, поправил.

31.05.2012 17:45
Аватар пользователя bigferumdron
bigferumdron написал:

А как узнать, каким тегом помечена та или иная выборка из базы?

31.05.2012 16:58
Аватар пользователя Spleshka
Spleshka написал:

Посмотреть на запрос :) Вот например как собирается запрос для комментариев:

  $query = db_select('comment', 'c')->extend('PagerDefault');
  $query->addField('c', 'cid');
  $query
    ->condition('c.nid', $node->nid)
    ->addTag('node_access')
    ->addTag('comment_filter')
    ->addMetaData('node', $node)
    ->limit($comments_per_page);

Добавляется 2 тэга и даже нода в качестве метаданных.

31.05.2012 17:46
Аватар пользователя bigferumdron
bigferumdron написал:

если 2 тега добавлено, то можно любой из них юзать, так?

31.05.2012 22:44
Аватар пользователя Spleshka
Spleshka написал:

да

01.06.2012 01:22
Аватар пользователя drupalcafe_odessa
drupalcafe_odessa написал:

В случае нескольких страниц комментариев постоянная ссылка на комменты будет вести не туда куда нужно.

04.06.2012 22:12
Аватар пользователя Костик Корепин
Костик Корепин написал:

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

06.06.2012 15:21
Аватар пользователя bigferumdron@gmail.com
bigferumdron@gm... написал:

а что если нужно отфильтровать по какому-то дополнительному полю комментариев? которое добавлено... Это нужно как-то джоинить таблицу?

25.06.2012 20:00
Аватар пользователя Spleshka
Spleshka написал:

Да, просто добавляете таблицу с помощью join'a.

27.06.2012 15:10
Аватар пользователя Карлсон
Карлсон написал:

Если при таком подходе более одной страницы комментариев - т.е. включается пагинатор внизу, то добавление комментария даже после всех операций в статье - приводит к тому что пагинатор переключается на свою последнюю страницу, несмотря на то что комментарий добавился в начало списка. Как отключить этот авто-переход?

28.09.2012 02:53
Аватар пользователя Карлсон
Карлсон написал:

- тут мужик нашел решение!

04.10.2012 14:30
Аватар пользователя Карлсон
Карлсон написал:

http://www.drupal.ru/node/88787#comment-507040 - тут, в прошлый раз почему то ссылка не вставилась.

04.10.2012 14:31
Аватар пользователя Иван
Иван написал:

И всеж таки ваш способ не работает для ветвящихся комментариев. Или может как-то можно заставить его работать?

26.11.2012 04:21
Аватар пользователя Spleshka
Spleshka написал:

К сожалению, на данный момент ветвящиеся комментарии действительно не поддерживаются.

26.11.2012 20:49
Аватар пользователя Иван
Иван написал:

Нашел модуль sort_comments он решает проблему с ветвящимися комментариями

26.11.2012 23:07
Аватар пользователя Spleshka
Spleshka написал:

Занятно. Благодарю.

26.11.2012 23:26
Аватар пользователя WMaks
WMaks написал:

Давно пользуюсь связкой 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()" .
Что бы это могло быть.

03.12.2012 03:42
Аватар пользователя Spleshka
Spleshka написал:

Не все ajax команды имеют метод. Просто добавьте проверку:

/**
* Implements hook_ajax_render_alter().
*/
function ИМЯТЕМЫ_ajax_render_alter(&$commands) {
  foreach ($commands as $key => $command) {
    $method = isset($command['method']) ? $command['method'] : FALSE;
    $selector = isset($command['selector']) ? $command['selector'] : FALSE;
    if ($method == 'append' && $selector == '#comment-wrapper') {
      $commands[$key]['method'] = 'prepend';
    }
  }
}
03.12.2012 17:38
Аватар пользователя WMaks
WMaks написал:

Спасибо большое. Всё отлично работает :)

06.12.2012 01:10
Аватар пользователя Vedus
Vedus написал:

Голова кипит уже!!!
Как мне links Добавить комментарий перенести под комментарии??
Или форму комментариев поставить выше самих комментариев???

Уже нервы не выдерживают - 4-й день не могу сделать.

18.01.2013 23:38
Аватар пользователя Чингис Хуурак
Чингис Хуурак написал:

Всем день добрый!
Возник такой вопрос, поменять направление списка комментариев для конкретного типа материала. Спасибо!

20.01.2013 12:04
Аватар пользователя Чингис Хуурак
Чингис Хуурак написал:

Вопрос решен, воспользовался модулем Sort Comments, не смотря на dev работает норм.

20.01.2013 12:15
Аватар пользователя Иван
Иван написал:

Интересно, как все же сделать что ветвящиеся комментарии не переносились на другую страницу, то есть чтобы ветка полностью отображалась на одной странице? Очень нужно найти решение, может кто подскажет?

31.10.2013 02:44
Аватар пользователя макц
макц написал:

будьте добры, пните в направлении темизации комментариев, а конкретно вывода username над комментарием, а не сбоку

15.01.2014 13:27
Аватар пользователя tor
tor написал:

Что значит имя модуля ?

02.11.2014 08:58
Аватар пользователя tor
tor написал:

Делаю как у вас в первом но пишет ошибку на последнем не могли бы вы сказать правильно ли я понимаю что в имени модуля нужно писать имя файла ? и cjmment filtre у всех такой тег или нет и что делать если у меня нет тега по выборке комментариев из базы ?

02.11.2014 09:49
Аватар пользователя animous
animous написал:

Применил хук для аякса, но комментарии все равно добавляются в конец. В чем проблема? Название темы прописал.

24.07.2015 08:28
Аватар пользователя alfaq
alfaq написал:

Спасибо, уважаемый!
Ajax не работает, добавляет в конец
В общем начал копаться в модуле Ajax comments и увидел там строку
// Check sort by comment_goodness.
там шла проверка переменной, но самой переменно установки не было, задав в гугл получил модуль https://www.drupal.org/project/comment_goodness
Этот модуль певернет комменты, выведет форму вверх и решит проблему с пейджером комментов. Настраивается в Типе материала.
остается вопрос по ajax переключению пейджера, либо подгрузке комментов

07.08.2015 15:02

Комментировать