Дата последнего изменения: 07.10.2025
Постраничная навигация позволяет не загружать все записи сразу, а показывать их частями — по 10, 15 или 50 на странице.
Чтобы добавить навигацию к записям, выполните три действия.
Создайте объект постраничной навигации и укажите его поведение с помощью методов allowAllRecords
, setPageSizes
, setRecordCount
.
$pagination = new \Bitrix\Main\UI\PageNavigation('nav-name'); /** * Конфигурируем */ $pagination // разрешаем показ всех записей ->allowAllRecords(true) // указываем, какие варианты выбора страниц есть ->setPageSizes([ 5, 10, 20, 50, 100, ]) // указываем общее число записей ->setRecordCount($totalCount) ;
nav-name
, должен быть уникальным на странице. Он используется в URL: ?nav-name=page-3
.Классы навигации
\Bitrix\Main\UI\PageNavigation
— работает с прямой навигацией,\Bitrix\Main\UI\ReversePageNavigation
— отвечает за обратную навигацию,\Bitrix\Main\UI\AdminPageNavigation
— создает навигацию в административном разделе.Объект прочитает из адреса текущую страницу и количество записей с помощью метода initFromUri()
.
$pagination->initFromUri();
Поддерживаются два формата:
/items/?nav-name=page-3-size-20
,/items/nav-name/page-3/size-20/
.В запросе передайте данные с помощью методов:
getLimit()
— максимальное количество записей,getOffset()
— позицию записи, с которой начинать выборку.$records = \Bitrix\Main\UserTable::query() ->setLimit($pagination->getLimit()) ->setOffset($pagination->getOffset()) ->fetchCollection();
Если нужны фильтры, добавьте их в запрос.
$records = \Bitrix\Main\UserTable::query() ->setFilter(['>ID' => 10]) ->setLimit($pagination->getLimit()) ->setOffset($pagination->getOffset()) ->fetchCollection();
Чтобы получить общее число записей, выполните отдельный запрос до основного:
$totalCount = \Bitrix\Main\UserTable::query() ->setFilter(['>ID' => 10]) ->count(); $pagination->setRecordCount($totalCount);
Метод count()
выполняет SELECT COUNT(*)
и возвращает число. ORM не выполняет подсчет автоматически, чтобы избежать лишних запросов к базе.
На таблицах с сотнями тысяч или миллионами записей запрос SELECT COUNT(*)
выполняется долго и создает нагрузку на базу. Если общее число не нужно, используйте навигацию без COUNT.
Чтобы на странице отобразить ссылки, передайте объект навигации в компонент.
Подключите компонент main.pagenavigation
и передайте объект навигации через NAV_OBJECT
. Компонент выведет ссылки.
$APPLICATION->IncludeComponent('bitrix:main.pagenavigation', '', [ 'NAV_OBJECT' => $pagination, 'SEF_MODE' => 'Y', // включить ЧПУ ]);
В компоненте доступно четыре системных шаблона:
.default
— обычный вид,admin
— для административной части,grid
— компактный, для таблиц,modern
— современный стиль.Чтобы добавить навигацию в грид, передайте объект навигации в компонент main.ui.grid
. Он выведет таблицу с колонками HEADERS
, строками ROWS
и постраничной навигацией NAV_OBJECT
. Параметр NAV_PARAMS
подключит ЧПУ для ссылок навигации.
$APPLICATION->IncludeComponent('bitrix:main.ui.grid', '', [ 'GRID_ID' => 'my_grid', 'HEADERS' => [...], 'ROWS' => $rows, 'NAV_OBJECT' => $pagination, 'NAV_PARAMS' => ['SEF_MODE' => 'Y'], ]);
Чтобы создать собственный шаблон навигации, используйте методы объекта:
getRecordCount()
— возвращает число записей,getPageCount()
— возвращает число страниц,getCurrentPage()
— возвращает номер текущей страницы,getPageSize()
— возвращает количество записей на странице,allRecordsShown()
— возвращает true
, если показаны все записи на одной странице,getPageSizes()
— возвращает разрешенные размеры страниц [5, 10, 20, ...]
,allRecordsAllowed()
— определяет, можно ли показать все записи.Ссылки на нужные страницы можно сгенерировать вручную с помощью метода addParams()
.
/** * Получаем ссылку на текущую страницу с параметрами навигации * Оба формата поддерживаются PageNavigation::initFromUri() */ $uri = new \Bitrix\Main\Web\Uri('https://example.ru/items/'); $pagination = new \Bitrix\Main\UI\PageNavigation('my-items'); // ЧПУ-формат $isHumanUrl = true; echo (string)$pagination->addParams(clone $uri, $isHumanUrl, 3); // https://example.ru/items/my-items/page-3/ // GET-формат $isHumanUrl = false; echo (string)$pagination->addParams(clone $uri, $isHumanUrl, 3); // https://example.ru/items/?my-items=page-3
Если записей много, делать COUNT
неэффективно. Используйте навигацию без точного подсчета.
позиция выборки + количество полученных записей
.
$pagination = new \Bitrix\Main\UI\PageNavigation('users'); $pagination ->allowAllRecords(false) ->setPageSize(20) ->initFromUri() ; $users = []; $queryResult = \Bitrix\Main\UserTable::query() ->setOffset($pagination->getOffset()) ->setLimit( $pagination->getLimit() + 1 ) ->exec() ; foreach ($queryResult as $i => $user) { if ($i === $pagination->getLimit()) { break; } $users[] = $user; } $pagination->setRecordCount( $pagination->getOffset() + $queryResult->getSelectedRowsCount() );
$APPLICATION->IncludeComponent('bitrix:main.pagenavigation', '', [ 'NAV_OBJECT' => $pagination, 'SHOW_COUNT' => 'N', // не показывать общее количество 'SEF_MODE' => 'Y', ]);
COUNT
не включайте allowAllRecords(true)
. Это позволит указать в URL полную выборку. В результате после вызова initFromUri()
максимальное значение и начальная позиция не установятся.