Функция 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, вероятно, добавлен для фильтрации или дополнительной настройки отображения данных, что может быть полезно для работы с динамическими частями страницы.

Таким образом, результатом работы будет ассоциативный массив с элементами пагинации, которые можно будет вывести в шаблоне для навигации по страницам.

 

 

 

13 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 22.01.2025 20:13
  • Последнее обновление: 22.01.2025 20:24