Функция cot_pagenav в Cotonti. Пагинация
Предназначена для построения навигации по страницам (пагинации) в рамках PHP-фреймворка Cotonti. Она позволяет создавать ссылки на страницы (первую, предыдущую, следующую, последнюю)
Функция cot_pagenav предназначена для построения навигации по страницам (пагинации) в рамках PHP-фреймворка Cotonti. Она позволяет создавать ссылки на страницы (первую, предыдущую, следующую, последнюю) и отображать номера страниц с учетом текущей страницы и общего количества записей. Функция достаточно гибкая, с поддержкой как обычной пагинации, так и с использованием AJAX.
Разбор функции в контексте Cotonti:
/**
* Page navigation (pagination) builder. Uses URL transformation and resource strings,
* returns an associative array, containing:
* ['prev'] - first and previous page buttons
* ['main'] - buttons with page numbers, including current
* ['next'] - next and last page buttons
* ['last'] - last page with number
*
* @param string $module Site area or script name
* @param mixed $params URL parameters as array or parameter string
* @param int $currentOffset Current page offset
* @param int $entries Total rows
* @param int $perPage Rows per page
* @param string $character Symbol for parameter which transfer pagination
* @param string $hash Hash part of the url (including #)
* @param bool $ajax Add AJAX support
* @param string $target_div Target div ID if $ajax is true
* @param string $ajax_module Site area name for ajax if different from $module
* @param string $ajax_params URL parameters for ajax if $ajax_module is not empty
* @return array
*/
function cot_pagenav(
$module,
$params,
$currentOffset,
$entries,
$perPage,
$character = 'd',
$hash = '',
$ajax = false,
$target_div = '',
$ajax_module = '',
$ajax_params = []
) {
if (function_exists('cot_pagenav_custom')) {
// For custom pagination functions in plugins
return cot_pagenav_custom($module, $params, $currentOffset, $entries, $perPage, $character, $hash,
$ajax, $target_div, $ajax_module, $ajax_params);
}
if (!$perPage) {
$perPage = Cot::$cfg['maxrowsperpage'] ? (int) Cot::$cfg['maxrowsperpage'] : 1;
}
$onPage = $entries - $currentOffset;
if ($onPage > $perPage) {
$onPage = $perPage;
}
if ($onPage < 0) {
$onPage = 0;
}
$totalPages = (int) ceil($entries / $perPage);
$currentPage = (int) floor($currentOffset / $perPage) + 1;
is_array($params) ? $args = $params : parse_str($params, $args);
unset($args[$character]);
$firstPageUrl = cot_url($module, $args, $hash);
$lastPageOffset = ($totalPages - 1) * $perPage;
if (Cot::$cfg['easypagenav']) {
$num = floor($lastPageOffset / $perPage) + 1;
$args[$character] = $num == 1 ? null : $num;
} else {
$args[$character] = $lastPageOffset;
}
$lastPageUrl = cot_url($module, $args, $hash);
if ($entries <= $perPage) {
return [
'first' => '',
'prev' => '',
'main' => '',
'next' => '',
'last' => '',
'current' => 1,
'firstlink' => $firstPageUrl,
'prevlink' => '',
'nextlink' => '',
'lastlink' => $lastPageUrl,
'total' => 1,
'onpage' => $onPage,
'perPage' => $perPage,
'entries' => $entries,
];
}
$each_side = 3; // Links each side
$base_rel = '';
if ($ajax) {
$ajax_rel = !empty($ajax_module);
$ajax_rel && is_string($ajax_params) ? parse_str($ajax_params, $ajax_args) : $ajax_args = $ajax_params;
$ajaxClass = 'ajax';
if (empty($target_div)) {
$base_rel = $ajax_rel ? ' rel="get;' : '';
} else {
$base_rel = $ajax_rel ? ' rel="get-'.$target_div.';' : ' rel="get-'.$target_div.'"';
}
} else {
$ajax_rel = false;
$ajaxClass = '';
}
$cur_left = $currentPage - $each_side;
if ($cur_left < 1) {
$cur_left = 1;
}
$cur_right = $currentPage + $each_side;
if ($cur_right > $totalPages) {
$cur_right = $totalPages;
}
// Main block
$first = '';
$prev = '';
$prevlink = '';
$next = '';
$nextlink = '';
$last = '';
$lastn = false;
$before = '';
$pages = '';
$after = '';
$i = 1;
$n = 0;
while ($i < $cur_left) {
if (Cot::$cfg['easypagenav']) {
$args[$character] = $i == 1 ? null : $i;
} else {
$args[$character] = ($i - 1) * $perPage;
}
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$before .= cot_rc('link_pagenav_main', array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => $i
));
if ($i < $cur_left - 2) {
$before .= Cot::$R['link_pagenav_gap'];
} elseif ($i == $cur_left - 2) {
if (Cot::$cfg['easypagenav']) {
$args[$character] = $i + 1;
} else {
$args[$character] = $i * $perPage;
}
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel . str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$before .= cot_rc('link_pagenav_main', array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => $i + 1
));
}
$i *= ($n % 2) ? 2 : 5;
$n++;
}
for ($j = $cur_left; $j <= $cur_right; $j++)
{
if (Cot::$cfg['easypagenav'])
{
$args[$character] = $j == 1 ? null : $j;
}
else
{
$args[$character] = ($j - 1) * $perPage;
}
if ($ajax_rel)
{
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
}
else
{
$rel = $base_rel;
}
$rc = $j == $currentPage ? 'current' : 'main';
$pages .= cot_rc('link_pagenav_'.$rc, array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => $j
));
}
while ($i <= $cur_right)
{
$i *= ($n % 2) ? 2 : 5;
$n++;
}
while ($i < $totalPages)
{
if ($i > $cur_right + 2)
{
$after .= Cot::$R['link_pagenav_gap'];
}
elseif ($i == $cur_right + 2)
{
if (Cot::$cfg['easypagenav'])
{
$args[$character] = $i == 2 ? null : $i - 1;
}
else
{
$args[$character] = ($i - 2) * $perPage;
}
if ($ajax_rel)
{
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
}
else
{
$rel = $base_rel;
}
$after .= cot_rc('link_pagenav_main', array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => $i - 1
));
}
if (Cot::$cfg['easypagenav'])
{
$args[$character] = $i == 1 ? null : $i;
}
else
{
$args[$character] = ($i - 1) * $perPage;
}
if ($ajax_rel)
{
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
}
else
{
$rel = $base_rel;
}
$after .= cot_rc('link_pagenav_main', array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => $i
));
$i *= ($n % 2) ? 2 : 5;
$n++;
}
$pages = $before.$pages.$after;
// Previous/next
if ($currentOffset > 0) {
$previousPageOffset = $currentOffset - $perPage;
if ($previousPageOffset < 0) {
$previousPageOffset = 0;
}
if ($previousPageOffset > $lastPageOffset) {
$previousPageOffset = $lastPageOffset;
}
if (Cot::$cfg['easypagenav']) {
$num = floor($previousPageOffset / $perPage) + 1;
$args[$character] = $num == 1 ? null : $num;
} else {
$args[$character] = $previousPageOffset;
}
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$prevlink = cot_url($module, $args, $hash);
$prev = cot_rc(
'link_pagenav_prev',
[
'url' => $prevlink,
'class' => $ajaxClass,
'rel' => $rel,
'num' => $previousPageOffset + 1,
]
);
$args[$character] = 0;
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$first = cot_rc(
'link_pagenav_first',
[
'url' => $firstPageUrl,
'class' => $ajaxClass,
'rel' => $rel,
'num' => 1,
]
);
}
if (($currentOffset + $perPage) < $entries) {
$next_n = $currentOffset + $perPage;
if (Cot::$cfg['easypagenav']) {
$num = floor($next_n / $perPage) + 1;
$args[$character] = $num == 1 ? null : $num;
} else {
$args[$character] = $next_n;
}
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$nextlink = cot_url($module, $args, $hash);
$next = cot_rc('link_pagenav_next', [
'url' => $nextlink,
'class' => $ajaxClass,
'rel' => $rel,
'num' => $next_n + 1,
]);
if ($ajax_rel) {
$ajax_args[$character] = $args[$character];
$rel = $base_rel.str_replace('?', ';', cot_url($ajax_module, $ajax_args)).'"';
} else {
$rel = $base_rel;
}
$last = cot_rc('link_pagenav_last', array(
'url' => $lastPageUrl,
'class' => $ajaxClass,
'rel' => $rel,
'num' => $lastPageOffset + 1,
));
$lastn = (($lastPageOffset + $perPage) < $entries) ?
cot_rc('link_pagenav_main', array(
'url' => cot_url($module, $args, $hash),
'class' => $ajaxClass,
'rel' => $rel,
'num' => floor($lastPageOffset / $perPage) + 1
)) : FALSE;
}
return [
'first' => '',
'prev' => $first . $prev,
'main' => $pages,
'next' => $next . $last,
'last' => $lastn,
'current' => $currentPage,
'firstlink' => $firstPageUrl,
'prevlink' => $prevlink,
'nextlink' => $nextlink,
'lastlink' => $lastPageUrl,
'total' => $totalPages,
'onpage' => $onPage,
'perPage' => $perPage,
'entries' => $entries,
];
}
Параметры функции:
$module — Это название модуля или части сайта, в которой используется пагинация. Например, это может быть название скрипта или области сайта ('page', 'forums' и т.д.). В Cotonti это может быть строка, которая указывает на конкретный модуль или окружение.
$params — Параметры URL для пагинации. Это может быть как строка с параметрами, так и массив. Пример: page=1&cat=5.
$currentOffset — Смещение для текущей страницы. Это число указывает на позицию записи на текущей странице в списке всех записей. В Cotonti смещение часто используется в запросах к базе данных.
$entries — Общее количество записей, которое будет выводиться на страницах. Это число используется для вычисления количества страниц.
$perPage — Количество записей, которое отображается на одной странице.
$character — Символ для параметра пагинации в URL. Обычно это символ d, который используется в параметрах URL как page=d.
$hash — Хэш-часть URL, которая может быть добавлена к ссылке (например, #content).
$ajax — Флаг, который включает поддержку AJAX. Если установлен в true, ссылки будут работать с AJAX.
$target_div — ID целевого контейнера для вывода содержимого при AJAX-запросах.
$ajax_module — Модуль для AJAX, если он отличается от основного модуля.
$ajax_params — Дополнительные параметры для AJAX-запроса, если используется ajax_module.
Логика работы:
Проверка наличия функции cot_pagenav_custom: В начале функции проверяется, существует ли кастомная функция пагинации, определенная в каком-либо плагине или модуле с помощью cot_pagenav_custom. Если такая функция существует, она вызывается с переданными параметрами, и её результат возвращается.
Определение значений по умолчанию: Если количество записей на странице не задано, используется значение из конфигурации Cotonti (например, из Cot::$cfg['maxrowsperpage']). Для вычислений также используются стандартные переменные и параметры.
Определение текущей страницы и общего количества страниц:
В переменной $totalPages вычисляется общее количество страниц на основе общего числа записей ($entries) и количества записей на одну страницу ($perPage).
Переменная $currentPage хранит номер текущей страницы, который вычисляется из смещения и количества записей на страницу.
Подготовка ссылок для навигации: Создаются ссылки для первой, последней, предыдущей и следующей страницы. Эти ссылки зависят от текущего смещения и настроек.
Формирование списка страниц: Функция генерирует список с номерами страниц вокруг текущей страницы. Количество отображаемых ссылок можно настроить через переменную $each_side. Для удобства используются различные методы вычисления страницы (например, через простое смещение или с помощью easypagenav).
Поддержка AJAX: Если параметр $ajax равен true, ссылки на страницы будут содержать специальные атрибуты, которые позволяют загружать страницы без перезагрузки через AJAX-запросы. Также настраиваются параметры для целевого контейнера, куда будет загружено содержимое.
Возвращаемый результат: Функция возвращает массив с ключами:
first: ссылка на первую страницу.
prev: ссылка на предыдущую страницу.
main: список номеров страниц, включая текущую.
next: ссылка на следующую страницу.
last: ссылка на последнюю страницу.
current: текущий номер страницы.
firstlink, prevlink, nextlink, lastlink: ссылки на соответствующие страницы.
total: общее количество страниц.
onpage: количество записей на текущей странице.
perPage: количество записей на странице.
entries: общее количество записей.
Контекст Cotonti:
Использование параметров URL: В Cotonti для работы с URL используется функция cot_url(), которая генерирует правильные ссылки с параметрами, учитывая текущий модуль и переданные параметры.
Поддержка плагинов и кастомных функций: Возможность вызова кастомной функции пагинации через cot_pagenav_custom позволяет плагинам или модулям расширять стандартную логику пагинации в Cotonti.
Интеграция с AJAX: В Cotonti поддержка AJAX для динамической загрузки страниц без перезагрузки — это довольно часто используемый механизм. Функция cot_pagenav поддерживает это через добавление атрибутов в HTML-элементы и передачу параметров для AJAX-запросов.
Использование конфигурационных настроек: Конфигурационные параметры из Cot::$cfg используются для задания значений по умолчанию, например, для максимального количества записей на странице или для включения/выключения определённых настроек пагинации.
Заключение:
Функция cot_pagenav является универсальным инструментом для реализации пагинации в Cotonti. Она предоставляет гибкость настройки ссылок, поддерживает AJAX, учитывает параметры конфигурации и может быть расширена с помощью кастомных функций.
Давайте разберем выражение, использующее функцию cot_pagenav в контексте логики фреймворка Cotonti.
$pagenav = cot_pagenav(
'page', // (1) Site area (Область сайта)
$list_url_path + ['dc' => $dcurl], // (2) URL parameters (Параметры URL)
$d, // (3) Current page offset (pagination) (Смещение текущей страницы для пагинации)
$totallines, // (4) Total rows or total items (Общее количество строк или элементов)
$maxPageRowsPerPage // (5) Rows per page (items per page) (Количество строк на странице (элементов на странице))
);
1. Контекст:
Функция cot_pagenav используется для построения навигации по страницам (пагинации). Пагинация помогает разделить контент на несколько страниц, чтобы пользователи могли просматривать его по частям, а не загружать все данные сразу.
2. Разбор параметров:
1. 'page' — Site area:
Этот параметр указывает на участок сайта, для которого строится пагинация.
В Cotonti, каждый раздел или модуль имеет свой код. В данном случае 'page' указывает на модуль "страницы" (например, статичные страницы).
Это значение важно для формирования URL-адресов в пагинации.
2. $list_url_path + ['dc' => $dcurl] — URL параметры:
Здесь создается массив параметров для URL. В нем объединяются:
$list_url_path — это базовый путь URL для страницы.
['dc' => $dcurl] — добавляется параметр dc, значение которого присваивается из переменной $dcurl.
Этот параметр будет передаваться в URL, вероятно, для фильтрации или другого логического условия на странице.
В PHP-операторе + происходит объединение массивов, а это значит, что к базовому пути добавляется параметр dc.
Если list_url_path и ['dc' => $dcurl] имеют одинаковые ключи, то значение из второго массива перезапишет значение из первого.
3. $d — Current page offset:
Этот параметр указывает на текущий сдвиг для пагинации, то есть, с какого места на текущей странице начинать выводить элементы. Обычно это число выражается как смещение в количестве элементов, пропущенных до текущей страницы.
4. $totallines — Total rows or total items:
Это общее количество элементов или строк данных, которые нужно разбить на страницы. Значение используется для вычисления общего количества страниц.
5. $maxPageRowsPerPage — Rows per page:
Это максимальное количество строк на одной странице, т.е. количество элементов, которые должны быть выведены на каждой странице. Также это значение используется для расчета общего количества страниц.
3. Что делает функция:
Создает параметры URL: В результате передается массив URL параметров, где каждый параметр будет влиять на то, как будет построена пагинация для конкретной страницы.
Вычисляет общее количество страниц: Из входных данных (например, общее количество элементов $totallines и количество элементов на странице $maxPageRowsPerPage) функция вычисляет количество страниц.
Генерирует навигацию: Функция формирует кнопки для перехода на страницы, а также вычисляет ссылку для первой, предыдущей, следующей и последней страниц, основываясь на текущем смещении $d и других параметрах.
Возвращает массив с пагинацией: В результате выполнения cot_pagenav возвращает массив с готовыми ссылками и навигационными кнопками:
'prev', 'main', 'next', 'last' — ссылки на страницы.
'current' — текущая страница.
'total' — общее количество страниц.
И другие полезные данные.
4. Заключение:
В этом коде используется cot_pagenav для генерации пагинации в модуле "page" (страницы) сайта. Функция получает все необходимые параметры для построения ссылок на страницы, учитывая текущее смещение $d, общее количество элементов $totallines и количество строк на странице $maxPageRowsPerPage. Параметр dc в URL, вероятно, добавлен для фильтрации или дополнительной настройки отображения данных, что может быть полезно для работы с динамическими частями страницы.
Таким образом, результатом работы будет ассоциативный массив с элементами пагинации, которые можно будет вывести в шаблоне для навигации по страницам.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 22.01.2025 20:13
- Последнее обновление: 22.01.2025 20:24