Сортировка комментариев по дополнительному полю типа Дата

Главные вкладки

Аватар пользователя alexboy alexboy 7 февраля 2016 в 12:30

Мне нужно, чтобы при размещении комментария к ноде, пользователь мог бы сам указывать дату комментария, даже например прошлогоднюю дату. И при этом чтобы комментарии сортировались по этой дате в порядке убывания. Я добавил к комментариям дополнительное поле типа Дата и тем самым вроде бы решил часть проблемы, пользователь может теперь указывать дату комментария. Но по сути у комментариев уже и так есть системная дата, которая выводится в шаблоне как {{ created }}.

Тогда в шаблоне в функции preprocess_comment я приравнял значения доп. поля "дата" к системным датам {{ created }} :
$variables['created'] = $comment->field_data[0]->view('full');

И вроде бы часть проблемы решена. Пользователи сами вводят дату и эта дата выводится к каждому комментарию как системная. Но остаётся вторая часть проблемы - комментарии не сортируются по этой дате, т.е. я как понял drupal вообще не сортирует комментарии по дате, он сортирует их по порядковому номеру добавления, т.е. по cid. Поэтому прошу подсказать как можно отсортировать комментарии. Я пробовал в preprocess_comment предоопределить цикл вывода комментариев и потом отсортировать их по дате. Но ничего не получается, в программировании я не силён (изучаю drupal только месяц). Прошу подсказать как это сделать или если я не в правильном направлении, то натолкнуть как это правильно реализовать?

Лучший ответ

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 8 февраля 2016 в 1:31
1

alexboy wrote:

Но остаётся вторая часть проблемы - комментарии не сортируются по этой дате, т.е. я как понял drupal вообще не сортирует комментарии по дате, он сортирует их по порядковому номеру добавления, т.е. по cid. Поэтому прошу подсказать как можно отсортировать комментарии.

Все правильно понял. Комментарии в Drupal вообще стремные (что в 7-ом, что в 8-ом). Как впрочем и твоя задача Smile Но молодец, чо. Изучаешь один месяц, а друпал вертишь как будто два:)

Порядок можешь задать с помощью 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) {

  

$field_order "field_comment_date"// поле для сортировки

  

if(get_class($query) == "Drupal\\Core\\Database\\Query\\PagerSelectExtender"){
    
$query->join("comment__$field_order"'d''d.entity_id = c.cid');
    
$orderby =& $query->getOrderBy();
    unset(
$orderby['torder']);
    
$orderby['d.'.$field_order.'_value'] = 'DESC';
  }
}
?>

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 8 февраля 2016 в 1:31
1

alexboy wrote:

Но остаётся вторая часть проблемы - комментарии не сортируются по этой дате, т.е. я как понял drupal вообще не сортирует комментарии по дате, он сортирует их по порядковому номеру добавления, т.е. по cid. Поэтому прошу подсказать как можно отсортировать комментарии.

Все правильно понял. Комментарии в Drupal вообще стремные (что в 7-ом, что в 8-ом). Как впрочем и твоя задача Smile Но молодец, чо. Изучаешь один месяц, а друпал вертишь как будто два:)

Порядок можешь задать с помощью 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) {

  

$field_order "field_comment_date"// поле для сортировки

  

if(get_class($query) == "Drupal\\Core\\Database\\Query\\PagerSelectExtender"){
    
$query->join("comment__$field_order"'d''d.entity_id = c.cid');
    
$orderby =& $query->getOrderBy();
    unset(
$orderby['torder']);
    
$orderby['d.'.$field_order.'_value'] = 'DESC';
  }
}
?>
Аватар пользователя alexboy alexboy 8 февраля 2016 в 20:25

Изменил название поля на своё, но порядок комментариев не меняется.
Если строку $orderby['d.'.$field_order.'_value'] = 'DESC'; заменить на $orderby['c.cid'] = 'DESC'; то комментарии сортируются в обратном порядке, но не по полю. Всё перепробовал, ничего не получается.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 8 февраля 2016 в 20:21
1

Глянь в базе данных в таблице comment (там можно развернуть её) точное название. Либо скриншоты выложи. Либо поставь devel и выведи dsm($query) и посмотри какие там поля.

Аватар пользователя alexboy alexboy 8 февраля 2016 в 20:25

по базе уже всё проверил, название таблицы и полей совпадает с теми, что прописаны в модуле. Была даже мысль, что не работает из-за того, что поле "дата" в базе хранится в формате даты, а не как число.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 8 февраля 2016 в 20:33
1

нет, формат даты не имеет значения. Можно попробовать вывести содержимое $orderby, может там еще какое-то поле для сортировки. Или может какие-то предыдущие действия мешают. Например

alexboy wrote:
пробовал в preprocess_comment предоопределить цикл вывода комментариев и потом отсортировать их по дате.

Я ж тебе не с мобилы по памяти код печатал, а взял рабочий, еще горячий Smile

Аватар пользователя alexboy alexboy 8 февраля 2016 в 22:35

vaplas wrote:

Можно попробовать вывести содержимое $orderby, может там еще какое-то поле для сортировки.

помогло это: unset($orderby['c.cid']);
благодарю за помощь.

Аватар пользователя alexboy alexboy 11 февраля 2016 в 18:57

Возникла потребность сделать разную сортировку для каждого типа комментариев. Чтобы модуль сработал только например, для комментариев форума "comment_forum" добавил такое условие:

$node = \Drupal::routeMatch()->getParameter('node');
if ($node->comment_forum[0]) {код сортировки}

Вроде работает, но может есть более правильный способ как это сделать?