Как сделать сортируемые таблицы с помощью пейджера с данными из пользовательской таблицы?

19

Для Drupal 6 вы можете сделать что-то вроде этого:

$header = array(
  array('data' => t('Order id'), 'field' => 'order_id'),
  ...
  array('data' => t('Transaction time'), 'field' => 'payment_time', 'sort' => 'desc'),
);
$sql = "...";
$sql .= tablesort_sql($header);
$limit = 25;
$result = pager_query($sql, $limit);
...

Я посмотрел и на drupal 7 и то и другое pager_queryи tablesort_sqlтеперь ушел. Похоже, что вместо этого PagerDefaultкласс можно использовать для создания запроса на пейджер с использованием DBTNG. Я не смог найти никаких подсказок по простому API для присоединения сортируемой таблицы к запросу, как это делается в Drupal 6.

Итак, как создать сортируемую таблицу с пейджером, извлекающим данные из пользовательской таблицы?

googletorp
источник

Ответы:

8

Вы используете так называемые экстендеры. В вашем случае код будет похож на следующий.

$header = array(
  array('data' => t('Order id'), 'field' => 'order_id'),
  // ...
  array('data' => t('Transaction time'), 'field' => 'payment_time', 'sort' => 'desc'),
);

// Initialize $query with db_select().
$query = db_select('your table name');

// Add the fields you need to query.
// ... 

// Add the table sort extender.
$query = $query->extend('TableSort')->orderByHeader($header);

// Add the pager.
$query = $query->extend('PagerDefault')->limit(25);
$result = $query->execute();

См. HowTo: преобразование модуля в DBTNG , динамические запросы: сортировка таблиц и расширители .

kiamlaluno
источник
Не забудьте добавить фактический пейджер в ваш вывод: // Построить таблицу. $ output = theme ('table', array ('header' => $ header, 'lines' => $ lines, 'empty' => t ('Строки недоступны.'))); // Добавить пейджер. $ output. = theme ('pager');
kbrinner
6

Используйте TableSortи PagerDefaultрасширители.

$query = db_select('node', 'n');
$query->fields('n', array('nid', 'title', 'status'));

$table_sort = $query->extend('TableSort') // Add table sort extender.
  ->orderByHeader($header); // Add order by headers.

$pager = $table_sort->extend('PagerDefault')
  ->limit(5); // 5 rows per page.

$result = $pager->execute();
Serjas
источник
2

Используйте модуль DataTables .

Модуль DataTables интегрирует плагин DataTables jQuery в Drupal в качестве стиля представлений и функции вызываемой темы. DataTables позволяет добавлять динамические функции в таблицы, в том числе:

  • Пагинация переменной длины
  • Фильтрация на лету
  • Сортировка с определением типа данных
  • Умная обработка ширины столбцов
  • Тема на CSS
  • И еще не все ...
Satya
источник
Я бы не советовал добавлять модуль для выполнения чего-то, что является частью API БД и может быть сделано с примерно 50 или менее строками пользовательского кода.
Agi Hammerthief
0

Вы можете просто включить тот же Drupal 6 tablesort_sql в ваш код, и он отлично работает.

Для пейджера:

$count = <Total No. of Table rows>

$sql = "...";
$sql .= tablesort_sql($header);
$limit = 25; //Pager limit

$results = db_query( $sql );
$rows = array();
//Loop through the result.
while ( $row = $results->fetchAssoc() ) {
$rows = <Get your array values for Table row>
}
$current_page = pager_default_initialize($count, $limit);
$chunks = array_chunk($rows,$limit, TRUE);
$output = theme( 'table', array( 'header' => $headers, 'rows' => $chunks[$current_page] ) );
$output .= theme( 'pager', array('quantity',$count ) );
print $output;
Paulraj
источник