Bảng sắp xếp: sắp xếp thứ cấp


7

Tôi có chế độ xem (Drupal 6 / Lượt xem 2, nhưng tôi nghĩ điều này cũng có thể áp dụng cho các phiên bản khác) được hiển thị dưới dạng bảng sắp xếp. Tôi có thể thêm tiêu chí sắp xếp cố định như bạn có thể với tất cả các chế độ xem, nhưng một khi bảng được khách truy cập sắp xếp trên một bảng nhất định, các tiêu chí sắp xếp đó sẽ bị bỏ qua.

Trong các tùy chọn kiểu có một hộp có tên "Ghi đè sắp xếp thông thường nếu sử dụng sắp xếp nhấp chuột", điều này không có ý nghĩa với tôi. Nó dường như vô hiệu hóa hiệu quả sắp xếp nhấp chuột, khiến người dùng cuối có tiêu đề bảng có thể nhấp nhưng không hoạt động.

Có cách nào để giữ các tiêu chí sắp xếp cố định và sử dụng chúng làm tiêu chí phụ không?

Câu trả lời:


3

Sắp xếp ban đầu mà bạn đã chỉ định trong chế độ xem chỉ được sử dụng trên chế độ xem trang đầu tiên. Khi bạn nhấp vào tiêu đề để thay đổi sắp xếp, truy vấn được thay đổi để sử dụng các thói quen sắp xếp bảng drupal thay thế. Thật không may, không có hỗ trợ trong mã sắp xếp bảng được tích hợp để cho phép sắp xếp nhiều cột, cũng như khả năng xác định mặc định giảm dần thay vì tăng dần cột. Một cách khác nếu bảng của bạn hiển thị tất cả các kết quả là thêm một số Javascript thực hiện sắp xếp bảng trên HTML và không cung cấp sắp xếp trên các cột trong Chế độ xem. Một tìm kiếm google.com cho "sắp xếp bảng javascript" sẽ cho nhiều kết quả, kết quả này có vẻ khá mạnh mẽ: http://tablesorter.com/docs/


Cảm ơn, tôi chưa xem xét một giải pháp dựa trên javascript. Tôi muốn làm điều này với php / sql, nhưng tôi sẽ xem xét.
marcvangend

Giải pháp đơn giản khác là tạo tiêu chí sắp xếp trong Chế độ xem, sau đó hiển thị tiêu chí bạn muốn mọi người có thể sắp xếp theo. Vấn đề sắp xếp tiêu đề bảng vẫn sẽ tồn tại, nhưng ít nhất với các loại sắp xếp được hiển thị, họ sẽ có thể chọn nhiều tùy chọn sắp xếp. Trong trường hợp này, Chế độ xem phải tuân theo các loại được hiển thị theo thứ tự mà chúng được xác định.
codexmas

1
và có tích hợp Lượt xem với Deskorter: drupal.org/project/view_tablesorter
keva

Đối với D7 cũng vậy: drupal.org/project/tablesorter
leymannx

3

Như những người khác đã nói trước đó

không có hỗ trợ trong mã sắp xếp bảng được tích hợp để cho phép sắp xếp nhiều cột, cũng như không có khả năng xác định mặc định giảm dần thay vì tăng dần cột

Nhưng bạn nên có một cái nhìn về cách tiếp cận sau đây với Deskorter.

Dành cho D7:

1. Tải xuống và kích hoạt Mô-đun Tableorter

2.Download và chiết xuất TableSorter jQuery Plugin vàosites/all/libraries/tablesorter

3.Thêm một lớp CSS tablesortervà một id duy nhất vào các bảng Lượt xem của bạn trong template.php

/**
 * Preprocess variables for Views tables.
 */
function YOUR_THEME_preprocess_views_view_table(&$vars) {
  $view = $vars['view'];
  $vars['classes_array'][] = 'tablesorter';
  $vars['attributes_array']['id'] = $view->name . '-' . $view->current_display;
}

4. Xóa bộ nhớ cache một vài lần. Bây giờ Deskorter đã bắt đầu hoạt động. Bạn sẽ thấy nó khi kiểu dáng thay đổi.

5.Đối với loại thứ cấp, bạn cần thêm một JavaScript tùy chỉnh nhỏ. Trong template.php:

/**
 * Override or insert variables for the page templates.
 */
function YOUR_THEME_preprocess_page(&$vars) {
    // you might define some conditions around here
    drupal_add_js(drupal_get_path('theme', 'YOUR_THEME') . '/scripts/custom_tablesort.js');
}

6.Trong kịch bản đó, hãy viết như sau để báo cho Tableorter sắp xếp sáu coll coll đầu tiên của các bảng nhất định theo thứ tự bảng chữ cái tăng dần. Thay vào đó, hãy báo cho Tableorter chỉ sắp xếp cột thứ hai và thứ ba theo thứ tự tăng dần sortList: [[1,0], [2,0]].

(function ($) {
  Drupal.behaviors.tableSorting = {
    attach: function (context, settings) {

      $("#your_view_name-display_name").tablesorter({
        sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]]
      });

    }
  }
}) (jQuery);

