Bisakah TableSort digunakan tanpa kueri?

15

Dalam modul saya, saya menggunakan TableSort untuk beberapa tabel saya, tetapi saya juga memiliki beberapa tabel yang dihasilkan oleh kode, jadi tidak langsung ditautkan ke kueri. Tabel-tabel ini juga dibuat dengan tema ('tabel') dan juga memiliki array $ header dan $ rows. Apakah mungkin menggunakan TableSort pada mereka juga, mungkin dengan menulis fungsi sortir saya?

The dokumentasi untuk tablesort.inc tampaknya menunjukkan adalah mungkin ( Semua tabel yang dibuat dengan panggilan untuk tema ( 'table') memiliki pilihan untuk memiliki header kolom bahwa pengguna dapat mengklik untuk mengurutkan tabel dengan kolom yang ). Namun, saya belum menemukan instruksi atau contoh tentang cara melakukan ini. Semua yang saya temukan sejauh ini didasarkan pada permintaan. Saya menggunakan Drupal 7.

Wiski
sumber

Jawaban:

10

Tablesort sebenarnya terdiri dari dua sistem berbeda yang bekerja bersama.

Bagian pertama adalah rendering, hal-hal yang terjadi langsung di dalam theme_table () atau dipanggil dari situ. Yang perlu dilakukan hanyalah menampilkan header tabel dengan indikasi pengurutan jika ada pengurutan default atau override melalui $ _GET hadir dan membuatnya tautan sehingga Anda dapat mengkliknya.

Bagian kedua adalah extender kueri TableSort , yang menyesuaikan kueri yang ditambahkan berdasarkan arah penyortiran default atau override $ _GET.

Kedua sistem ini sebenarnya cukup terpisah, hanya bekerja bersama dengan mudah karena mereka mendapatkan data mereka dari struktur $ header yang sama dan menggunakan fungsi pembantu yang sama dan konvensi penamaan untuk parameter $ _GET. Tetapi tidak ada yang menghentikan Anda untuk menggunakan hanya satu dari ini.

Untuk benar-benar menjawab pertanyaan Anda, jika Anda hanya perlu bagian rendering, Anda hanya perlu memastikan untuk melakukan sesuatu yang mirip dengan TableSort :: orderbyHeader () . Alih-alih panggilan orderBy (), Anda akan menggunakan fungsi pengurutan array, atau meneruskannya sebagai argumen ke layanan web atau apa pun.

Dan sebaliknya, Anda hanya perlu memastikan bahwa Anda menampilkan tautan yang pada dasarnya setara dengan tablesort_header () sehingga dikenali oleh extender kueri TableSort.

Berdir
sumber
Terima kasih telah mengarahkan saya ke arah yang benar, saya berhasil sekarang. Bagi mereka yang mencoba mencapai hal yang sama, saya meletakkan langkah saya di jawaban yang terpisah karena tidak cocok di bidang komentar.
Whiskey
15

Berkat Berdir, saya membuatnya bekerja. Beginilah cara kerjanya lebih detail.

Tablesort dipicu "secara otomatis" jika array (kolom) dalam array $ header berisi kunci 'data', 'field' dan opsional 'sort'. Ini akan membuat tautan dengan 'sort' dan 'order' di header kolom dan perlihatkan panah kecil dan semacamnya.

Untuk melakukan penyortiran Anda sendiri, dapatkan pengaturan penyortiran saat ini dengan tablesort_get_order dan tablesort_get_sort dan gunakan nilai-nilai itu untuk fungsi penyortiran Anda sendiri. Kunci 'sql' dalam array yang dikembalikan oleh tablesort_get_order berisi nama bidang yang akan digunakan untuk menyortir.

Sepotong kode contoh (yang belum diuji) dengan array $ users berisi beberapa detail untuk setiap pengguna:

// 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);
Wiski
sumber
1
stackoverflow.com/a/19454643/763010 membantu saya di sini dengan write your own sort function.
tyler.frankenstein
4

Berikut adalah kode yang saya temukan pada jawaban wiski. Ini menggunakan kueri bidang entitas.

 $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;
Ali Nouman
sumber