TableSort peut-il être utilisé sans requête?

15

Dans mon module, j'utilise TableSort pour certaines de mes tables, mais j'ai également des tables qui sont générées par du code, donc pas directement liées à une requête. Ces tables sont également créées avec le thème ('table') et ont donc les tableaux $ header et $ rows. Est-il possible d'utiliser TableSort sur ceux-ci également, peut-être en écrivant ma fonction de tri?

La documentation de tablesort.inc semble suggérer que c'est possible ( toutes les tables créées avec un appel au thème ('table') ont la possibilité d'avoir des en-têtes de colonne sur lesquels l'utilisateur peut cliquer pour trier le tableau par cette colonne ). Cependant, je n'ai trouvé aucune instruction ni exemple sur la façon de procéder. Tout ce que j'ai trouvé jusqu'à présent est basé sur une requête. J'utilise Drupal 7.

Whisky
la source

Réponses:

10

Tablesort se compose en fait de deux systèmes différents qui fonctionnent ensemble.

La première partie est le rendu, ce qui se passe directement dans theme_table () ou est appelé à partir de cela. Tout ce qu'il fait est d'afficher les en-têtes de tableau avec l'indication de tri si un tri par défaut ou un remplacement via $ _GET est présent et en fait des liens afin que vous puissiez cliquer dessus.

La deuxième partie est l' extension de requête TableSort , qui ajuste la requête à laquelle elle est ajoutée en fonction du sens de tri par défaut ou de la substitution $ _GET.

Ces deux systèmes sont en fait assez séparés, ils fonctionnent simplement facilement car ils obtiennent leurs données de la même structure d'en-tête $ et utilisent les mêmes fonctions d'assistance et les mêmes conventions de dénomination pour les paramètres $ _GET. Mais rien ne vous empêche d'utiliser un seul d'entre eux.

Pour répondre à votre question, si vous avez juste besoin de la partie de rendu, vous devez simplement vous assurer de faire quelque chose de similaire à TableSort :: orderbyHeader () . Au lieu de l'appel orderBy (), vous utiliseriez une fonction de tri de tableau ou la transmettriez comme argument à un service Web ou autre.

Et pour le contraire, il vous suffit de vous assurer que vous affichez un lien qui est essentiellement l'équivalent de tablesort_header () afin qu'il soit reconnu par l'extension de requête TableSort.

Berdir
la source
Merci de m'avoir pointé dans la bonne direction, je l'ai fait fonctionner maintenant. Pour ceux qui essaient d'obtenir le même résultat, je mets mes étapes dans une réponse distincte car elle ne rentre pas dans un champ de commentaire.
Whisky
15

Grâce à Berdir, je l'ai fait fonctionner. Voilà comment cela fonctionne plus en détail.

Tablesort est déclenché "automatiquement" si les tableaux (colonnes) du tableau $ headers contiennent les clés 'data', 'field' et éventuellement 'sort'. Cela créera des liens avec «tri» et «ordre» dans les en-têtes de colonne et affichera la petite flèche et autres.

Pour effectuer votre propre tri, obtenez les paramètres de tri actuels avec tablesort_get_order et tablesort_get_sort et utilisez ces valeurs pour votre propre fonction de tri. La clé 'sql' dans le tableau retourné par tablesort_get_order contient le nom du champ à utiliser pour le tri.

Un exemple de code (non testé) avec le tableau $ users contenant des détails pour chaque utilisateur:

// 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
la source
1
stackoverflow.com/a/19454643/763010 m'a aidé ici avec le write your own sort function.
tyler.frankenstein
4

Voici le code que j'ai trouvé sur la réponse du whisky. Il utilise une requête de champ d'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;
Ali Nouman
la source