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

12.09.2011

Пример вывода списка нод по 10 штук на страницу, с возможностью сортировки по заголовку, дате и типу ноды:

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

$header = array(
  array('data' => 'Заголовок',     'field' => 'title'),
  array('data' => 'Дата создания', 'field' => 'created'),
  array('data' => 'Тип',           'field' => 'type'),
);
  
$nodes = db_select('node', 'n')
  ->fields('n', array('title', 'created', 'type'))
  ->extend('PagerDefault')
  ->limit(10)
  ->extend('TableSort')
  ->orderByHeader($header)
  ->execute();

$rows = array();
foreach ($nodes as $node) {
  $rows[] = array(
    check_plain($node->title),
    format_date($node->created),
    $node->type
  );
}

$output = theme('table', array('header' => $header, 'rows' => $rows));
$output .= theme('pager');

Подробнее про "Extenders".
Создание html таблицы с сортировкой и пагинацией в Drupal 6.

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

Комментарии

интересен $output
а не проще ли через views такое делать?

$node->title через check_plain пропустить нужно, это ведь raw-output, мало что там может пользователь ввести, а браузер все скушает.
Вот например как с помощью вьюшки это выводится
http://my.jetscreenshot.com/5611/20110913-so4a-42kb

Хотелось бы услышать в чем по Вашему мнению сложность. Сделала за 2 минуты. $node->title преобразовывается в plain-text

А вот что выводит Ваш код - http://my.jetscreenshot.com/5611/20110913-3ji7-43kb

Html, javascrip-код не преобразовывается, что несет потенциальную уязвимость.

не проще

Если бы добавили сравнение со способом через Views, было бы более полное рассмотрение вопроса :)

пост о том, как пользоваться сортировкой и пагинацией в DBTNG, а не о способах вывода табличной информации. любители Views могут попробовать вывести в таком виде ну например логи из watchdog :)

Гость
20.09.2011, 00:20

Drupal "умеет" сортировать таблицу по столбцам - отлично, а виджет с фильтром по тексту таблицы интегрированный у него есть (т.е. готовое поле ввода для отфильтровки по содержимому конкретного поля/полей таблицы, логика работы которого генерится автоматом как в случае с сортировкой и постраничностью)?

Гость
20.09.2011, 11:02

Очень жаль. А нету примерчика как фильтр к таблице можно реализовать?

Vydrin_AP
20.09.2011, 11:12

Отличная заметка!
Кстати, если из кода убрать эти две строки:

  ->extend('TableSort')
  ->orderByHeader($header)

то сортировка никуда не денется, т.к. она задается в header, так если у поля есть параметр field, то оно будет сортируемым, если нет, то нет.
И еще, думаю может кому-нибудь пригодится, если надо объединить несколько колонок в теле таблицы под одной в хедере, то колонка должна выглядеть так:

$header = array(
  array('data' => t('Actions'), 'colspan' => 3),
);

colspan - количество колонок.

то сортировка никуда не денется

она работать не будет

Vydrin_AP
20.09.2011, 11:41

Ваша правда. Сортировка как бы есть, но ее как бы нет.

Хреново, что в семёрке сортировка возможна только с db_select(), а не с db_query() как было в шохе

Гость
05.11.2011, 22:18

Извиняюсь за глупый вопрос - только начал пытаться понять drupal. А куда этот код вставлять? Я попробовал в файлик шаблона (предварительно сделал node--название типа ноды.tpl.php) но ничего не произошло!

Доброго времени суток!
Разбираюсь с описанным выше способом вывода данных, только не ноды, а собственноручно созданной сущности.
Да, впрочем, вопрос актуален и для ноды, для любой сущности в общем-то. Вопрос в следующем - поля сущности описываются в собственной таблице БД ('node' в данном примере) и при построении строки нашей html-таблицы берутся оттуда. А что делать, если я присоединил к сущности дополнительное поле, при помощи интерфейса fields, и хочу вывести это поле вместе с остальными в той же таблице? Для него ведь создаются отдельные таблички в БД вида 'field_data_field_myfield' и тд.

Я конечно могу по аналогии задать при описании хедера

array('data' => 'Присоединённое поле',   'field' => 'field_myfield'),

но потом идёт выборка из 'node'

$nodes = db_select('node', 'n')
  ->fields('n', array('title', 'created', 'type'))

