PHP
#bitrix#iblock#php#pagination#navigation#ciBlockElement

Список элементов инфоблока с постраничной навигацией

Каноничная реализация списка элементов через CIBlockElement::GetList с постраничкой через CDBResult->NavString и настройкой количества на странице.

Как использовать

  1. Подключите модуль iblock, создайте CDBResult и вызовите NavStart($pageSize) до GetList.
  2. В GetList передайте в третьем аргументе false, в четвёртом — массив с nPageSize, iNumPage (из NavPageNomer), bShowAll => false.
  3. Элементы забирайте через 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 без кеширования.

Проверка

  1. Количество элементов на странице — передайте $pageSize = 5, откройте страницу списка. Должно быть не больше 5 элементов; ниже — строка навигации (номера страниц или «дальше»).

  2. Номер страницы из GET — для постранички по URL (например ?PAGEN_1=2) инициализируйте навигацию из запроса. В Bitrix это обычно делается через $nav->NavStart($pageSize) после того, как CDBResult считает параметры из $_REQUEST. Проверьте, что при переходе по ссылке «2» отображаются следующие элементы.

  3. Общее количество записей — в результате есть totalCount ($res->NavRecordCount). Выведите его рядом с навигацией (например «Всего: 47») и сверьте с реальным числом элементов по фильтру в админке.

  4. Диагностика: пустая навигация — убедитесь, что в 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).