В старом ядре навигация была жестко привязана к объекту результата выборки (CDBResult).
В D7 навигация — это отдельный, независимый объект, который «знает» о текущей странице и размере выборки.
Он используется в связке с ORM getList и компонентом main.ui.grid.
Шаг 1: Инициализация объекта навигации
Обычно объект навигации создается в начале работы компонента или контроллера.
use Bitrix\Main\UI\PageNavigation;
$navId = "page"; // ID параметра в URL (например, ?page=2)
$nav = new PageNavigation($navId);
$nav->allowAllRecords(true) // Разрешить показывать "Все" записи (?page=all)
->setPageSize(20) // Количество на странице по умолчанию
->initFromUri(); // Прочитать текущую страницу и размер из URLШаг 2: Использование в ORM-запросе
Объект $nav предоставляет методы getLimit() и getOffset(), которые идеально подходят для getList.
use Bitrix\Iblock\ElementTable;
$query = ElementTable::query()
->setSelect(['ID', 'NAME'])
->setFilter(['IBLOCK_ID' => 5])
->setOrder(['ID' => 'DESC']);
// 1. Получаем общее количество записей (без учета пагинации)
// Это нужно для корректного построения ссылок навигации
// Важно сделать это ДО применения лимитов, либо использовать countTotal
$totalCount = $query->queryCountTotal();
$nav->setRecordCount($totalCount); // Передаем общее кол-во в навигатор
// 2. Применяем параметры навигации к запросу
$query->setOffset($nav->getOffset());
$query->setLimit($nav->getLimit());
$result = $query->exec();
// 3. Получаем данные
while ($row = $result->fetch()) {
// ...
}Шаг 3: Вывод навигации в шаблоне (UI)
Есть два способа вывести навигацию.
Способ А: Через компонент main.pagenavigation (Универсально)
Этот компонент рисует классическую цепочку страниц (1, 2, 3… След).
<?
$APPLICATION->IncludeComponent(
"bitrix:main.pagenavigation",
"",
array(
"NAV_OBJECT" => $nav, // Наш объект PageNavigation
"SEF_MODE" => "N",
),
false
);
?>Способ Б: Через компонент main.ui.grid (Если вы используете грид)
Если вы используете системный грид, просто передайте объект в параметры грида.
$APPLICATION->IncludeComponent(
'bitrix:main.ui.grid',
'',
[
'GRID_ID' => 'my_grid',
'NAV_OBJECT' => $nav, // Грид сам отрисует пагинацию в футере таблицы
'TOTAL_ROWS_COUNT' => $totalCount,
// ... другие параметры
]
);Вывод:
Класс PageNavigation делает логику разбиения на страницы прозрачной. Вы четко разделяете: получение параметров из URL, запрос к БД и отрисовку HTML. Это стандарт разработки для всех современных интерфейсов в Битрикс.
PageNavigation, постраничная навигация D7, пагинация Битрикс, initFromUri, getLimit, getOffset, main.ui.grid пагинация.