web-dev-qa-db-fra.com

Tri des commentaires du plus récent au plus ancien

Comment dois-je configurer Drupal 8 pour trier les commentaires du plus récent au plus ancien, de la même manière que le module Comment Goodness fait dans Drupal 7 ?

7
pooceger

Comme CommentStorage::loadThread ajoute comment_filter tag à sa requête, vous pouvez utiliser hook_query_TAG_alter hook pour changer l'ordre des commentaires:

/**
 * Implements hook_query_TAG_alter() for comment_filter tag.
 *
 * @see CommentStorage::loadThread().
 */
function mymodule_query_comment_filter_alter(Drupal\Core\Database\Query\AlterableInterface $query) {
  // Change comment order to DESC for 'comment' field.
  if ($query->getMetaData('field_name') == 'comment') {
    /** @var \Drupal\Core\Database\Query\SelectInterface $query */
    $order_by = &$query->getOrderBy();
    // 'c.cid' is for flat comment lists.
    if (isset($order_by['c.cid']) && $order_by['c.cid'] == 'ASC') {
      $order_by['c.cid'] = 'DESC';
    }
    // 'torder' is for threated comment lists.
    if (isset($order_by['torder']) && $order_by['torder'] == 'ASC') {
      $order_by['torder'] = 'DESC';
    }
  }
}
5
Stanislav Agapov

En supposant que le nom de la machine de votre champ de commentaires est field_comments, mettez ce code dans un module pour obtenir des commentaires décroissants. J'avais des problèmes avec les commentaires filetés, mais cela fonctionne car il modifie la requête par la colonne de la base de données c.thread au lieu de simplement 'torder'

/**
 * Implements hook_query_TAG_alter() for comment_filter tag.
 *
 * @see CommentStorage::loadThread().
 */
function MYMODULE_query_comment_filter_alter(Drupal\Core\Database\Query\AlterableInterface $query) {

  // Change comment order to DESC for 'comment' field.
  if ($query->getMetaData('field_name') == 'field_comments') {

    $order_by = &$query->getOrderBy();
    $expressions = &$query->getExpressions();
    // Sorting for threaded comments.
    if (isset($order_by['torder']) && $order_by['torder'] == 'ASC') {
      // Get rid of the expressions that prepare the threads for ASC ordering.
      unset($expressions['torder']);
      unset($order_by['torder']);
      // Simply order by the thread field.
      $order_by['c.thread'] = 'DESC';
    }

  }

}
4
echo

Vous pouvez créer une vue des commentaires et les trier là-bas.

2
No Sssweat

Pour Drupal 8, vous pouvez utiliser le module suivant: Ordre des commentaires.

Lien: https://www.drupal.org/project/comments_order

Ce module permet de modifier l'ordre des commentaires (fonctionnalité de tri) dans Drupal 8. Vous pouvez choisir l'ordre des commentaires (le plus récent en premier ou le plus ancien en premier) par type de nœud, en éditant votre champ de type de commentaire sur le "Gérer les champs "onglet (page d'administration du type de nœud).

Non seulement en écran plat, mais également en affichage fileté! Si vous utilisez un affichage fileté, vous pouvez choisir la manière de trier les commentaires des enfants. Exemples ci-dessous.

1
Kirill Loboda

core/modules/comment/src/CommentStorage.php ligne 302. Je pense que la seule façon est de pirater le core! & uniquement pour le module FLAT.

    if ($mode == CommentManagerInterface::COMMENT_MODE_FLAT) {
  $query->orderBy('c.cid', 'DESC');
}
else {
  // See comment above. Analysis reveals that this doesn't cost too
  // much. It scales much much better than having the whole comment
  // structure.
  $query->addExpression('SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))', 'torder');
  $query->orderBy('torder', 'ASC');
}
0
bluesky_still