Применение фильтрации к справочным полям
Glossary Item Box
Общие сведения
В bpm'online существует два способа применения фильтрации к справочным полям страниц редактирования:
- Использование бизнес-правила [FILTRATION].
- Явное указание фильтров в описании колонки в свойстве модели attributes.
Использование бизнес-правила [FILTRATION] целесообразно в случае, когда к полю необходимо применить простой фильтр — по определенному значению или атрибуту. Бизнес-правила подробно описаны в статье Бизнес-правила и их применение. Подробный кейс по использованию бизнес-правила [FILTRATION] приведен в статье "Пример применения правила FILTRATION".
В случае, когда необходимо применение произвольной фильтрации, сортировки и добавления дополнительных колонок в запрос при отображении выпадающего списка, следует использовать явное описание фильтров в свойстве модели представления attributes.
Настройка фильтров справочного поля в свойстве модели attributes
В свойство attributes модели представления необходимо добавить новый атрибут с именем колонки объекта, для которой устанавливаются фильтры.
Для этой нужно колонки объявить свойство lookupListConfig, которое представляет собой конфигурационный объект, содержащий в себе такие свойства (опционально):
-
сolumns — массив имен колонок, которые будут добавлены к запросу дополнительно к
Id и первичной для отображения колонке. Эти колонки будут также дополнительно отображаться в выпадающем списке;
- orders — массив конфигурационных объектов, которые определяют сортировку данных при отображении;
- filter — метод, возвращающий объект класса Terrasoft.BaseFilter или его наследника, который, в свою очередь, будет применен к запросу;
- или filters — массив фильтров (методов, возвращающих коллекции класса Terrasoft.FilterGroup).
Фильтры в коллекцию добавляются с помощью метода add(), который имеет следующие параметры:
Название | Тип данных | Описание |
---|---|---|
key | String |
Ключ. |
item | Mixed | Элемент. |
index | Number | Индекс для вставки. Если не указан, то не учитывается. |
В качестве параметра item выступает объект класса Terrasoft.BaseFilter или его наследника. Методы создания фильтров с описаниями приведены в статье "Работа с фильтрами EntitySchemaQuery".
ВАЖНО По умолчанию фильтры в коллекции объединяются с использованием логической операции AND. Если необходимо применить операцию OR, ее нужно указать явно в свойстве logicalOperation объекта Terrasoft.FilterGroup. |
Описание кейса
При добавлении значения в поле [Ответственный] страницы редактирования контрагента отображать только те значения из справочника контактов, для которых выполняются следующие условия:
- с данным контактом есть связанный пользователь системы;
- данный пользователь системы активен.
Алгоритм реализации кейса
1. Создать замещающую страницу редактирования контрагента
Необходимо создать замещающий клиентский модуль, в котором в качестве родительского объекта указать схему AccountPageV2 (рис. 1). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".
Рис. 1. — Свойства замещающей страницы редактирования
2. В свойство attributes модели представления добавить атрибут с фильтрацией
В конфигурационном объекте атрибута [Owner] необходимо указать тип данных колонки (свойство dataValueType) — Terrasoft.DataValueType.LOOKUP и описать конфигурационный объект поля-справочника lookupListConfig. В lookupListConfig добавить свойство filters, представляющее собой массив. В массив добавить функцию, возвращающую коллекцию фильтров.
Исходный код замещающей схемы страницы:
define("AccountPageV2", [], function() { return { // Название схемы объекта страницы редактирования. "entitySchemaName": "Account", // Перечень атрибутов схемы. "attributes": { // Наименование колонки модели представления. "Owner": { // Тип данных данного атрибута. "dataValueType": Terrasoft.DataValueType.LOOKUP, // Конфигурационный объект атрибута типа LOOKUP. "lookupListConfig": { // Массив фильтров, применяемых к запросу для формирования данных поля-справочника. "filters": [ function() { var filterGroup = Ext.create("Terrasoft.FilterGroup"); // Добавление фильтра "IsUser" в результирующую коллекцию фильтров. // Фильтр предусматривает выбор всех записей из корневой схемы // Contact, к которой присоединена колонка Id из схемы SysAdminUnit, // для которых Id не равен null. filterGroup.add("IsUser", Terrasoft.createColumnIsNotNullFilter("[SysAdminUnit:Contact].Id")); // Добавление фильтра "IsActive" в результирующую коллекцию фильтров. // Фильтр предусматривает выбор всех записей из корневой схемы // Contact, к которой присоединена колонка Active из схемы SysAdminUnit, // для которых Active=true. filterGroup.add("IsActive", Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.EQUAL, "[SysAdminUnit:Contact].Active", true)); return filterGroup; } ] } } } }; });
После сохранения схемы и обновления веб-страницы системы с очисткой кэша на странице редактирования контрагента при добавлении значения в поле [Ответственный] страницы редактирования контрагента будут отображаться только те значения из справочника контактов, которые соответствуют условиям кейса (рис. 2, рис. 3). Т.е.:
- с данным контактом есть связанный пользователь системы;
- данный пользователь системы активен.
Рис. 2. — Профиль контрагента с ответственным
Рис. 3. — Ответственный отсутствует в отфильтрованном справочнике контактов