TableSort può essere utilizzato senza una query?


15

Nel mio modulo, sto usando TableSort per alcune delle mie tabelle, ma ho anche alcune tabelle generate dal codice, quindi non direttamente collegate a una query. Queste tabelle sono anche create con tema ('table') e quindi hanno gli array $ header e $ows. È possibile utilizzare TableSort anche su quelli, magari scrivendo la mia funzione di ordinamento?

La documentazione per tablesort.inc sembra suggerire che sia possibile ( Tutte le tabelle create con una chiamata al tema ('table') hanno l'opzione di avere intestazioni di colonna su cui l'utente può fare clic per ordinare la tabella per quella colonna ). Tuttavia, non ho trovato alcuna istruzione o esempio su come farlo. Tutto quello che ho trovato finora si basa su una query. Sto usando Drupal 7.

Risposte:


10

Tablesort in realtà consiste di due diversi sistemi che lavorano insieme.

La prima parte è il rendering, le cose che accadono direttamente all'interno di theme_table () o da cui viene chiamato. Tutto ciò che fa è visualizzare le intestazioni della tabella con l'indicazione dell'ordinamento se è presente un ordinamento predefinito o sovrascrivere con $ _GET e crea collegamenti in modo da poter fare clic su di essi.

La seconda parte è l' Extender di query TableSort , che regola la query sulla quale viene aggiunta in base alla direzione di ordinamento predefinita o alla sostituzione $ _GET.

Questi due sistemi sono in realtà piuttosto separati, funzionano semplicemente insieme perché ottengono i loro dati dalla stessa struttura $ header e usano le stesse funzioni helper e convenzioni di denominazione per i parametri $ _GET. Ma nulla ti impedisce di utilizzare solo uno di questi.

Per rispondere effettivamente alla tua domanda, se hai solo bisogno della parte di rendering, devi solo assicurarti di fare qualcosa di simile a TableSort :: orderbyHeader () . Invece della chiamata orderBy (), useresti una funzione di ordinamento di array o la passeresti come argomento a un servizio web o qualsiasi altra cosa.

E per il contrario, dovresti solo assicurarti di visualizzare un link che è sostanzialmente l'equivalente di tablesort_header () in modo che sia riconosciuto dall'estensore di query TableSort.


Grazie per avermi indicato nella giusta direzione, ora ho funzionato. Per coloro che cercano di ottenere lo stesso, inserisco i miei passi in una risposta separata in quanto non rientra in un campo di commento.
Whisky

15

Grazie a Berdir l' ho fatto funzionare. Funziona così in modo più dettagliato.

Tablesort viene attivato "automaticamente" se l'array (colonna) nell'array $ headers contiene le chiavi 'data', 'campo' e facoltativamente 'ordina'. Questo creerà collegamenti con 'ordina' e 'ordina' nelle intestazioni delle colonne e mostrerà la piccola freccia e simili.

Per eseguire il proprio ordinamento, ottenere le impostazioni di ordinamento correnti con tablesort_get_order e tablesort_get_sort e utilizzare tali valori per la propria funzione di ordinamento. La chiave 'sql' nell'array restituita da tablesort_get_order contiene il nome del campo da utilizzare per l'ordinamento.

Un pezzo di codice di esempio (non testato) con l'array $ users contenente alcuni dettagli per ciascun utente:

// 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 mi ha aiutato qui con il write your own sort function.
tyler.frankenstein,

4

Ecco il codice che ho trovato sulla risposta del whisky. Utilizza la query del campo entità.

 $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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.