← К заметкам

Заметки

Пагинация 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.