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

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

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

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

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Вывод списка элементов инфоблока с постраничной навигацией через стандартный механизм 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
    ];
}

Usage:

// В component.php
$result = getElementsListWithPagination(
    5, 
    ['SECTION_ID' => 10], 
    ['DATE_CREATE' => 'DESC'], 
    12
);

foreach ($result['items'] as $item) {
    echo $item['NAME'];
}

// Вывод навигации в шаблоне
echo $result['nav'];

Notes:

⚠️ CDBResult->NavStart() должен вызываться до CIBlockElement::GetList(). Для AJAX-пагинации используйте параметр iNumPage из GET-запроса. Количество элементов на странице влияет на производительность — не ставьте больше 50 без кеширования.