可以在没有查询的情况下使用TableSort吗?


15

在我的模块中,我对某些表使用TableSort,但是我也有一些表是由代码生成的,因此不直接链接到查询。这些表也使用theme('table')创建,因此$ header和$ rows数组也是如此。是否可以在上面使用TableSort,也许可以编写我的排序功能?

tablesort.inc 的文档似乎暗示有可能(所有通过调用theme('table')创建的表都可以选择具有列标题,用户可以单击该列标题以对该列进行排序)。但是,我还没有找到有关如何执行此操作的说明或示例。到目前为止,我发现的所有内容都基于查询。我正在使用Drupal 7。

Answers:


10

Tablesort实际上包含两个可以协同工作的不同系统。

第一部分是渲染,渲染直接发生在theme_table()中或从中调用。如果存在通过$ _GET进行默认排序或覆盖,并显示排序标题,则表标题将显示排序标题,并使其链接,以便您可以单击它们。

第二部分是TableSort查询扩展器,它根据默认的排序方向或$ _GET覆盖来调整添加查询的条件。

这两个系统实际上是非常分开的,它们可以轻松地一起工作,因为它们从相同的$ header结构获取数据,并对$ _GET参数使用相同的辅助函数和命名约定。但是,没有什么可以阻止您仅使用其中之一。

要真正回答您的问题,如果只需要呈现部分,则只需确保执行与TableSort :: orderbyHeader()类似的操作即可。除了使用orderBy()调用外,您还可以使用数组排序函数,或者将其作为参数传递给Web服务或其他任何东西。

相反,您只需要确保显示的链接基本上与tablesort_header()等效,那么TableSort查询扩展器可以识别该链接。


谢谢您指出正确的方向,我现在可以正常工作了。对于那些试图实现相同目标的人,我将其放在单独的答案中,因为它不适合在注释字段中显示。
威士忌酒

15

多亏了Berdir,我才开始工作。这是它更详细的工作方式。

如果$ headers数组中的(列)数组包含键“ data”,“ field”和可选的“ sort”,则“自动”触发Tablesort。这将在列标题中创建带有“ sort”和“ order”的链接,并显示小箭头等。

要进行自己的排序,请使用tablesort_get_ordertablesort_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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.