TableSort có thể được sử dụng mà không cần truy vấn không?


15

Trong mô-đun của tôi, tôi đang sử dụng TableSort cho một số bảng của mình, nhưng tôi cũng có một số bảng được tạo bởi mã, do đó không được liên kết trực tiếp với truy vấn. Các bảng này cũng được tạo với chủ đề ('bảng') và do đó có các mảng $ tiêu đề và $ hàng. Có thể sử dụng TableSort trên những cái đó không, có thể bằng cách viết hàm sắp xếp của tôi không?

Các tài liệu cho tablesort.inc dường như cho thấy nó có thể ( Tất cả các bảng được tạo ra với một cuộc gọi đến chủ đề ( 'table') có tùy chọn tiêu đề cột có mà người dùng có thể bấm vào để sắp xếp bảng theo cột đó ). Tuy nhiên, tôi không tìm thấy bất kỳ hướng dẫn hoặc ví dụ nào về cách thực hiện việc này. Tất cả mọi thứ tôi tìm thấy cho đến nay đều dựa trên một truy vấn. Tôi đang sử dụng Drupal 7.

Câu trả lời:


10

Deskort thực sự bao gồm hai hệ thống khác nhau làm việc cùng nhau.

Phần đầu tiên là kết xuất, những thứ xảy ra trực tiếp trong theme_table () hoặc được gọi từ đó. Tất cả những gì nó làm là hiển thị các tiêu đề bảng với chỉ báo sắp xếp nếu sắp xếp mặc định hoặc ghi đè qua $ _GET và làm cho chúng liên kết để bạn có thể nhấp vào chúng.

Phần thứ hai là bộ mở rộng truy vấn TableSort , điều chỉnh truy vấn mà nó được thêm vào dựa trên hướng sắp xếp mặc định hoặc ghi đè $ _GET.

Hai hệ thống này thực sự khá tách biệt, chúng chỉ hoạt động dễ dàng với nhau vì chúng lấy dữ liệu từ cùng một cấu trúc tiêu đề $ và sử dụng cùng các hàm trợ giúp và quy ước đặt tên cho các tham số $ _GET. Nhưng không có gì ngăn bạn sử dụng chỉ một trong số này.

Để thực sự trả lời câu hỏi của bạn, nếu bạn chỉ cần phần kết xuất, bạn chỉ cần đảm bảo thực hiện một cái gì đó tương tự như TableSort :: orderbyHeader () . Thay vì lệnh orderBy (), bạn sẽ sử dụng hàm sắp xếp mảng hoặc chuyển nó dưới dạng đối số cho dịch vụ web hoặc bất kỳ thứ gì khác.

Và ngược lại, bạn chỉ cần đảm bảo rằng bạn hiển thị một liên kết về cơ bản tương đương với framesort_header () để nó được công cụ mở rộng truy vấn TableSort nhận ra.


Cảm ơn bạn đã chỉ cho tôi đi đúng hướng, tôi đã làm cho nó hoạt động ngay bây giờ. Đối với những người cố gắng đạt được điều tương tự, tôi đặt các bước của mình vào một câu trả lời riêng vì nó không phù hợp trong trường nhận xét.
Whiskey

15

Nhờ Berdir tôi đã làm cho nó hoạt động. Đây là cách nó hoạt động chi tiết hơn.

Tableort được kích hoạt "tự động" nếu mảng (cột) trong mảng $ headers chứa các khóa 'dữ liệu', 'trường' và tùy chọn 'sắp xếp'. Điều này sẽ tạo các liên kết với 'sắp xếp' và 'thứ tự' trong các tiêu đề cột và hiển thị mũi tên nhỏ và như vậy.

Để thực hiện sắp xếp của riêng bạn, hãy lấy các cài đặt sắp xếp hiện tại với framesort_get_orderframesort_get_sort và sử dụng các giá trị đó cho chức năng sắp xếp của riêng bạn. Khóa 'sql' trong mảng được trả về bởi framesort_get_order chứa tên trường được sử dụng để sắp xếp.

Một đoạn mã ví dụ (chưa được kiểm tra) với mảng $ user chứa một số chi tiết cho mỗi người dùng:

// setup the table data that we want to show
$tableData = array();
foreach ($users as $userDetails) {
  $tableData[] = array(
      'name' => $userDetails['name'],
      'visits' => $userDetails['visits'],
      'views' => $userDetails['views'],
      'comments' => $userDetails['comments']
  );
}

// headers array, sorting by default on comments
$headers = array(
    array('data' => t('Name'), 'field' => 'name'),
    array('data' => t('Visits'), 'field' => 'visits'),
    array('data' => t('Views'), 'field' => 'views'),
    array('data' => t('Comments'), 'field' => 'comments', 'sort' => 'desc')
);

// getting the current sort and order parameters from the url
$order = tablesort_get_order($headers);
$sort = tablesort_get_sort($headers);

// sort the table data accordingly (write your own sort function)
$tableData = my_array_sort($tableData, $order['sql'], $sort);

// create the array with rows for theme table
$rows = array();
foreach ($tableData as $entry) {
  $rows[] = array(
      array('data' => $entry['name']),
      array('data' => $entry['visits']),
      array('data' => $entry['views']),
      array('data' => $entry['comments']),
  );
}

// add any attributes and sent everything to theme table
$attributes = array('class' => array('my_class'));
$table = array('header' => $headers, 'attributes' => $attributes, 'rows' => $rows);
$html = theme('table', $table);

1
stackoverflow.com/a/19454643/763010 đã giúp tôi ở đây với write your own sort function.
tyler.frankenstein

4

Đây là đoạn mã mà tôi đã kết thúc bằng câu trả lời của whisky. Nó sử dụng truy vấn trường thực thể.

 $query = new EntityFieldQuery();
  $query
  ->entityCondition('entity_type', 'vehicle')
  ->entityCondition('bundle', 'car');
  $result=$query->execute();
  $ids=array_keys($result['vehicle']);
  $values=entity_load('vehicle',$ids);
  $rows=array();
  foreach($values as $val){
    $rows[]=array('data'=>array(
      'id'=>$val->id,
      'title'=>$val->title,
      'price'=>$val->field_price['und'][0]['value'],
      'model'=>$val->field_model['und'][0]['value'],
      'color'=>$val->field_color['und'][0]['value'],
      'speed'=>$val->field_speed['und'][0]['value'],

    ));
  }


  // We are going to output the results in a table with a nice header.
  $header = array(
    // The header gives the table the information it needs in order to make
    // the query calls for ordering. TableSort uses the field information
    // to know what database column to sort by.
    array('data' => t('Entity Id'),'field' => 'id'),
    array('data' => t('Title'),'field' => 'title'),
    array('data' => t('Price'),'field' => 'price'),
    array('data' => t('Model'),'field'=>'model'),
    array('data' => t('Color'),'field'=>'color'),
    array('data' => t('Speed'),'field'=>'speed'),

  );

  $order = tablesort_get_order($header);
  $sort = tablesort_get_sort($header);
  $sql=$order['sql'];
  if($sort=='desc') {

    usort($rows, function($a, $b) use($sql) {
    return $a['data'][$sql] > $b['data'][$sql]? -1 : 1;

  });

  }
  if($sort=='asc') {
      usort($rows, function($a, $b) use ($sql) {
        return $a['data'][$sql] < $b['data'][$sql]? -1 : 1;
      });
  }

  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));

  return $output;
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.