TableSortはクエリなしで使用できますか?


15

私のモジュールでは、いくつかのテーブルにTableSortを使用していますが、コードによって生成されたテーブルがあるため、クエリに直接リンクされていません。これらのテーブルもtheme( 'table')で作成されるため、$ headerおよび$ rows配列があります。ソート関数を書くことで、それらに対してTableSortを使用することは可能ですか?

tablesort.inc のドキュメントは、それが可能であることを示唆しているようです(theme( 'table')の呼び出しで作成されたすべてのテーブルには、ユーザーがクリックしてテーブルをその列でソートできる列ヘッダーを持つオプションがあります)。ただし、これを行う方法に関する指示や例は見つかりませんでした。これまでに見つけたものはすべて、クエリに基づいています。Drupal 7を使用しています。

回答:


10

Tablesortは実際には、連携する2つの異なるシステムで構成されています。

最初の部分はレンダリングであり、theme_table()内で直接発生するか、それから呼び出されます。デフォルトの並べ替えまたは$ _GETによるオーバーライドが存在する場合は、並べ替え指示とともにテーブルヘッダーを表示し、それらをクリックしてリンクできるようにします。

2番目の部分はTableSortクエリエクステンダーで、既定の並べ替え方向または$ _GETオーバーライドに基づいて追加されるクエリを調整します。

これらの2つのシステムは実際にはかなり分離されており、同じ$ header構造からデータを取得し、$ _ GETパラメーターに同じヘルパー関数と命名規則を使用するため、簡単に連携します。しかし、これらのうちの1つだけを使用することを妨げるものは何もありません。

実際に質問に答えるために、レンダリングパーツだけが必要な場合は、TableSort :: orderbyHeader()のようなものを実行する必要があります。orderBy()呼び出しの代わりに、配列の並べ替え関数を使用するか、引数としてWebサービスなどに渡します。

逆に、TableSortクエリエクステンダーによって認識されるように、tablesort_header()と基本的に同等のリンクを表示することを確認する必要があります。


私を正しい方向に向けてくれてありがとう、私は今それを機能させた。同じことを達成しようとしている人のために、コメントフィールドに収まらないため、別の回答にステップを入れました。
ウイスキー

15

Berdirのおかげで機能しました。これがより詳細に機能する方法です。

$ headers配列の(列)配列にキー 'data'、 'field'、およびオプションで 'sort'が含まれている場合、Tablesortは「自動的に」トリガーされます。これにより、列ヘッダーに「ソート」と「順序」のリンクが作成され、小さな矢印などが表示されます。

独自のソートを行うには、tablesort_get_orderおよびtablesort_get_sortを使用して現在のソート設定を取得し、それらの値を独自のソート関数に使用します。tablesort_get_orderによって返される配列のキー「sql」には、ソートに使用されるフィールド名が含まれています。

各ユーザーの詳細を含む配列$ usersを含む(テストされていない)サンプルコード:

// 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は、ここで私を助けてくれましたwrite your own sort function
tyler.frankenstein

4

ここに私がウイスキーの答えで終わったコードがあります。エンティティフィールドクエリを使用します。

 $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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.