Czy można używać TableSort bez zapytania?

15

W moim module używam TableSort do niektórych moich tabel, ale mam też niektóre tabele, które są generowane przez kod, więc nie są bezpośrednio powiązane z zapytaniem. Te tabele są również tworzone przy użyciu kompozycji („tabela”), a więc mają tablice $ header i $ rows. Czy jest możliwe użycie TableSort również na tych, być może podczas pisania mojej funkcji sortowania?

Dokumentacja dla tablesort.inc zdaje się sugerować, że jest to możliwe ( Wszystkie tabele utworzone z wezwaniem do tematu ( „stół”) mają możliwość posiadania nagłówków kolumn, które użytkownik może kliknąć, aby posortować tabelę według tej kolumny ). Nie znalazłem jednak żadnych instrukcji ani przykładów, jak to zrobić. Wszystko, co do tej pory znalazłem, opiera się na zapytaniu. Używam Drupala 7.

Whisky
źródło

Odpowiedzi:

10

Tablesort składa się z dwóch różnych systemów, które współpracują ze sobą.

Pierwszą częścią jest rendering, czyli rzeczy, które dzieją się bezpośrednio w theme_table () lub są z niego wywoływane. Wszystko, co robi, to wyświetla nagłówki tabeli ze wskazaniem sortowania, jeśli obecne jest domyślne sortowanie lub przesłonięcie za pomocą $ _GET, i tworzy z nich łącza, aby można je było kliknąć.

Druga część to przedłużacz zapytania TableSort , który dostosowuje zapytanie, do którego jest dodawane, w oparciu o domyślny kierunek sortowania lub przesłonięcie $ _GET.

Te dwa systemy są właściwie dość rozdzielone, po prostu ze sobą łatwo współpracują, ponieważ pobierają dane z tej samej struktury nagłówka $ i używają tych samych funkcji pomocniczych i konwencji nazewnictwa dla parametrów $ _GET. Ale nic nie stoi na przeszkodzie, aby użyć tylko jednego z nich.

Aby odpowiedzieć na twoje pytanie, jeśli potrzebujesz tylko części do renderowania, musisz zrobić coś podobnego do TableSort :: orderbyHeader () . Zamiast wywołania orderBy () użyjesz funkcji sortowania tablicowego lub przekażesz ją jako argument do usługi WWW lub czegokolwiek innego.

Wręcz przeciwnie, musisz tylko upewnić się, że wyświetlasz łącze, które jest w zasadzie odpowiednikiem tablesort_header () , aby było rozpoznawane przez rozszerzenie zapytania TableSort.

Berdir
źródło
Dziękuję za skierowanie mnie we właściwym kierunku, teraz działam. Dla tych, którzy próbują osiągnąć to samo, stawiam swoje kroki w osobnej odpowiedzi, ponieważ nie mieszczą się one w polu komentarza.
Whisky
15

Dzięki Berdirowi działam . Tak to działa bardziej szczegółowo.

Tablesort jest uruchamiany „automatycznie”, jeśli tablice (kolumnowe) w tablicy $ headers zawierają klucze „data”, „field” i opcjonalnie „sort”. Spowoduje to utworzenie linków z „sort” i „uporządkowanie” w nagłówkach kolumn oraz wyświetlenie małej strzałki i tym podobnych.

Aby wykonać własne sortowanie, uzyskaj bieżące ustawienia sortowania za pomocą tableort_get_order i tablesort_get_sort i użyj tych wartości do własnej funkcji sortowania. Klucz „sql” w tablicy zwrócony przez tableort_get_order zawiera nazwę pola, która ma być używana do sortowania.

Kawałek (nieprzetestowanego) przykładowego kodu z tablicą $ users zawierającą pewne szczegóły dla każdego użytkownika:

// 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);
Whisky
źródło
1
stackoverflow.com/a/19454643/763010 pomógł mi tutaj z write your own sort function.
tyler.frankenstein
4

Oto kod, który skończyłem na odpowiedzi na whisky. Wykorzystuje zapytanie o pole encji.

 $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
źródło