Drupal → Вывод html таблицы с данными из бд, сортировкой и пагинацией

22.04.2010

Таблица с сортировкой и пагинатором

Код с комментариями ниже.

/**
 * Реализация hook_menu()
 */
function mymodule_menu()
{
    $items['table-test'] = array(
        'title' => 'Table',
        'page callback' => 'mymodule_show_table',
        'access arguments' => array('access content'),
        'type' => MENU_CALLBACK,
    );

    return $items;
}

/**
 * Menu callback для url "table-test"
 */
function mymodule_show_table()
{
    $perpage = 10; // строк на страницу
    $rows = array();
 
    // описание колонок
    $header = array(
        array('data' => 'ID',        'field' => 'nid'),
        array('data' => 'Тип',       'field' => 'type'),
        array('data' => 'Заголовок', 'field' => 'title'),
    );

    $result = pager_query("SELECT nid, type, title FROM {node} WHERE status = 1" . tablesort_sql($header), $perpage);
 
    while ($row = db_fetch_array($result))
    {
        $rows[] = $row;  
    }
 
    $output  = theme('table', $header, $rows);    // Получаем html код таблицы
    $output .= theme('pager', NULL, $perpage, 0); // Получаем html код пагинатора
 
    return $output;
}

Если запрос, передаваемый в pager_query, содержит группировку GROUP BY, вычисляемое поле COUNT или просто сложен, то четвёртым параметром нужно передать ещё один запрос для получения количества записей. Пример:

$result = pager_query(
    "SELECT nid, type, title FROM {node} WHERE status = 1" . tablesort_sql($header),
    $perpage,
    0,
    "SELECT COUNT(*) FROM {node} WHERE status = 1"
);

Подробнее.

По материалам Creating a table with sortable columns and pagination from custom SQL.

Написанное актуально для
Drupal 6.x
Похожие записи

Комментарии

А как быть, если надо добавить ещё одну колонку, с нужным текстом, значение которого берётся из другого SQL запроса?

добавляйте в $results перед выводом таблицы

Гость
19.04.2011, 15:33

А как можно значения одной из колонок отобразить в виде ссылок... засунуть в функцию l() ?

Гость
19.04.2011, 15:44

хороший ответ :)
хотелось бы код

 $result = pager_query($sql, $perpage, 0, $count_sql);

  while ($row = db_fetch_array($result)) {
    $rows[] = $row;  
  }
 
  $output  = theme('table', $header, $rows);    // Получаем html код таблицы
  $output .= theme('pager', NULL, $perpage, 0); // Получаем html код пагинатора
 
  return $output;

куда добавить l()?

Гость
19.04.2011, 15:59

как то так

while ($row = db_fetch_array($result)) {
  if($result->title) {
    $rows[] = l($row, 'node/' . $node->nid . '/edit');
  }
  else $rows[] = $row;
}

я правильно понимаю?

Гость
21.04.2011, 09:29

Разрулил вот так:

while ($row = db_fetch_array($result)) {
    if (array_key_exists('title', $row)) {
      $row['title'] = l($row['title'], 'ccontent/' . $row['title']);
    }
  
    $rows[] = $row;
}

корявенько, но работает :)
Спасибо за подсказки!

Гость
26.04.2013, 11:14

Подскажите, как изменить параметр $_GET['order'] на компактный вид? Т.е. если у нас, например,

array('data' => 'Максимальный вес (кг)', 'field' => 'title'),

то после сортировки по этому столбцу получается не оч красивый урл если есть длинное описание да еще и с пробелами.
Например в мозиле -
&sort=asc&order=Максимальный вес (кг) ,
а в хроме -

sort=asc&order=%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%B2%D0%B5%D1%81%20%28%D0%BA%D0%B3%29

Все, решил.
При создании заголовка таблицы

array('data' => 'm_v', 'field' => 'max_ves'),

1 Переопределяем theme_table в template.php
2 Копируем функцию tablesort_header в template.php, переименовав, например, в my_tablesort_header
3 В имя_темы_table меняем

$cell = tablesort_header($cell, $header, $ts);

на

$cell = my_tablesort_header($cell, $header, $ts);

4 В my_tablesort_header изменяем строку

$cell['data'] = l($cell['data'] . $image, $_GET['q'], array('attributes' => array('title' => $title), 'query' => array_merge($ts['query'], array('sort' => $ts['sort'], 'order' => $cell['data'])), 'html' => TRUE));

на

$cell['data'] = l($title_new . $image, $_GET['q'], array('attributes' => array('title' => $title), 'query' => array_merge($ts['query'], array('sort' => $ts['sort'], 'order' => $cell['data'])), 'html' => TRUE));

Где $title_new

	if($cell['data']=='m_v') $title_new='Максимальный вес (кг)';
	else $title_new=$cell['data'];

А как прицепить к примеру фильтрацию к таблице, и колонку с возможностью выделения рядов данных?

Добавить комментарий