Drupal API

pager_query

  • Drupal 5
  • Drupal 6
Помощь с переводами — это то, чего мы просим. Можешь начать с регистрации.

includes/pager.inc, строка 50

Версии
5 – 6
pager_query($query, $limit = 10, $element = 0, $count_query = NULL)

Выполняет «постраничный» запрос к базе данных.

Используйте эту функцию, когда результирующие данные надо будет представить постранично. Функция использует SQL-конструкцию 'LIMIT', чтобы получать только те данные, которые нужны для отображения текущей страницы. Тем не менее, она должна получить общее количество записей, возвращаемых запросом, чтобы вычислить количество страниц (кол-во_записей / записей_на_страницу). Это реализуется вставкой 'COUNT(*)' в начальный запрос. Например, запрос 'SELECT nid, type FROM node WHERE status = 1 ORDER BY sticky DESC, created DESC' будет превращен в 'SELECT COUNT(*) FROM node WHERE status = 1 ORDER BY sticky DESC, created DESC'.

К сожалению, превращение запроса не всегда работает для запросов которые уже имеют 'COUNT(*)' или 'GROUP BY', и, возможно, для некоторых других сложных запросов. В этом случае, вы, по желанию, можете предоставить запрос, который будет использован для подсчета количества записей.

Например, если вы хотите разбить постранично запрос 'SELECT COUNT(*), type FROM node GROUP BY type', pager_query() запустит неправильный запрос 'SELECT COUNT(*) FROM node GROUP BY type'. Посему, вместо этого, вы должны передать 'SELECT COUNT(DISTINCT(TYPE)) FROM node' в $count_query аргумент функции.

Параметры

$query SQL запрос.

$limit Количество результатов на страницу.

$element (опционально) Целое число для идентификации листалки (если их несколько на странице).

$count_query SQL запрос количества элементов.

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

Возвращаемое значение

Результирующий ресурс запроса или FALSE, если запрос вызвал ошибку.

Связанные темы

▸ 28 функции вызывают pager_query()

▾ 28 функции вызывают pager_query()

aggregator_feed_items_load in modules/aggregator/aggregator.pages.inc
Load feed items by passing a SQL query.
blog_page_last in modules/blog/blog.pages.inc
Коллбэк меню. Показывает страницу Друпал с последними записями в блогах пользователей.
blog_page_user in modules/blog/blog.pages.inc
Коллбэк меню. Показывает страницу Друпал с последними записями в блоге данного пользователя.
comment_admin_overview in modules/comment/comment.admin.inc
Конструктор формы; генерирует форму с кратким содержанием комментариев для администратора.
comment_render in modules/comment/comment.module
Отображает комментарии.
dblog_overview in modules/dblog/dblog.admin.inc
Коллбэк меню; выводит логи сообщений.
dblog_top in modules/dblog/dblog.admin.inc
Menu callback; generic function to display a page of the most frequent dblog events of a specified type.
do_search in modules/search/search.module
Do a query on the full-text search index for a word or words.
forum_get_topics in modules/forum/forum.module
node_admin_nodes in modules/node/node.admin.inc
Form builder: Builds the node administration overview.
node_page_default in modules/node/node.module
Menu callback; Generate a listing of promoted nodes.
path_admin_overview in modules/path/path.admin.inc
Return a listing of all defined URL aliases. When filter key passed, perform a standard search on the given key, and return the list of matching URL aliases.
poll_page in modules/poll/poll.pages.inc
Menu callback to provide a simple list of all polls available.
poll_votes in modules/poll/poll.pages.inc
Callback for the 'votes' tab for polls you can see other votes on
profile_browse in modules/profile/profile.pages.inc
Menu callback; display a list of user information.
statistics_node_tracker in modules/statistics/statistics.pages.inc
statistics_recent_hits in modules/statistics/statistics.admin.inc
Menu callback; presents the 'recent hits' page.
statistics_top_pages in modules/statistics/statistics.admin.inc
Menu callback; presents the 'top pages' page.
statistics_top_referrers in modules/statistics/statistics.admin.inc
Menu callback; presents the 'referrer' page.
statistics_top_visitors in modules/statistics/statistics.admin.inc
Menu callback; presents the 'top visitors' page.
statistics_user_tracker in modules/statistics/statistics.pages.inc
system_actions_manage in modules/system/system.module
Menu callback. Display an overview of available and configured actions.
taxonomy_overview_terms in modules/taxonomy/taxonomy.admin.inc
Form builder for the taxonomy terms overview.
taxonomy_select_nodes in modules/taxonomy/taxonomy.module
Находит все ноды, которые соответствуют выбранным условиям таксономии.
tracker_page in modules/tracker/tracker.pages.inc
Menu callback. Prints a listing of active nodes on the site.
user_admin_account in modules/user/user.admin.inc
Form builder; User administration page. See alsouser_admin_account_validate()
user_search in modules/user/user.module
Реализация hook_search().
_locale_translate_seek in includes/locale.inc
Perform a string search and display results in a table

