Вывод постраничной навигации в битриксе для массива

Постраничная навигация в битриксе формируется и выводится с помощью компонента bitrix:system.pagenavigation. Этот компонент разработан для использования совместно с другими компонентами, такими как раздел каталога или список новостей, и тесно связан с ними. Поэтому попытки применения компонента постраничной навигации отдельно от других компонентов могут быть связанны с некоторыми трудностями, особенно в условиях отсутствия хорошей документации по этой теме.

Говоря другими словами, мы не можем просто так взять и вывести постраничную навигацию для некоторого произвольного списка который хранится, допустим, в массиве. Сначала нам придется тщательно порыться в документации и коде компонента.

Когда это может пригодиться?

Допустим нам нужно вывести некоторый список с разбивкой на страницы. Обычно данные для этого списка хранятся в инфоблоке и, в этом случае, мы просто используем компонент "Список новостей", который уже содержит компонент постраничной навигации и связан с ним.

Но что делать, если источником данных для этого списка является не инфоблок, а допустим, файл. В этом случае штатные битриксовые компоненты применить не получится.

Задача

В общем случае задача сводится к следующему. У нас есть массив данных. Элементы этого массива выводятся списком с разбивкой на страницы. Необходимо, используя компонент bitrix:system.pagenavigation, вывести панель постраничной навигации (так называемый пагинатор).

Решение

На самом деле компонент bitrix:system.pagenavigation очень прост и решение также очень простое. Для вывода пагинатора достаточно подключить компонент постраничной навигации и передать ему всего лишь один параметр NAV_RESULT.

$APPLICATION->IncludeComponent('bitrix:system.pagenavigation', '', array(
    'NAV_RESULT' => $navResult,
));

$navResult должен быть объектом класса унаследованного от CAllDBResult, например CDBResult. В свойствах $navResult компоненту передаются параметры, необходимые для формирования пагинатора. Вот список некоторых из них:

$navResult = new CDBResult();
// Общее количество страниц
$navResult->NavPageCount = 10;
// Номер текущей страницы
$navResult->NavPageNomer = 2;
// Номер пагинатора. Используется для формирования ссылок на страницы
$navResult->NavNum = 1;
// Количество записей выводимых на одной странице
$navResult->NavPageSize = 10;
// Общее количество записей
$navResult->NavRecordCount = 98;

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

// Задаем количество элементов на странице
$countOnPage = 10;

// Исходный массив данных для списка
$elements = array(...);

// Получаем номер текущей страницы из реквеста
$page = intval($_GET['PAGEN_1']);

// Отбираем элементы текущей страницы
$elementsPage = array_slice($elements, $page * $countOnPage, $countOnPage);

// Вывод страницы
echo renderElementsPage($elementsPage);

// Подготовка параметров для пагинатора
$navResult = new CDBResult();
$navResult->NavPageCount = ceil(count($elements) / $countOnPage);
$navResult->NavPageNomer = $page;
$navResult->NavNum = 1;
$navResult->NavPageSize = $countOnPage;
$navResult->NavRecordCount = count($elements);

// Вывод пагинатора
$APPLICATION->IncludeComponent('bitrix:system.pagenavigation', '', array(
    'NAV_RESULT' => $navResult,
));