Comment GoodnessモジュールがDrupal 7で行うのと同じように、Drupal 8を構成して、コメントを最新のものから古いものに並べ替える方法を教えてください。
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';
}
}
}
コメントフィールドのマシン名が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';
}
}
}
コメントビューを作成して、そこで並べ替えることができます。
Drupal 8の場合、次のモジュールを使用できます:コメントの順序。
リンク: https://www.drupal.org/project/comments_order
このモジュールは、Drupal 8.)でコメントの順序(並べ替え機能)を変更できるようにします。ノードタイプごとにコメントの順序(新しい順または古い順)を選択し、[フィールドの管理]でコメントタイプフィールドを編集できます。 "タブ(ノードタイプ管理ページ)。
フラットだけでなく、スレッドディスプレイでも!スレッド表示を使用する場合、どのようにして子のコメントをソートできるかを選択できます。以下の例。
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');
}