Как работает bitrix:main.ui.grid

Гриды работают на 80% через сервер, т.е. вся сортировка, фильтрация, отображение колонок происходит через запросы к серверу.

Основная идея:
есть компонент (component.php) со своей логикой выборки и обновления данных.
есть шаблон, где подключены компоненты bitrix:main.ui.filter и bitrix:main.ui.grid - они только отображают полученные данные и реализуют интерфейс для взаимодействия с сервером (отправка запросов происходит через js шаблона либо штатными методами грида)

итак, вот примеры вызова наших компонентов в шаблоне (templates.php):
<? $APPLICATION->IncludeComponent('bitrix:main.ui.filter', '', [
        'FILTER_ID' => $arResult['GRID']['ID'].'_filter',
        'GRID_ID' => $arResult['GRID']['ID'],
        'FILTER' => $arResult['GRID']['FILTER'],
        'ENABLE_LIVE_SEARCH' => true,
        'ENABLE_LABEL' => true
]); ?>
<? $APPLICATION->IncludeComponent(
        'bitrix:main.ui.grid',
        '',
        [
            'GRID_ID' => $arResult['GRID']['ID'],
            'COLUMNS' => $arResult['GRID']['COLUMNS'],
            'ROWS' => $arResult['GRID']['DATA'],
            'SHOW_ROW_CHECKBOXES' => true,
            'NAV_OBJECT' => $arResult['GRID']['NAV'],
            'AJAX_MODE' => 'Y',
            'AJAX_ID' => \CAjax::getComponentID('bitrix:main.ui.grid', '.default', ''),
            'PAGE_SIZES' => [
                ['NAME' => "5", 'VALUE' => '5'],
                ['NAME' => '10', 'VALUE' => '10'],
                ['NAME' => '20', 'VALUE' => '20'],
                ['NAME' => '50', 'VALUE' => '50'],
                ['NAME' => '100', 'VALUE' => '100']
            ],
            'AJAX_OPTION_JUMP'          => 'N',
            'SHOW_CHECK_ALL_CHECKBOXES' => true,
            'SHOW_ROW_ACTIONS_MENU'     => true,
            'SHOW_GRID_SETTINGS_MENU'   => true,
            'SHOW_NAVIGATION_PANEL'     => true,
            'SHOW_PAGINATION'           => true,
            'SHOW_SELECTED_COUNTER'     => true,
            'SHOW_TOTAL_COUNTER'        => true,
            'SHOW_PAGESIZE'             => true,
            'SHOW_ACTION_PANEL'         => true,
            'ACTION_PANEL'              => $arResult['GRID']['ACTION_PANEL'],
            'ALLOW_COLUMNS_SORT'        => true,
            'ALLOW_COLUMNS_RESIZE'      => true,
            'ALLOW_HORIZONTAL_SCROLL'   => true,
            'ALLOW_SORT'                => true,
            'ALLOW_PIN_HEADER'          => true,
            'AJAX_OPTION_HISTORY'       => 'N',
            "SORT" => $arResult['GRID']["SORT"],
            "SORT_VARS" => $arResult['GRID']["SORT_VARS"],
            "FOOTER" => array(array("title" => "Всего", "value" => $arResult['GRID']["ROWS_COUNT"])),
            "FILTER" => $arResult['GRID']["FILTER"],
        ]
); ?>

Можно заметить, что вся информация по гридам разнесена в свойстве массива $arResult['GRID'] - это позволит интегрировать гриды в дефолтные компоненты без ущерба другим шаблонам.

Чуть позже найду время расписать все параметры этих компонентов (ведь их тоже нигде не найти в открытом виде)
0
kunash
11.08.2020 08:58:34
Что передавать в NAV_OBJECT?

Я передал вот такое:

       $grid_options = new Bitrix\Main\Grid\Options('ndt_checkups');
       $sort = $grid_options->GetSorting(['sort' => ['NAME' => 'DESC'], 'vars' => ['by' => 'by', 'order' => 'order']]);

       $nav_params = $grid_options->GetNavParams();

       $nav = new Bitrix\Main\UI\PageNavigation('ndt_checkups');
       $nav->allowAllRecords(true)
           ->setPageSize($nav_params['nPageSize'])
           ->initFromUri();
   
Навигация не считает страницы.
0
01.09.2020 18:29:04
Работает такой код:
$this->arResult['GRID']['NAV'] = $this->arResult['GRID']['OPTIONS']->GetNavParams(array("nPageSize" => $this->arParams["ORDERS_ON_PAGE"]));
       if ("LIMITS"){
           $ob_nav = new \Bitrix\Main\UI\PageNavigation($this->arResult['GRID']['ID']);
           $ob_nav->allowAllRecords(true);
           $ob_nav->setPageSize($this->arResult['GRID']['NAV']['nPageSize']);
           $ob_nav->initFromUri();
           $this->arResult['GRID']['NAV'] = $ob_nav;
       }