¿Se puede usar TableSort sin una consulta?

15

En mi módulo, estoy usando TableSort para algunas de mis tablas, pero también tengo algunas tablas que se generan por código, por lo que no están directamente vinculadas a una consulta. Estas tablas también se crean con el tema ('tabla') y también tienen las matrices $ header y $ rows. ¿Es posible usar TableSort también en esos, tal vez al escribir mi función de clasificación?

La documentación de tablesort.inc parece sugerir que es posible ( todas las tablas creadas con una llamada al tema ('tabla') tienen la opción de tener encabezados de columna en los que el usuario puede hacer clic para ordenar la tabla por esa columna ). Sin embargo, no he encontrado ninguna instrucción o ejemplo sobre cómo hacer esto. Todo lo que encontré hasta ahora se basa en una consulta. Estoy usando Drupal 7.

Whisky
fuente

Respuestas:

10

Tablesort en realidad consiste en dos sistemas diferentes que trabajan juntos.

La primera parte es la representación, lo que sucede directamente dentro de theme_table () o se llama desde allí. Todo lo que hace es mostrar los encabezados de la tabla con la indicación de ordenación si está presente una ordenación o anulación predeterminada a través de $ _GET y los hace enlaces para que pueda hacer clic en ellos.

La segunda parte es el extensor de consulta TableSort , que ajusta la consulta en la que se agrega según la dirección de ordenación predeterminada o la anulación $ _GET.

Estos dos sistemas en realidad están bastante separados, simplemente funcionan juntos fácilmente porque obtienen sus datos de la misma estructura $ header y usan las mismas funciones auxiliares y convenciones de nomenclatura para los parámetros $ _GET. Pero nada le impide usar solo uno de estos.

Para responder realmente a su pregunta, si solo necesita la parte de representación, solo debe asegurarse de hacer algo similar a TableSort :: orderbyHeader () . En lugar de la llamada a orderBy (), usaría una función de ordenación de matriz o la pasaría como argumento a un servicio web o cualquier otra cosa.

Y por el contrario, solo debe asegurarse de mostrar un enlace que sea básicamente el equivalente de tablesort_header () para que sea reconocido por el extensor de consultas de TableSort.

Berdir
fuente
Gracias por señalarme en la dirección correcta. Lo tengo funcionando ahora. Para aquellos que intentan lograr lo mismo, pongo mis pasos en una respuesta separada, ya que no cabe en un campo de comentarios.
Whisky
15

Gracias a Berdir lo conseguí funcionando. Así es como funciona con más detalle.

Tablesort se activa "automáticamente" si las matrices (columna) en la matriz $ headers contienen las claves 'datos', 'campo' y opcionalmente 'ordenar'. Esto creará enlaces con 'ordenar' y 'ordenar' en los encabezados de las columnas y mostrará la pequeña flecha y tal.

Para hacer su propia clasificación, obtenga la configuración de clasificación actual con tablesort_get_order y tablesort_get_sort y use esos valores para su propia función de clasificación. La clave 'sql' en la matriz devuelta por tablesort_get_order contiene el nombre del campo que se utilizará para la ordenación.

Una pieza de código de ejemplo (no probado) con la matriz $ users que contiene algunos detalles para cada usuario:

// 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
fuente
1
stackoverflow.com/a/19454643/763010 me ayudó aquí con el write your own sort function.
tyler.frankenstein
4

Aquí está el código que terminé en la respuesta de whisky. Utiliza la consulta de campo de entidad.

 $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
fuente