Kann TableSort ohne Abfrage verwendet werden?


15

In meinem Modul verwende ich TableSort für einige meiner Tabellen, aber ich habe auch einige Tabellen, die durch Code generiert werden, also nicht direkt mit einer Abfrage verknüpft sind. Diese Tabellen werden ebenfalls mit theme ('table') erstellt und haben die Arrays $ header und $ rows. Ist es auch möglich, TableSort zu verwenden, wenn ich meine Sortierfunktion schreibe?

Die Dokumentation für tablesort.inc scheint zu suggerieren, dass dies möglich ist ( Alle Tabellen, die mit einem Aufruf des Themas ('table') erstellt wurden, haben die Option, Spaltenüberschriften zu haben, auf die der Benutzer klicken kann, um die Tabelle nach dieser Spalte zu sortieren ). Ich habe jedoch keine Anleitung oder ein Beispiel dafür gefunden. Alles, was ich bisher gefunden habe, basiert auf einer Abfrage. Ich benutze Drupal 7.

Antworten:


10

Tablesort besteht eigentlich aus zwei verschiedenen Systemen, die zusammenarbeiten.

Der erste Teil ist das Rendern, das Material , das direkt in theme_table () abläuft oder von dort aufgerufen wird. Es werden nur die Tabellenüberschriften mit der Sortierangabe angezeigt, wenn eine Standardsortierung oder ein Überschreiben von $ _GET vorhanden ist, und Verknüpfungen werden erstellt, damit Sie darauf klicken können.

Der zweite Teil ist der TableSort- Abfrage-Extender, der die hinzugefügte Abfrage basierend auf der Standardsortierrichtung oder der Überschreibung von $ _GET anpasst.

Diese beiden Systeme sind eigentlich ziemlich voneinander getrennt. Sie arbeiten einfach zusammen, da sie ihre Daten aus derselben $ -Header-Struktur beziehen und dieselben Hilfsfunktionen und Namenskonventionen für die $ _GET-Parameter verwenden. Aber nichts hindert Sie daran, nur einen davon zu verwenden.

Um Ihre Frage tatsächlich zu beantworten, müssen Sie, wenn Sie nur den Rendering-Teil benötigen, nur sicherstellen, dass Sie etwas Ähnliches wie TableSort :: orderbyHeader () tun . Anstelle des orderBy () -Aufrufs verwenden Sie eine Array-Sortierfunktion oder übergeben sie als Argument an einen Webdienst oder etwas anderes.

Und im Gegenteil, Sie müssen nur sicherstellen, dass Sie einen Link anzeigen, der im Grunde genommen der Entsprechung von tablesort_header () entspricht, damit er vom TableSort-Abfrage-Extender erkannt wird.


Vielen Dank, dass Sie mich in die richtige Richtung gelenkt haben. Ich habe es jetzt geschafft. Für diejenigen, die versuchen, dasselbe zu erreichen, schreibe ich meine Schritte in eine separate Antwort, da sie nicht in ein Kommentarfeld passen.
Whiskey

15

Dank Berdir habe ich es geschafft. So funktioniert es im Detail.

Tablesort wird "automatisch" ausgelöst, wenn die (Spalten-) Arrays im $ headers-Array die Schlüssel 'data', 'field' und optional 'sort' enthalten. Dies wird Links mit 'sort' und 'order' in den Spaltenüberschriften erstellen und den kleinen Pfeil und so weiter anzeigen.

Um Ihre eigene Sortierung durchzuführen, rufen Sie die aktuellen Sortiereinstellungen mit tablesort_get_order und tablesort_get_sort ab und verwenden Sie diese Werte für Ihre eigene Sortierfunktion. Der Schlüssel 'sql' in dem von tablesort_get_order zurückgegebenen Array enthält den Feldnamen, der zum Sortieren verwendet werden soll.

Ein Stück (ungetesteter) Beispielcode mit dem Array $ users, der einige Details für jeden Benutzer enthält:

// 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 half mir hier mit der write your own sort function.
tyler.frankenstein

4

Hier ist der Code, den ich auf die Antwort von Whisky erhielt. Es wird eine Entitätsfeldabfrage verwendet.

 $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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.