Помощь с переводами — это то, чего мы просим. Можешь начать с регистрации.
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
, если запрос вызвал ошибку.
Perform a paged database query.
Use this function when doing select queries you wish to be able to page. The
pager uses LIMIT-based queries to fetch only the records required to render a
certain page. However, it has to learn the total number of records returned
by the query to compute the number of pages (the number of records / records
per page). This is done by inserting "COUNT(*)" in the original query. For
example, the query "SELECT nid, type FROM node WHERE status = '1' ORDER BY
sticky DESC, created DESC" would be rewritten to read "SELECT COUNT(*) FROM
node WHERE status = '1' ORDER BY sticky DESC, created DESC". Rewriting the
query is accomplished using a regular expression.
Unfortunately, the rewrite rule does not always work as intended for queries
that already have a "COUNT(*)" or a "GROUP BY" clause, and possibly for
other complex queries. In those cases, you can optionally pass a query that
will be used to count the records.
For example, if you want to page the query "SELECT COUNT(*), TYPE FROM node
GROUP BY TYPE", pager_query() would invoke the incorrect query "SELECT
COUNT(*) FROM node GROUP BY TYPE". So instead, you should pass "SELECT
COUNT(DISTINCT(TYPE)) FROM node" as the optional $count_query parameter.
Parameters
$query
The SQL query that needs paging.
$limit
The number of query results to display per page.
$element
An optional integer to distinguish between multiple pagers on one page.
$count_query
An SQL query used to count matching records.
...
A variable number of arguments which are substituted into the query (and
the count query) using printf() syntax. Instead of a variable number of
query arguments, you may also pass a single array containing the query
arguments.
Return value
A database query result resource, or FALSE if the query was not executed
correctly.
Связанные темы
- Уровень абстракции базы данных
- Позволяет выполнять один программный код на разных СУБД.
▸ 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'] : '';
$args = func_get_args();
$args = array_slice($args, 4);
if (isset($args[0]) && is_array($args[0])) {
$args = $args[0];
}
if (!isset($count_query)) {
$count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query);
}
$pager_page_array = explode(',', $page);
$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:
Решение
Функция pager_query() получает 4м аргументом запрос, который должен корректно посчитать количество элементов для пейджера. Нужно перестроить исходный запрос так, чтобы он правильно считал это количество.
Пример:
Идея была найдена здесь: 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 (опционально) Целое число для идентификации листалки (если их несколько на странице).
а я бы написал: для указания страницы