Заметки
Пагинация main.ui.grid есть, а строки не переключаются
В main.ui.grid появились номера страниц и выбор размера, но содержимое таблицы осталось прежним. Так бывает, когда объект навигации передан компоненту, а данные для ROWS каждый раз выбираются целиком.
У навигации две стороны: она рисует ссылки и сообщает, какую часть данных нужно выбрать. Сам грид запрос к базе за вас не меняет.
Связать навигацию с запросом
Пример для закрытой страницы администратора коробки с подключённым прологом. Он выбирает только ID активных пользователей и показывает, где должны применяться размер страницы и смещение.
use Bitrix\Main\Grid\Options;
use Bitrix\Main\UI\PageNavigation;
use Bitrix\Main\UserTable;
if (!$USER->IsAdmin()) {
throw new RuntimeException('Страница доступна администратору');
}
$s_grid_id = 'active_users_demo';
$ar_filter = ['=ACTIVE' => 'Y'];
$ob_options = new Options($s_grid_id);
$ar_nav = $ob_options->getNavParams();
$ob_nav = new PageNavigation($s_grid_id);
$ob_nav->setPageSize((int) $ar_nav['nPageSize'])->initFromUri();
$ob_nav->setRecordCount(UserTable::getCount($ar_filter));
$ob_result = UserTable::getList([
'select' => ['ID'],
'filter' => $ar_filter,
'order' => ['ID' => 'ASC'],
'limit' => $ob_nav->getLimit(),
'offset' => $ob_nav->getOffset(),
]);
$ar_rows = [];
while ($ar_user = $ob_result->fetch()) {
$ar_rows[] = ['id' => $ar_user['ID'], 'data' => ['ID' => $ar_user['ID']]];
}
$APPLICATION->IncludeComponent('bitrix:main.ui.grid', '', [
'GRID_ID' => $s_grid_id,
'COLUMNS' => [['id' => 'ID', 'name' => 'ID сотрудника', 'default' => true]],
'ROWS' => $ar_rows,
'NAV_OBJECT' => $ob_nav,
'SHOW_PAGINATION' => true,
'SHOW_PAGESIZE' => true,
'PAGE_SIZES' => [['NAME' => '20', 'VALUE' => '20'], ['NAME' => '50', 'VALUE' => '50']],
]); В getCount и getList должен быть одинаковый фильтр. Иначе грид покажет страницы для одного набора, а строки — для другого. Сортировка по ID здесь делает порядок однозначным.
Если данные приходят по REST, PageNavigation не отменяет пагинацию удалённого метода. Нарезка уже полученных 50 строк не даёт доступа к остальным записям. Для такого грида нужно отдельно связать запрошенную страницу интерфейса с обходом страниц API.
Документация: main.ui.grid; PageNavigation.