По умолчанию 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": "Оксана"
}
]