Sortieren von Kommentaren vom neuesten zum ältesten

7

Wie sollte ich Drupal 8 so konfigurieren, dass Kommentare vom neuesten zum ältesten sortiert werden, ähnlich wie das Modul " Kommentargüte" in Drupal 7?

pooceger
quelle
Finden Sie einen Hinweis: \ Drupal \ Core \ Entity \ EntityViewBuilder :: viewMultiple, wusste aber immer noch nicht, wie man bestellt
bluesky_still

Antworten:

5

Wenn Sie der Abfrage ein Tag CommentStorage::loadThreadhinzufügen comment_filter, können Sie den hook_query_TAG_alterHook verwenden, um die Reihenfolge der Kommentare zu ändern:

/**
 * 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';
    }
  }
}
Stanislav Agapov
quelle
Vielen Dank @Stanislav Agapov Ich musste Ihren Code ändern. Für mich funktioniert dieses: if ($query->getMetaData('field_name') == 'comment') { /** @var \Drupal\Core\Database\Query\SelectInterface $query */ $order_by = &$query->getOrderBy(); if (isset($order_by['torder']) && $order_by['torder'] == 'ASC') { $order_by['torder'] = 'DESC'; } }
sgoelz
1
@seb Ihre Lösung funktioniert für Threaded beginnt. Für flache Kommentarlisten funktioniert meins. Ich habe meine Antwort aktualisiert. Vielen Dank!
Stanislav Agapov
Ihre Lösung für Thread-Kommentare wird nicht richtig sortiert, sodass die neuesten Antworten visuell über den übergeordneten Kommentaren angezeigt werden. @ Echo Ansatz mit dem Einstellen toroderund Sortieren nach threadgearbeitet
Alex Skrypnyk
4

Angenommen, der Computername Ihres Kommentarfelds lautet field_comments , fügen Sie diesen Code in ein Modul ein, um absteigende Kommentare zu erhalten. Ich hatte Probleme mit Thread-Kommentaren, aber dies funktioniert, da dadurch die Abfrage durch die Datenbankspalte c.thread geändert wird, anstatt nur "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';
    }

  }

}
Echo
quelle
Dies ist die ordnungsgemäß funktionierende Lösung für Kommentare mit Thread. Vielen Dank
Alex Skrypnyk
2

Sie können eine Kommentaransicht erstellen und dort sortieren.

Kein Sssweat
quelle
1

Für Drupal 8 können Sie das nächste Modul verwenden: Reihenfolge der Kommentare.

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

Dieses Modul bietet die Möglichkeit, die Reihenfolge der Kommentare (Sortierfunktion) in Drupal 8 zu ändern. Sie können die Reihenfolge der Kommentare (neueste zuerst oder älteste zuerst) pro Knotentyp auswählen und Ihr Kommentartypfeld auf der Registerkarte "Felder verwalten" (Seite zur Verwaltung des Knotentyps) bearbeiten.

Nicht nur flach, sondern auch in Gewindedisplay! Wenn Sie die Thread-Anzeige verwenden, können Sie auswählen, wie untergeordnete Kommentare sortiert werden sollen. Beispiele unten.

Kirill Loboda
quelle
0

core / modules / comment / src / CommentStorage.php Zeile 302. Ich denke, der einzige Weg ist, den Core zu hacken! & nur für FLAT Modul.

    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');
}
bluesky_still
quelle
Es ist nicht erforderlich, den Kern zu hacken, wenn eine Entitätsdefinition geändert werden kann.
Kiamlaluno