Чи можна використовувати TableSort без запиту?


15

У своєму модулі я використовую TableSort для деяких моїх таблиць, але у мене також є деякі таблиці, які генеруються кодом, тому не пов'язані безпосередньо із запитом. Ці таблиці також створені з темою ('table') і так мають масиви $ header та $ рядки. Чи можна використовувати TableSort і для тих, хто може, написавши свою функцію сортування?

Документація для tablesort.inc , здається, передбачає , що це можливо ( Всі таблиці , створені за допомогою виклику теми ( «таблиці») мають можливість мати заголовки стовпців , які користувач може натиснути на , щоб впорядкувати таблицю за цим колонки ). Однак я не знайшов ніяких вказівок чи приклад, як це зробити. Все, що я знайшов поки що, ґрунтується на запиті. Я використовую Drupal 7.

Відповіді:


10

Фактично Tablesort складається з двох різних систем, які працюють разом.

Перша частина - це візуалізація, те, що відбувається безпосередньо в topic_table () або викликається з цього приводу . Все, що це робиться, це відображення заголовків таблиць із вказівкою сортування, якщо за замовчуванням сортування або переосмислення через $ _GET є, і робить їх посиланнями, щоб ви могли натискати на них.

Друга частина - це розширювач запиту TableSort , який коригує запит, на який він додається, виходячи з напрямку сортування за замовчуванням або заміни $ _GET.

Ці дві системи насправді досить відокремлені, вони просто працюють разом, оскільки вони отримують свої дані з тієї самої структури заголовка $ і використовують ті ж допоміжні функції та умови іменування параметрів $ _GET. Але ніщо не заважає вам використовувати лише один із них.

Щоб відповісти на ваше запитання, якщо вам просто потрібна частина візуалізації, вам просто потрібно переконатися, що ви робите щось подібне до TableSort :: orderbyHeader () . Замість виклику orderBy () ви б використовували функцію сортування масиву або передавали її як аргумент веб-службі чи чомусь іншому.

І для навпаки, вам просто потрібно переконатися, що ви відображаєте посилання, яке в основному еквівалент таблиціortort_header (), так що воно розпізнається розширенням запиту TableSort.


Дякую, що вказували на мене в правильному напрямку, я зараз працюю. Для тих, хто намагається досягти того ж, я викладаю свої кроки в окрему відповідь, оскільки вона не вписується в поле коментарів.
Віскі

15

Завдяки Бердіру я все працював. Ось як це працює більш детально.

Таблиця запускається "автоматично", якщо масиви (стовпці) в масиві $ заголовки містять ключі "дані", "поле" та необов'язково "сортувати". Це створить посилання з "сортування" та "порядок" у заголовках стовпців та покаже маленьку стрілку та інше.

Щоб зробити власне сортування, отримайте поточні налаштування сортування за допомогою таблицьort_get_order та tableort_get_sort та використовуйте ці значення для власної функції сортування. Ключ 'sql' у масиві, повернутий tableort_get_order, містить ім'я поля, яке буде використано для сортування.

Елемент (неперевірений) приклад коду з масивом $ users, що містить деякі дані для кожного користувача:

// 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 допомогли мені тут write your own sort function.
tyler.frankenstein

4

Ось код, який я опинив у відповіді віскі. Він використовує запит поля особи.

 $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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.