Мне нужно, чтобы при размещении комментария к ноде, пользователь мог бы сам указывать дату комментария, даже например прошлогоднюю дату. И при этом чтобы комментарии сортировались по этой дате в порядке убывания. Я добавил к комментариям дополнительное поле типа Дата и тем самым вроде бы решил часть проблемы, пользователь может теперь указывать дату комментария. Но по сути у комментариев уже и так есть системная дата, которая выводится в шаблоне как {{ created }}.
Тогда в шаблоне в функции preprocess_comment я приравнял значения доп. поля "дата" к системным датам {{ created }} :
$variables['created'] = $comment->field_data[0]->view('full');
И вроде бы часть проблемы решена. Пользователи сами вводят дату и эта дата выводится к каждому комментарию как системная. Но остаётся вторая часть проблемы - комментарии не сортируются по этой дате, т.е. я как понял drupal вообще не сортирует комментарии по дате, он сортирует их по порядковому номеру добавления, т.е. по cid. Поэтому прошу подсказать как можно отсортировать комментарии. Я пробовал в preprocess_comment предоопределить цикл вывода комментариев и потом отсортировать их по дате. Но ничего не получается, в программировании я не силён (изучаю drupal только месяц). Прошу подсказать как это сделать или если я не в правильном направлении, то натолкнуть как это правильно реализовать?
Комментарии
Все правильно понял. Комментарии в Drupal вообще стремные (что в 7-ом, что в 8-ом). Как впрочем и твоя задача Но молодец, чо. Изучаешь один месяц, а друпал вертишь как будто два:)
Порядок можешь задать с помощью hook_query_TAG_alter(). Вот пробный модулёк (только название поля свое укажи).
<?php
/**
* @file
* A description of what your module does.
*/ use Drupal\Core\Database\Query\AlterableInterface; /**
* Implements hook_query_TAG_alter().
*
*/
function anarchy_comments_query_comment_filter_alter(AlterableInterface $query) {
$query->join("comment__$field_order", 'd', 'd.entity_id = c.cid');
$orderby =& $query->getOrderBy();
unset($orderby['torder']);
$orderby['d.'.$field_order.'_value'] = 'DESC';
}
}
?>
Изменил название поля на своё, но порядок комментариев не меняется.
Если строку $orderby['d.'.$field_order.'_value'] = 'DESC'; заменить на $orderby['c.cid'] = 'DESC'; то комментарии сортируются в обратном порядке, но не по полю. Всё перепробовал, ничего не получается.
Глянь в базе данных в таблице comment (там можно развернуть её) точное название. Либо скриншоты выложи. Либо поставь devel и выведи dsm($query) и посмотри какие там поля.
по базе уже всё проверил, название таблицы и полей совпадает с теми, что прописаны в модуле. Была даже мысль, что не работает из-за того, что поле "дата" в базе хранится в формате даты, а не как число.
нет, формат даты не имеет значения. Можно попробовать вывести содержимое $orderby, может там еще какое-то поле для сортировки. Или может какие-то предыдущие действия мешают. Например
Я ж тебе не с мобилы по памяти код печатал, а взял рабочий, еще горячий
помогло это: unset($orderby['c.cid']);
благодарю за помощь.
Возникла потребность сделать разную сортировку для каждого типа комментариев. Чтобы модуль сработал только например, для комментариев форума "comment_forum" добавил такое условие:
$node = \Drupal::routeMatch()->getParameter('node');
if ($node->comment_forum[0]) {код сортировки}
Вроде работает, но может есть более правильный способ как это сделать?