Логическая фильтрация и группировка фильтров

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

Добавить комментарий