Список элементов инфоблока с постраничной навигацией
Каноничная реализация списка элементов через CIBlockElement::GetList с постраничкой через CDBResult->NavString и настройкой количества на странице.
Как использовать
- Подключите модуль iblock, создайте CDBResult и вызовите NavStart($pageSize) до GetList.
- В GetList передайте в третьем аргументе false, в четвёртом — массив с nPageSize, iNumPage (из NavPageNomer), bShowAll => false.
- Элементы забирайте через GetNextElement(), навигационную строку — через GetPageNavStringEx; выводите $result['nav'] в шаблоне.
В 1С-Битрикс список элементов инфоблока с постраничной навигацией делают через CIBlockElement::GetList и навигационный объект CDBResult. Если не передать параметры пагинации в GetList или вызвать NavStart() после запроса, навигация не строится или отображается неверная страница. Проблема: в компонентах каталога, новостей, статей нужна корректная постраничка — номера страниц, «дальше/назад», общее количество. Симптомы: все элементы на одной странице, пустая строка навигации, неверный номер страницы при переходе по ссылке. Ниже — функция с фильтром, сортировкой, размером страницы и возвратом строки навигации; порядок вызовов и проверка.
Решение
Вывод списка элементов инфоблока с постраничной навигацией через стандартный механизм Bitrix. Используйте в компонентах каталога, новостей, статей.
use Bitrix\Main\Loader;
/**
* Получить список элементов с постраничкой
* @param int $iblockId ID инфоблока
* @param array $filter Массив фильтрации
* @param array $sort Массив сортировки ['FIELD' => 'SORT', 'ORDER' => 'ASC']
* @param int $pageSize Количество элементов на странице
* @return array ['items' => [], 'nav' => string, 'navObject' => CDBResult]
*/
function getElementsListWithPagination($iblockId, $filter = [], $sort = [], $pageSize = 20) {
if (!Loader::includeModule('iblock')) {
return ['items' => [], 'nav' => '', 'navObject' => null];
}
$defaultFilter = [
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y'
];
$filter = array_merge($defaultFilter, $filter);
$defaultSort = ['SORT' => 'ASC', 'ID' => 'DESC'];
$sort = !empty($sort) ? $sort : $defaultSort;
$nav = new \CDBResult();
$nav->NavStart($pageSize);
$res = CIBlockElement::GetList(
$sort,
$filter,
false,
[
'nPageSize' => $pageSize,
'iNumPage' => $nav->NavPageNomer,
'bShowAll' => false
],
['ID', 'NAME', 'CODE', 'PREVIEW_TEXT', 'PREVIEW_PICTURE', 'DATE_CREATE', 'SORT']
);
$items = [];
while ($item = $res->GetNextElement()) {
$fields = $item->GetFields();
$items[] = $fields;
}
$navString = $res->GetPageNavStringEx(
$nav,
'',
'standard',
true
);
return [
'items' => $items,
'nav' => $navString,
'navObject' => $nav,
'totalCount' => $res->NavRecordCount
];
}
Пример использования:
// В component.php
$result = getElementsListWithPagination(
5,
['SECTION_ID' => 10],
['DATE_CREATE' => 'DESC'],
12
);
foreach ($result['items'] as $item) {
echo $item['NAME'];
}
// Вывод навигации в шаблоне
echo $result['nav'];
CDBResult->NavStart() должен вызываться до CIBlockElement::GetList(). Для AJAX-пагинации передавайте текущую страницу в iNumPage (например из GET). Количество на странице лучше не ставить больше 50 без кеширования.
Проверка
-
Количество элементов на странице — передайте
$pageSize = 5, откройте страницу списка. Должно быть не больше 5 элементов; ниже — строка навигации (номера страниц или «дальше»). -
Номер страницы из GET — для постранички по URL (например
?PAGEN_1=2) инициализируйте навигацию из запроса. В Bitrix это обычно делается через$nav->NavStart($pageSize)после того, как CDBResult считает параметры из$_REQUEST. Проверьте, что при переходе по ссылке «2» отображаются следующие элементы. -
Общее количество записей — в результате есть
totalCount($res->NavRecordCount). Выведите его рядом с навигацией (например «Всего: 47») и сверьте с реальным числом элементов по фильтру в админке. -
Диагностика: пустая навигация — убедитесь, что в GetList передан четвёртый аргумент с
nPageSizeиiNumPage; что$navпередаётся вGetPageNavStringExи что элементов больше, чемpageSize(иначе навигация может не выводиться).
Типичные ошибки
- NavStart после GetList — навигационный объект нужно создавать и вызывать
NavStart()до запроса GetList, иначе текущая страница и размер не подставятся в запрос. - Не переданы параметры пагинации в GetList — четвёртый аргумент GetList должен содержать массив с
nPageSize,iNumPage(из$nav->NavPageNomer),bShowAll=> false. Без этого выборка не ограничивается по странице. - Слишком большой pageSize — при сотнях элементов без кеша страница будет тяжлой. Ограничьте 20–50 или включите кеширование компонента/результата.
- iNumPage для AJAX — при пагинации через AJAX передавайте номер страницы из запроса в объект навигации (или формируйте массив для GetList вручную с нужным
iNumPage).
Где применять
- Prod / dev: каталоги товаров, списки новостей и статей, любые списки элементов инфоблока с постраничным выводом. В шаблоне компонента выводите
$result['nav']для стандартной навигации. - Компоненты: вызывайте функцию из component.php или оборачивайте в свой компонент; передавайте фильтр и сортировку из параметров компонента.
Связанные сниппеты: Получение элемента по коду с свойствами, Безопасное обновление свойства элемента, Контент-коллекции: фильтр и сортировка (для сравнения подхода в Astro).