Sắp xếp bình luận từ mới nhất đến cũ nhất


7

Tôi nên định cấu hình Drupal 8 như thế nào để sắp xếp các nhận xét từ mới nhất đến cũ nhất, tương tự như mô-đun Nhận xét Độ tốt trong Drupal 7?


Tìm một số manh mối: \ Drupal \ Core \ Entity \ EntityViewBuilder :: viewMultipl nhưng vẫn không biết cách đặt hàng
bluesky_still

Câu trả lời:


5

Khi CommentStorage::loadThreadthêm comment_filterthẻ vào truy vấn của nó, bạn có thể sử dụng hook_query_TAG_alterhook để thay đổi thứ tự nhận xét:

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

Cảm ơn bạn @Stanislav Agapov Tôi đã phải sửa đổi mã của bạn. Đối với tôi làm việc này: 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 giải pháp của bạn hoạt động cho commens ren. Đối với danh sách bình luận phẳng làm việc của tôi. Tôi cập nhật câu trả lời của tôi. Cảm ơn bạn!
Stanislav Agapov

giải pháp của bạn cho các bình luận theo luồng sẽ không được sắp xếp hợp lý, làm cho các phản hồi mới nhất xuất hiện trực quan bên trên các bình luận phụ huynh. Cách tiếp cận của @ echo với toroderviệc sắp xếp và sắp xếp bằng cách threadlàm việc
Alex Skrypnyk

4

Giả sử tên máy của trường nhận xét của bạn là field_comments , hãy đặt mã này vào một mô-đun để nhận các bình luận giảm dần. Tôi đã gặp rắc rối với các nhận xét theo luồng, nhưng điều này hoạt động vì nó thay đổi truy vấn của cột cơ sở dữ liệu c.thread thay vì chỉ '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';
    }

  }

}

Đây là giải pháp làm việc đúng cho các bình luận theo luồng. Cảm ơn bạn
Alex Skrypnyk


1

Đối với Drupal 8, bạn có thể sử dụng mô-đun tiếp theo: Thứ tự nhận xét.

Liên kết: https://www.drupal.org/project/comments_order

Mô-đun này cung cấp để thay đổi thứ tự nhận xét (chức năng sắp xếp) trong Drupal 8. Bạn có thể chọn thứ tự nhận xét (mới nhất trước hoặc cũ nhất trước) cho mỗi loại nút, chỉnh sửa trường loại nhận xét của bạn trên tab "Quản lý trường" (trang quản trị loại nút).

Không chỉ trong căn hộ, mà còn trong màn hình ren! Nếu bạn sử dụng hiển thị theo luồng, bạn có thể chọn cách sắp xếp các nhận xét của trẻ. Ví dụ dưới đây.


0

lõi / mô-đun / bình luận / src / CommentStorage.php dòng 302. Tôi nghĩ cách duy nhất là hack lõi! & chỉ dành cho mô-đun 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');
}

Không cần phải hack lõi khi định nghĩa thực thể có thể bị thay đổi.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.