Применение фильтрации к справочным полям
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. Создать замещающую страницу редактирования контрагента
Создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите схему [Страница редактирования контрагента] ([Account edit page], AccountPageV2 ) (рис. 1). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".
Рис. 1. — Свойства замещающей страницы редактирования
2. В свойство attributes модели представления добавить атрибут с фильтрацией
В конфигурационном объекте атрибута [Owner] укажите тип данных колонки — 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; } ] } } } }; });
После сохранения схемы и обновления страницы приложения на странице редактирования контрагента при добавлении значения в поле [Ответственный] ([Owner]) страницы редактирования контрагента будут отображаться только те значения из справочника контактов, которые соответствуют условиям примера (рис. 2, рис. 3). Т.е.:
- с данным контактом есть связанный пользователь системы;
- данный пользователь системы активен.
Рис. 2. — Профиль контрагента с ответственным
Рис. 3. — Ответственный отсутствует в отфильтрованном справочнике контактов