Код

<?php
function pager_query($query, $limit = 10, $element = 0, $count_query = NULL) {
  global $pager_page_array, $pager_total, $pager_total_items;
  $page = isset($_GET['page']) ? $_GET['page'] : '';
  // Substitute in query arguments.
  $args = func_get_args();
  $args = array_slice($args, 4);
  // Alternative syntax for '...'
  if (isset($args[0]) && is_array($args[0])) {
    $args = $args[0];
  }
  // Construct a count query if none was given.
  if (!isset($count_query)) {
    $count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query);
  }
  // Convert comma-separated $page to an array, used by other functions.
  $pager_page_array = explode(',', $page);
  // We calculate the total of pages as ceil(items / limit).
  $pager_total_items[$element] = db_result(db_query($count_query, $args));
  $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
  $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
  return db_query_range($query, $args, $pager_page_array[$element] * $limit, $limit);
}
?>

Пользовательские комментарии

Если в запросе используется конструкция 'GROUP BY ... HAVING ...', то избавиться от GROUP BY заменой
на COUNT(DISTINCT(type)) не получится - логика запроса будет поломана.

Исходный запрос, который получает uid всех пользователей, у которых в блоге записей не меньше, чем $post_limit:

  $sql = "SELECT n.uid
          FROM {node} n
          WHERE n.uid <> 0
            AND n.type = 'blog'
            AND n.status = 1
          GROUP BY n.uid HAVING COUNT(*) > ". $post_limit;

Решение
Функция pager_query() получает 4м аргументом запрос, который должен корректно посчитать количество элементов для пейджера. Нужно перестроить исходный запрос так, чтобы он правильно считал это количество.
Пример:

    $sub_sql = "SELECT n.uid, COUNT(*) AS count
                  FROM {node} n
                  WHERE n.type = 'blog'
                    AND n.status = 1
                    AND n.uid <> 0
                  GROUP BY n.uid";
    $count_sql = "SELECT COUNT(*)
                  FROM {users} u
                    INNER JOIN (". $sub_sql .") c ON c.uid = u.uid
                  WHERE c.count > ". $post_limit;
    $result = pager_query($sql, 10, 0, $count_sql);

Идея была найдена здесь: http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row....
Там же можно посмотреть другие примеры.

Если нужно сделать замену шаблонов в запросе, то нужно после обязательных аргументов передать массив со значениями или сами значения.
Пример:
$result = pager_query($sql, $blogger_per_page, 0, $count_sql, array('%s' => $sub_sql, '%d' => $post_limit));

цитата:
$element (опционально) Целое число для идентификации листалки (если их несколько на странице).

а я бы написал: для указания страницы

Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вход в систему

Что такое OpenID?
  • Регистрация
  • Забыли пароль?

Документация

  • Drupal 6
  • Константы
  • Файлы
  • Функции
  • Глобальные переменные
  • Разделы