TableSort pode ser usado sem uma consulta?

15

No meu módulo, estou usando o TableSort para algumas das minhas tabelas, mas também tenho algumas tabelas que são geradas pelo código, portanto, não diretamente vinculadas a uma consulta. Essas tabelas também são criadas com o tema ('tabela') e, portanto, possuem as matrizes $ header e $ lines. É possível usar o TableSort também, talvez ao escrever minha função de classificação?

A documentação do tablesort.inc parece sugerir que é possível ( Todas as tabelas criadas com uma chamada para o tema ('tabela') têm a opção de ter cabeçalhos de coluna nos quais o usuário pode clicar para classificar a tabela por essa coluna ). No entanto, não encontrei nenhuma instrução ou exemplo de como fazer isso. Tudo o que encontrei até agora é baseado em uma consulta. Estou usando o Drupal 7.

Uísque
fonte

Respostas:

10

O Tablesort na verdade consiste em dois sistemas diferentes que trabalham juntos.

A primeira parte é a renderização, o que acontece diretamente dentro de theme_table () ou é chamado a partir disso. Tudo o que ele faz é exibir os cabeçalhos da tabela com a indicação de classificação, se houver uma classificação ou substituição padrão em $ _GET e os fizer links para que você possa clicar neles.

A segunda parte é o extensor de consulta TableSort , que ajusta a consulta na qual ela é adicionada com base na direção de classificação padrão ou na substituição $ _GET.

Na verdade, esses dois sistemas são bastante separados, eles simplesmente funcionam juntos porque obtêm seus dados da mesma estrutura de cabeçalho $ e usam as mesmas funções auxiliares e convenções de nomenclatura para os parâmetros $ _GET. Mas nada impede você de usar apenas um deles.

Para realmente responder sua pergunta, se você só precisa da parte de renderização, precisa fazer algo semelhante a TableSort :: orderbyHeader () . Em vez da chamada orderBy (), você usaria uma função de classificação de matriz ou a passaria como argumento para um serviço da Web ou qualquer outra coisa.

E, pelo contrário, você só precisa garantir que exiba um link que seja basicamente o equivalente a tablesort_header (), para que seja reconhecido pelo extensor de consultas TableSort.

Berdir
fonte
Obrigado por me apontar na direção certa, eu consegui trabalhar agora. Para aqueles que tentam alcançar o mesmo, coloquei minhas etapas em uma resposta separada, pois ela não se encaixa em um campo de comentário.
Whisky
15

Graças a Berdir , consegui funcionar. É assim que funciona com mais detalhes.

O Tablesort é acionado "automaticamente" se as matrizes (coluna) na matriz $ headers contiverem as chaves 'data', 'field' e, opcionalmente, 'sort'. Isso criará links com 'sort' e 'order' nos cabeçalhos das colunas e mostrará a pequena flecha e tal.

Para fazer sua própria classificação, obtenha as configurações atuais de classificação com tablesort_get_order e tablesort_get_sort e use esses valores para sua própria função de classificação. A chave 'sql' na matriz retornada por tablesort_get_order contém o nome do campo a ser usado para classificação.

Um trecho de código de exemplo (não testado) com a matriz $ users contendo alguns detalhes para cada usuário:

// 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);
Uísque
fonte
1
stackoverflow.com/a/19454643/763010 me ajudou aqui com o write your own sort function.
tyler.frankenstein
4

Aqui está o código que eu acabei com a resposta do whisky. Ele usa a consulta de campo da entidade.

 $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
fonte