Работа с гридами сотрудника

Подобно фильтрам табличное отображение так же зависит от настроек пользователя и является индивидуальным.

Работа с гридами начинается с создания объекта настроек Bitrix\Main\Grid\Options (ранее \CGridOptions), который требует только идентификатор грида с которым будет осуществляться работа.

use \Bitrix\Main\Grid\Options;

$gridOptions = new Options('MY_UNIQUE_GRID_ID');

Получив в объект настроек грида, можно начать работу и получить другие полезные данные.

API

В данном разделе собраны полезные методы по работе с гридом. Подразумевается что объект грида уже получен и находится в переменной $gridOptions.

Мы сознательно избегаем методов, манипулирующих пользовательским отображением (set*, save() и т.п.), подразумевая что ситуаций в которых это явно необходимо немного и в таком случае будет привлекаться опытный разработчик.

Получение отображаемых колонок

Для организации быстродействия, зачастую бывает полезно получать не всю информацию для отображения таблицы, а только ту, которую пользователь реально запросил.

Случай 1: на одном проекте у нас была большая таблица со списком заявок, помимо полей самой заявки дополнительно фигурировали 2 столбца: Время реакции (вычисляемое поле между двумя значениями заявки) и Связанные заявки (перечень ссылок на заявки, доступные текущему пользователю). На вывод и вычисление этих столбцов требовалось огромное количество времени (до 60% от времени создания самого грида), однако вывод самих столбцов пользовался популярностью у малой группы сотрудников (меньше 1%). Просчет таких столбцов только для сотрудников, которым он был необходим, дал значительный прирост производительности для остальных

Случай 2: В одном из проектов клиент запросил экспорта табличного представления идентичному табличному. Т.е. последовательность и наличие столбцов должна была быть такая же, как пользователь видит на экране.

Такая возможность обеспечивается нестатическим методом getUsedColumns( $defaultColumns = [] ) который вернет набор используемых столбцов (если у пользователя есть личный пресет), либо набор переданный аргументом в метод.

/**
 * @var array
 */
$defaulColumns = $gridOptions->getUsedColumns([
	'OUR',
	'DEFAULT',
	'COLUMN',
	'LIST',
]);

Аналогичным методом является GetVisibleColumns(), однако в случае если у пользователя нет своего пресета метод вернет пустой массив. Преимущество данного метода в том, что можно явно определить что вернуть.

Просчитать сортировку

Несмотря на то, что мы будем обсуждать метод GetSorting($arParams=array()) (дословно - Получить сортировку), правильнее назвать это методом просчета сортировки, так как для получения результата будут учтены входящие параметры, параметры запроса, значения сессии и настройки пользователя.

Структура ответа метода совпадает со значением arParams (в коде defaultParams):

$defaultParams = [
	'sort' => []
	'vars' => [
		"by"    => "by",
		"order" => "order"
	]
];

Сама сортировка состоит из 2 групп: Полей (sort) и Переменных (vars). Поля представляют собой ассоциативный массив где ключом выступает идентификатор поля, а значением одно из ASC / DESC варианта. Переменные - состоят из 2 заранее определенных значений - by - название переменной в которой содержится код поля и order - название переменной в которой содержится значение сортировки.

Почему именно такая структура, а не простой набор полей? Дело в том, что на странице параметры by и order могут быть зарезервированы под другие бизнес-значения, да и самих гридов на странице может быть несколько. В случае если у гридов не разделять указанные параметры, то может сложиться ситуация, когда второй грид будет отсортирован по несуществующему полю и это может привести к фатальной ошибке (если такая ситуация не будет предусмотрена вами).

Пример: мы хотим получить сортировку текущего пользователя для грида, но если у пользователя нет своей сортировки, то мы хотим получить сортировку по имени (возрастанию):


$sort = $gridOptions->GetSorting([
	'sort' => [
		'NAME' => 'ASC'
	]
	'vars' => [
		"by"    => "by",
		"order" => "order"
	]
]);

Размер постраничной навигации

Еще одной необходимой возможностью является определение размера отображаемой страницы, что обеспечивается методом GetNavParams($arParams=array()).

По-умолчанию, если размер постраничной навигации не задан используется значение по-умолчанию - 20 элементов на страницу. Предположим у нас есть табличное представление где нам необходимо по-умолчанию отображать 5 значений, но пользователь может выбрать любое доступное из списка (см. параметры грида).


$navParams = $gridOptions->GetNavParams([
	'nPageSize' => 5
]);

/*
$navParams = [
	'nPageSize' => 5
];
 */

Полезная информация

Options в документации