Nếu bạn muốn để cho bảng xếp hạng thứ cấp sắp xếp tất cả các bảng của mình, bạn không cần xác định id CSS khi tiền xử lý và chỉ cần nói với Tableorter: $("table").tablesorter({ sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]] });

Sau khi thử nghiệm một chút, tôi nói rằng bạn bỏ bất kỳ tùy chọn nào của Bộ sắp xếp tùy chỉnh (kết thúc với bước 4) và chỉ cần giải thích cho người dùng của bạn rằng trong shiftkhi nhấn giữ khi nhấp vào nhiều tiêu đề, sắp xếp thứ cấp hoạt động trên mỗi cột mong muốn.


1
Cảm ơn, tôi chắc chắn sẽ thử điều này nếu tôi cần nó một lần nữa.
marcvangend

2

Xóa "Sắp xếp mặc định" khỏi cài đặt Bảng và sử dụng "Tiêu chí sắp xếp" cho thứ tự đầu tiên và thứ hai


1

Từ câu hỏi tôi nhận được là bạn muốn có chức năng sắp xếp bảng trong Chế độ xem; nếu đúng như vậy, bạn có thể làm theo các bước sau:

  1. Chỉnh sửa chế độ xem bạn muốn thêm sắp xếp cột vào.
  2. Trong "Cài đặt cơ bản", tìm "Kiểu: Bảng" và nhấp vào hình ảnh của một răng cưa bên cạnh nó.
  3. Cuộn xuống để xem các cài đặt bảng.
  4. Có một danh sách các trường và một hộp đánh dấu cho mỗi nhãn "có thể sắp xếp"; đánh dấu vào các hộp cho bất kỳ cột nào bạn muốn người dùng có thể thay đổi thứ tự sắp xếp trên.

Cảm ơn, nhưng đó không phải là điều tôi đang tìm kiếm. Tôi biết cách sắp xếp bảng mặc định hoạt động. Những gì tôi muốn là một tùy chọn sắp xếp mặc định trở thành thứ tự sắp xếp thứ cấp khi người dùng nhấp vào tiêu đề bảng. Chẳng hạn, một bảng được sắp xếp theo thứ tự bảng chữ cái theo mặc định, nhưng khi người dùng nhấp vào cột tác giả, bảng sẽ được sắp xếp theo tác giả trước, trong khi các hàng có cùng tác giả vẫn được sắp xếp theo thứ tự bảng chữ cái.
marcvangend

1

(D8)

Sau nhiều lần gỡ lỗi, tôi đã kết thúc với cách tiếp cận D7 tương tự D7 hook_view_query_alter

Nó thực hiện theo cách sử dụng kích hoạt các phương thức clickSort kiểu bảng bổ trợ .

  • Tạo một thư mục con có tên multisort trong các mô-đun.
  • An toàn mã bên dưới dưới dạng multisort.module vào thư mục được tạo ở trên.

<?php

use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\views\ViewExecutable;

/**
 * Implements hook_views_query_alter().
 */
function multisort_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {

  $views_to_alter = [
    // view name
    'sort_test' => [
      [
        'table' => 'node__field_col_a',
        'field' => 'field_col_a',
        'column' => 'field_col_a_value',
        'order' => 'desc',
      ],
    ]
  ];

  if (isset($views_to_alter[$view->id()])) {
    //dpm($query->orderby, 'by config or url');

    $fields_used = [];
    foreach($query->orderby as $field) {
      $fields_used[$field['field']] = 1;
    }

    $fields = $views_to_alter[$view->id()];

    foreach($fields as $field) {
      // Skip fields already clicked
      if (isset($fields_used[$field])) {
        continue;
      }

      $alias = $field['table'] . '.' . $field['column'];
      if (isset($fields_used[$alias])) {
        continue;
      }

      // @see \Drupal\views\Plugin\views\style\Table::buildSortPost
      $view->field[$field['field']]->clickSort($field['order']);
    }

    //dpm($query->orderby, 'altered');

  }
}
  • Lưu văn bản dưới đây vào multisort.info.yml

name: Multisort
type: module
description: Sort on more then one field
core: 8.x
package: Views

0

Chỉnh sửa các khung nhìn và đi đến cài đặt Bảng ở đó bạn có thể thấy hộp kiểm sắp xếp ... bạn có thể kiểm tra và áp dụng ..


0

Đây là giải pháp của tôi trong D7 / Lượt xem 3. Nó thêm mệnh đề order_by cuối cùng vào truy vấn nếu nó chưa xuất hiện. Tôi tin rằng bạn có thể xem tham số $ view và thêm thứ tự theo các cột từ đó nếu bạn không muốn thực hiện tĩnh như tôi đã làm.

function MODULENAME_views_query_alter(&$view, &$query) {
  if ($view->name == 'the_name_of_the_view_to_alter') {
    //First check that we don't already sort by the "the_field_alias" column
    if(array_search('the_field_alias', array_column($query->orderby, 'field')) === FALSE) {
      //Add the "the_field_alias" column last in the orderby array
      $query->orderby[] = [
        'field' => 'the_field_alias',
        'direction' => 'ASC',
      ];
    }
  }
}
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.