По умолчанию ExtJS не поддерживает применение оператора OR. Для реализации данного механизма были созданы или переопределены ниже описанные классы и методы.
Основным классов отвечающим за выполнение логической фильтрации является IServ.mixin.Logic. Содержит два метода: filters и union.
- filters(any[], any[]): any — основной метод для выполнения локальной логической фильтрации. Принимает первым параметром массив записей, вторым — параметры фильтрации
new IServ.mixin.Logic([...],[ new Ext.util.Filter({...}), new IServ.util.Logic({name: 'or'}), new Ext.util.Filter({...}) ]);
- union(any[]):any[] — вспомогательный метод для объединения результатов выполнения операция. Например чтобы объединить результаты двух фильтров
Добавлены новые классы:
- IServ.mixin.Logic — миксин класс для выполнения логических операции.
-
IServ.util.Logic — специальный объект для инициализации логических операторов and и or
new IServ.util.Logic({ name: 'and' }) или new IServ.util.Logic({ name: 'or' })
-
IServ.util.FilterGroup — класс для группировки фильтров и логических операций
new IServ.util.FilterGroup({ items: [{ property: 'name', value: 'Саша' }, 'or', { property: 'name', value: 'Оксана' }] })
Переопределены поведения следующих классов:
- Ext.util.AbstractMixedCollection Переопределен метод filter для выполнения фильтрации с логическими операторами (and и or)
-
Ext.util.Collection Добавлен дополнительный приватный метод logicFilter он служит для подмены стандартной функции filterFn
-
Ext.util.Filter — добавлена автоматическая генерация идентификатора. Т. к. ExtJS при чтении фильтров, если идентификатор не указан, использует значение property, что приводит к потери фильтров которые используют одно и тоже property. Например:
[ { id: 'filter-1', // можно не указывать property: 'name', value: 'Саша' }, 'or', { property: 'name', value: 'Оксана' } ]
Если не указывать id, первое условие ExtJS просматривать не будет
- Ext.util.FilterCollection — Переопределен метод
decodeFilter. Добавлена инициализация
IServ.util.Logic и
IServ.util.FilterGroup
Добавлены дополнительные функции в класс Ext.Array для работы с массивами:
- uniqueWithObject(any[]): any[] — возвращает уникальные объекты из массива. В отличии от функции unique позволяет работать со сложными объектами. Для сериализации объектов используется Ext.encode()
- equalsRecords(any[], any[]): any[] — возвращает одинаковые элементы массивов. Для сравнения применяется метод Ext.encode()
- objectExists(any[], any): boolean — возвращает true если объект присутствует в массиве.
Примеры создания фильтраций:
store.filter([{ property: 'name', value: 'Саша' }, 'or', { property: 'age', value: 30 }, 'and', { property: 'name', value: 'Оксана' }], null, true); или store.filter([ [{ // тут массив для группировки property: 'name', value: 'Саша' }, 'or', { property: 'age', value: 30 }], 'and', { property: 'name', value: 'Оксана' } ], null, true);
Пример формирования RPC запроса:
[ { "property": "name", "value": "Саша" }, "or", { "property": "age", "value": 30 }, "and", { "property": "name", "value": "Оксана" } ] или [ [ // тут группировка { "property": "name", "value": "Саша" }, "or", { "property": "age", "value": 30 } ], "and", { "property": "name", "value": "Оксана" } ]