Grid Extension 

The FilterBundle provides an extension for datagrid with ORM and Search datasources. Filters could be added to the datagrid in the datagrids.yml file for a specified datagrid under the filters node. Definition of any filter requires option data_name that should be referenced to column in the query and type (filter type).

For example:

SOME_DATAGRID:
    source:
        type: orm
        query:
            select:
                - g.id
                - g.label
            from:
                - { table: Oro\Bundle\ContactBundle\Entity\Group, alias: g }

    filters:
        columns:
            SOME_FITLER_NAME: # uses for query param, and for setting default filters
                type: string  # Filter type, list of available types described below
                data_name: g.id
                renderable: true|false #whether filter available or not. If filter is not renderable it will not be displayed in filter list but will be accessible in filter management.
                visible: true|false #If set to "false" - filter will not be displayed anywhere in UI. However, one can still set filter's value in backend or via url in frontend
                disabled: true|false #If filter is disabled it will not be displayed in filter list and will not be available in filter management.
                order: number #The number of filter's position, allows to change order of the filters (by default it is not defined and follows columns order)
                force_like: true|false #Different search engines uses different methods for text search. When `force_like` is set to true, text-based filters will use simple `LIKE %%` OR `NOT LIKE %%`statement which depends on a chosen operator
                min_length: integer #In case of text-based filters this option introduce possibility to ignore filters with less characters then specified. Validation message will also appear
                divisor: number #In case of number-based filters this option will filter values rendered with datagrid divisor option.
                case_insensitive: true|false #When set to 'true' text search filter will be case insensitive [Postgres only].
                value_conversion: string #Callback for text search filter used for converting value passed to a query.

Default Values 

String Filter 

filters:
    columns:
        fieldName:
            type:      string
            data_name: priorityLabel
            case_insensitive: true
    default:
        fieldName: { value: 'someText', type: 'Oro\Bundle\FilterBundle\Form\Type\Filter\TextFilterType::TYPE_CONTAINS' }

Choice Filter 

filters:
    columns:
        period:
            type: orocrm_period_filter
            data_name: period
            options:
                populate_default: false
                field_options:
                    choices:
                        monthPeriod:    Monthly
                        quarterPeriod:  Quarterly
                        yearPeriod:     Yearly
    default:
        period: { value: monthPeriod }

Additional Params 

  • filter_condition - use OR or AND operator in expression

  • filter_by_having - filter expression should be added to HAVING clause

  • options - pass form options directly to filter form type (for additional info, see Filter Form Types).

Filters 

String Filter 

Provides filtering using string comparison.

type: string - Validated by TextFilterType in the backend and rendered by oro/filter/choice-filter. When case_insensitive is set to false, it is possible to convert value by using callback defined in ‘value_conversion’.

Number and Percent Filter 

Provides filtering by numbers comparison.

Note

Value from frontend will automatically transform to percentage for “percent” filter.

type: number - integer/decimal filter

Validated by NumberFilterType in the backend and rendered by oro/filter/number-filter.

type: number-range - integer/decimal filter

type: percent - percent filter

type: currency - currency filter

Validated by NumberRangeFilterType in the backend and rendered by oro/filter/number-range-filter.

Boolean Filter 

Provides filtering for boolean values.

type: boolean - Validated by BooleanFilterType in the backend and rendered by oro/filter/boolean-filter with a predefined set of options (yes/no).

Choice Filter 

Provides filtering data using a list of predefined choices

type: choice - Validated by ChoiceFilterType in the backend and rendered by oro/filter/select-filter.

Entity Filter 

Provides filtering data using list of choices that extracted from database.

type: entity - Validated by EntityFilterType in the backend and rendered by oro/filter/select-filter.

Date Filter 

Provides filtering data by date values

type: date - Validated by DateRangeFilterType. Rendered by oro/filter/date-filter.

DateTime Filter 

Provides filtering data by datetime values

type: datetime - Validated by DateTimeRangeFilterType. Rendered by oro/filter/datetime-filter.

DateGrouping Filter 

Provides grouping dates using list of predefined choices: Day, Month, Quarter, Year

type: datetime - Validated by DateGroupingFilterType in the backend and rendered by oro/filter/datetime-filter`.

SkipEmptyPeriods Filter 

Provides skipping empty data using list of predefined choices: Yes, No

type: choice - Validated by SkipEmptyPeriodsFilterType in the backend and rendered by oro/filter/select-filter.

Customization 

To implement your filter you have to do following:

  • Develop class that implements Oro\Bundle\FilterBundle\Filter\FilterInterface (also there is basic implementation in AbstractFilter class)

  • Register your filter as service with tag { name: oro_filter.extension.orm_filter.filter, type: YOUR_FILTER_TYPE }

  • Create and register JavaScript module for the new filter. The map-filter-module-name.js defines the JavaScript module name for a filter based on frontend_type by the pattern 'oro/filter/{{type}}-filter'. Since module name does not represent the real path to the filter file, add the alias and dynamic-imports definitions to your jsmodules.yml file. E.g.:

    aliases:
        oro/filter/subcategory-filter$: orocatalog/js/filter/subcategory-filter
    dynamic-imports:
        orodatagrid:
            - oro/filter/subcategory-filter