回答:
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';
}
}
}
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'; } }
toroder
とによってソートthread
働いていた
コメントフィールドのマシン名が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');
}