コメントを新しい順に並べ替える


7

Drupal 7のComment Goodnessモジュールと同様に、Drupal 8を構成して、コメントを新しいものから古いものに並べ替えるにはどうすればよいですか?


いくつかの手掛かりを見つけます:\ Drupal \ Core \ Entity \ EntityViewBuilder :: viewMultipleしかし、注文方法がまだわかりません
bluesky_still

回答:


5

CommentStorage::loadThread追加しcomment_filter、そのクエリにタグを、あなたは使用することができhook_query_TAG_alter、変更のコメント順にフックを:

/**
 * 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コードを変更する必要がありました。私にとってこれは機能します: 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ソリューションはスレッド化されたコメンスで機能します。フラットなコメントリストについては私の作品です。回答を更新しました。ありがとうございました!
Stanislav Agapov 2017

スレッド化されたコメントの解決策は適切にソートされず、最新の返信が親コメントの上に視覚的に表示されます。@設定解除とエコーのアプローチtoroderとによってソートthread働いていた
アレックスSkrypnyk

4

コメントフィールドのマシン名がfield_commentsであるとすると、このコードをモジュールに挿入して、降順のコメントを取得します。スレッド化されたコメントで問題が発生していましたが、「torder」だけでなくc.threadデータベース列によってクエリが変更されるため、これは機能します

/**
 * 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';
    }

  }

}

これは、スレッド化されたコメントに対して適切に機能するソリューションです。ありがとう
Alex Skrypnyk 2017年


1

Drupal 8の場合、次のモジュールであるコメントの順序を使用できます。

リンク:https : //www.drupal.org/project/comments_order

このモジュールは、Drupal 8でコメントの順序(並べ替え機能)を変更するために提供されます。ノードタイプごとにコメントの順序(新しい順または古い順)を選択し、[フィールドの管理]タブ(ノードタイプ管理ページ)でコメントタイプフィールドを編集できます。

フラットだけでなく、スレッドディスプレイでも!スレッド表示を使用する場合、どのようにして子のコメントをソートできるかを選択できます。以下の例。


0

core / modules / comment / src / CommentStorage.php行302。コアをハックすることが唯一の方法だと思います。&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');
}

エンティティの定義を変更できる場合は、コアをハックする必要はありません。
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.