т.е. значение поля field_myfield таким образом не достать, т.к. оно лежит в другой таблице. Я могу реализовать способ прямого доступа к значению этого поля для текущего экземпляра сущности и вписать его в массив rows[]. И оно даже нормально будет выводиться. Но при этом сортировка по этому полю работать не будет, естественно, т.к. она производится тоже через db_select таблицы с полями сущности ('nodes') и условие ORDER BY.
Можно ли как-то реализовать сортировку такой таблицы по полю, добавленному к сущности через fields api?

Гость
28.03.2012, 16:12

такая проблемка запрос не возвращает массив данных, только если использовать метод fetchAll() и ему подобные но ведь тогда не будет работать пейджер. количевство вроде правильно записей выводин но значений нет. вот код:

	$node_query = db_select('node', 'n');
	$node_query->innerJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
	$node_query->innerJoin('users', 'u', 'u.uid = n.uid');
	$node_query->innerJoin('taxonomy_term_data', 'ttd', 'ttd.tid = ti.tid');
	$node_query->fields('n', array('nid' , 'title'));
	$node_query->addExpression("FROM_UNIXTIME(n.created, '%d.%m.%Y')", 'created');
	$node_query->addField('ttd', 'name', 'ad_group');
	$node_query->addField('n', 'status', 'status');
	$node_query->addField('u', 'name', 'owner');
	$node_query->condition('n.type', 'simpleads')
	->orderBy('n.uid', 'asc')
  ->extend('PagerDefault')
  ->limit(1)
	->extend('TableSort')
	->orderByHeader($header)
	->execute();

	$rows = array();
	foreach ($node_query as $node_a) {
	  if ($node_a->status == 1)
	    $status = t('Published');
	  else $status = t('Unpublished');
	  $rows[] = array($node_a->nid, $node_a->title, $node_a->ad_group, $node_a->created, $status, $node_a->owner);
	}
	$output = theme('table', array('header' => $header, 'rows' => $rows, 'caption' => t('Ad list')));
	$output .= theme('pager');

ошибка следу.щего вида:

Notice: Trying to get property of non-object в функции simpleads_settings_owner() (строка 227 в файле D:\xampp\htdocs\votkinsk.dev\sites\all\modules\simpleads\simpleads.module).

Гость
28.03.2012, 16:44

ошибки на любое обращение/вывод к объекту
$node_a

в 227 строке if ($node_a->status == 1)

так же ошибкт подобного радо в 230 строке

$rows[] = array($node_a->nid, $node_a->title, $node_a->ad_group, $node_a->created, $status, $node_a->owner);

5 штук на каждое обращение к $node_a

в foreach надо передавать результат execute() а не объект SelectQuery

Гость
28.03.2012, 16:51

ну так у меня стоит execute() в конце объекта. или надо чтото еще?

пробывал по другомо execute() из selectquery убрал и сделал так:

$node_ads = $node_query->execute();

и передал в foreach $node_ads результат выводиться а пейджер нет.
в первом случае наоборот тамблица есть пейджер есть результата нет.

в чем проблема? не могу понять

Приветствую,
а как заставить это дело (pager) корректно отображаться в блоке на одиночной странице для авторизованных пользователей? Для анонимов все OK.

Здравствуйте,
а как pager-у задать вывод вида 1 из N со ссылками назад-вперед, как у Views.

Спасибо!
В моем случае проблема решилась простой передачей параметров

print theme('pager', ...);
Гость
17.12.2012, 17:39

Как на одной странице разместить две такие таблицы и чтобы работало.

А как узнать всего кол-во записей? Отдельном запросом или как нибудь можно взять из extend('PagerDefault') ?

Очень нужен совет. Как в таблице один из столбцов сортировать не по полю из таблицы MySQL, а по своим параметрам?

Сумма нескольких полей из двух прикрепляемых таблиц (комментарии и материалы пользователя).

Гость
04.02.2015, 15:00

Скажите, а как перевести кнопки "next" и "last"&

Гость
26.05.2015, 20:13

Можно ли сделать чтобы сортировка работала для всех колонок, а не только для первой?

Да, укажите 'field' => 'имя_поля_в_бд' как у первой колонки.

Бакыт
18.04.2016, 09:22

А не пробовали прикрутить ajax-пагинатор?

А теперь главный вопрос, можно ли автоматически создавать таблицу данной функцией, но не из БД а скажем из данных парсинга xml файла? Если да, то как?

Сергей
21.06.2018, 13:52

Круто! Благодарю) Сперва хотел для этих целей плагин под вьюс сделать, но лучше - проще сделать.

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