it-swarm.com.de

Kann TableSort ohne Abfrage verwendet werden?

In meinem Modul verwende ich TableSort für einige meiner Tabellen, aber ich habe auch einige Tabellen, die durch Code generiert werden und daher nicht direkt mit einer Abfrage verknüpft sind. Diese Tabellen werden auch mit dem Thema ('Tabelle') erstellt und enthalten daher die Arrays $ header und $ rows. Ist es möglich, TableSort auch für diese zu verwenden, möglicherweise beim Schreiben meiner Sortierfunktion?

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

15
Whiskey

Tablesort besteht eigentlich aus zwei verschiedenen Systemen, die zusammenarbeiten.

Der erste Teil ist das Rendern, das Zeug, das direkt in theme_table () passiert oder von dort aufgerufen wird. Es werden lediglich die Tabellenüberschriften mit der Sortieranzeige angezeigt, wenn eine Standardsortierung oder -überschreibung durch $ _GET vorliegt, und es werden Verknüpfungen erstellt, sodass Sie darauf klicken können.

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

Diese beiden Systeme sind eigentlich ziemlich 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 eines davon zu verwenden.

Um Ihre Frage tatsächlich zu beantworten, müssen Sie, wenn Sie nur den Rendering-Teil benötigen, nur etwas Ähnliches wie TableSort :: orderbyHeader () tun. Anstelle des Aufrufs orderBy () 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 Wesentlichen tablesort_header () entspricht, damit er vom TableSort-Abfrage-Extender erkannt wird.

10
Berdir

Danke an Berdir Ich habe 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. Dadurch werden Verknüpfungen mit 'sort' und 'order' in den Spaltenüberschriften erstellt und der kleine Pfeil und dergleichen angezeigt.

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 Teil des (nicht getesteten) Beispielcodes 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);
15
Whiskey

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

 $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;
4
Ali Nouman