Можно ли использовать TableSort без запроса?

15

В моем модуле я использую TableSort для некоторых из моих таблиц, но у меня также есть несколько таблиц, которые генерируются кодом, поэтому напрямую не связаны с запросом. Эти таблицы также создаются с помощью темы ('table') и поэтому имеют массивы $ header и $ lines. Можно ли использовать TableSort на них, возможно, с написанием моей функции сортировки?

Документация для tablesort.inc , кажется, предполагает , что это возможно ( Все таблицы , созданные с помощью вызова темы ( «таблицы») имеют возможность иметь заголовки столбцов , которые пользователь может нажать на , чтобы отсортировать таблицу по этому столбцу ). Тем не менее, я не нашел никаких инструкций или примеров, как это сделать. Все, что я нашел, основано на запросе. Я использую Drupal 7.

Виски
источник

Ответы:

10

Tablesort на самом деле состоит из двух разных систем, которые работают вместе.

Первая часть - это рендеринг, то, что происходит непосредственно в theme_table () или вызывается из него. Все, что он делает, это отображает заголовки таблиц с указанием сортировки, если присутствует сортировка по умолчанию или переопределение через $ _GET, и делает их ссылками, чтобы вы могли нажимать на них.

Вторая часть - это расширитель запросов TableSort , который настраивает запрос, к которому он добавляется, на основе направления сортировки по умолчанию или переопределения $ _GET.

Эти две системы на самом деле довольно сильно разделены, они легко работают вместе, потому что они получают свои данные из одной структуры $ header и используют те же вспомогательные функции и соглашения об именах для параметров $ _GET. Но ничто не мешает вам использовать только один из них.

Чтобы на самом деле ответить на ваш вопрос, если вам просто нужна часть рендеринга, вам просто нужно сделать что-то похожее на TableSort :: orderbyHeader () . Вместо вызова orderBy () вы должны использовать функцию сортировки массива или передавать ее в качестве аргумента веб-службе или чему-либо еще.

И наоборот, вам просто нужно убедиться, что вы отображаете ссылку, которая в основном эквивалентна tablesort_header (), чтобы она распознавалась расширителем запросов TableSort.

Berdir
источник
Спасибо, что указали мне в правильном направлении, я получил это работает сейчас. Для тех, кто пытается достичь того же, я поставил свои шаги в отдельном ответе, так как он не помещается в поле для комментариев.
Виски
15

Благодаря Бердиру, я получил его на работу. Вот как это работает более подробно.

Tablesort запускается «автоматически», если массивы (столбца) в массиве $ headers содержат ключи «data», «field» и, необязательно, «sort». Это создаст ссылки с «сортировать» и «порядок» в заголовках столбцов и покажет маленькую стрелку и тому подобное.

Чтобы выполнить собственную сортировку, получите текущие параметры сортировки с помощью tablesort_get_order и tablesort_get_sort и используйте эти значения для своей собственной функции сортировки. Ключ 'sql' в массиве, возвращаемом tablesort_get_order, содержит имя поля, которое будет использоваться для сортировки.

Часть (непроверенного) примера кода с массивом $ 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;
Али Ноуман
источник