Skip to content

multiple_filter

The multiple_filter macro is used to render a set of list filters.

Definition

{% multiple_filter(filter, options) %}

Input parameters

filter

Filter Filter object representing a filter to render.

options

object represents an object of filter attributes

Option key Type Default Required Description
options.instanceId string "" yes An id necessary to make a filter unique. Usually it can just be the module instance id
options.showCounters boolean false no If set to true a number of items meeting criteria of a given filter will be displayed

Example

In this example we render a simple filter based on a collections filter from Object Api on a product list view. If using the macro inside a module we can pass a moduleInstance as an instanceId parameter. As specified earlier, usually it does the job.

{% from "@macros/multiple_filter.twig" import multiple_filter %}

{% set filters = ObjectApi.getFilters() %}

{{ multiple_filter(filters.collectionsFilter, {
    instanceId: moduleInstance
}) }}

Macro source code

{% macro multiple_filter(filter, options) %}
    {% from "@macros/checkbox_control.twig" import checkbox_control %}

    {% if options.isFiltersSubcategoriesWcagFlagEnabled %}
        {% set nonZeroCounters = filter.values|default({})|filter(obj => obj.counter != 0) %}
        {% set zeroCounters = filter.values|default({})|filter(obj => obj.counter == 0) %}
        {% set preFilters = nonZeroCounters | merge(zeroCounters) %}

        {% set activeFilters = preFilters|filter(filter => filter.isActive == 1) %}
        {% set notActiveFilters = preFilters|filter(filter => filter.isActive != 1) %}
        {% set totalFilters = activeFilters|merge(notActiveFilters) %}

        {% if options.shouldHideEmptyFilters %}
            {% set totalFilters = totalFilters|filter(filter => filter.counter is defined and filter.counter is not empty and filter.counter > 0) %}
        {% endif %}

        {% if filter.getLimit %}
            {% set limit = filter.getLimit %}
        {% else %}
            {% set limit = 0 %}
        {% endif %}

        <fieldset>
            <legend class="sr-only">{{ filter.name }}</legend>

            {% for filterOption in totalFilters %}
                {% set filterId = filterOption.urlKey ~ filterOption.urlValue ~ options.instanceId %}
                {% if loop.index <= limit or filterOption.isActive %}
                    {% set showCounters = options.showCounters and filterOption.counter is defined %}

                    <div class="{{ html_classes('filter-control', { 'filter-control_empty': options.showCounters and filterOption.counter is defined and filterOption.counter <= 0 }) }}">
                        <div>
                            <div class="control">
                                <div class="checkbox">
                                    {{ checkbox_control({
                                            id: filterId,
                                            label: filterOption.name,
                                            name: filterOption.urlKey,
                                            value: filterOption.urlValue,
                                            checked: filterOption.isActive,
                                            ariaLabel: "#{filterOption.name}, #{showCounters ? translate('Number of products: %s', filterOption.counter) : ''}",
                                            dataAttributes: {
                                                'is-available': filterOption.isAvailable
                                            }
                                        })
                                    }}

                                    <div class="checkbox__content">
                                        <label class="label label_vcenter" for={{ filterId }}>
                                            {% if filterOption.color %}
                                                <div style="background-color: {{ filterOption.color }}" class="color-item color-item_xs"></div>
                                            {% endif %}

                                            {{ filterOption.name }}
                                        </label>
                                    </div>
                                </div>
                            </div>
                        </div>

                        {% if showCounters %}
                            <span aria-hidden="true" class="filter-control__counter">{{ filterOption.counter }}</span>
                        {% endif %}
                    </div>
                {% else %}
                    {% if isMoreFilters != 1 %}
                        {% set filtersLeft = loop.length - loop.index0 %}
                        <h-toggle class="hidden-xs-only filters__more-filters">
                            <template>
                    {% endif %}
                                {% set isMoreFilters = 1 %}

                                <div class="{{ html_classes('filter-control', { 'filter-control_empty': options.showCounters and filterOption.counter is defined and filterOption.counter <= 0 }) }}">
                                    <div>
                                        <div class="control">
                                            <div class="checkbox">
                                                {{ checkbox_control({
                                                        id: filterId,
                                                        label: filterOption.name,
                                                        name: filterOption.urlKey,
                                                        value: filterOption.urlValue,
                                                        checked: filterOption.isActive,
                                                        ariaLabel: "#{filterOption.name}, #{showCounters ? translate('Number of products: %s', filterOption.counter) : ''}",
                                                        dataAttributes: {
                                                            'is-available': filterOption.isAvailable
                                                        }
                                                    })
                                                }}

                                                <div class="checkbox__content">
                                                    <label class="label label_vcenter" for={{ filterId }}>
                                                        {% if filterOption.color %}
                                                            <div style="background-color: {{ filterOption.color }}" class="color-item color-item_xs"></div>
                                                        {% endif %}

                                                        {{ filterOption.name }}
                                                    </label>
                                                </div>
                                            </div>
                                        </div>
                                    </div>

                                    {% if options.showCounters and filterOption.counter is defined %}
                                        <span aria-hidden="true" class="filter-control__counter">{{ filterOption.counter }}</span>
                                    {% endif %}
                                </div>

                    {% if loop.index == loop.length %}   
                            </template>

                            <h-toggle-btn
                                class="filters__expand-btn"
                                action="expand"
                                aria-label="{{ translate('Show %s more filter option', filtersLeft) }}"
                            >
                                {{ translate('More options') }} ({{ filtersLeft }})
                            </h-toggle-btn>
                            <h-toggle-btn
                                class="filters__collapse-btn"
                                action="collapse"
                                aria-label="{{ translate('Collapse filter options') }}"
                                hidden
                            >
                                {{ translate('Collapse') }}
                            </h-toggle-btn>
                        </h-toggle>
                    {% endif %}
                {% endif %}
            {% endfor %}

            {% for filterOptionMobile in filters %}
                {% set filterId = filterOptionMobile.urlKey ~ filterOptionMobile.urlValue ~ options.instanceId ~ "-mobile" %}

                {% if loop.index > limit %}
                    {% set showCounters = options.showCounters and filterOptionMobile.counter is defined %}

                    <div class="{{ html_classes('visible-xs-only filter-control', { 'filter-control_empty': options.showCounters and filterOptionMobile.counter is defined and filterOptionMobile.counter <= 0 }) }}">
                        <div>
                            <div class="control">
                                <div class="checkbox">
                                    {{ checkbox_control({
                                            id: filterId,
                                            label: filterOptionMobile.name,
                                            name: filterOptionMobile.urlKey,
                                            value: filterOptionMobile.urlValue,
                                            checked: filterOptionMobile.isActive,
                                            ariaLabel: "#{filterOptionMobile.name}, #{showCounters ? translate('Number of products: %s', filterOptionMobile.counter) : ''}",
                                            dataAttributes: {
                                                'is-available': filterOptionMobile.isAvailable
                                            }
                                        })
                                    }}

                                    <div class="checkbox__content">
                                        <label class="label label_vcenter" for={{ filterId }}>
                                            {% if filterOptionMobile.color %}
                                                <div style="background-color: {{ filterOptionMobile.color }}" class="color-item color-item_xs"></div>
                                            {% endif %}

                                            {{ filterOptionMobile.name }}
                                        </label>
                                    </div>
                                </div>
                            </div>
                        </div>

                        {% if showCounters %}
                            <span aria-hidden="true" class="filter-control__counter">{{ filterOptionMobile.counter }}</span>
                        {% endif %}
                    </div>
                {% endif %}
            {% endfor %}
        </fieldset>
    {% else %}
        {% set nonZeroCounters = filter.values|default({})|filter(obj => obj.counter != 0) %}
        {% set zeroCounters = filter.values|default({})|filter(obj => obj.counter == 0) %}
        {% set preFilters = nonZeroCounters | merge(zeroCounters) %}

        {% set activeFilters = preFilters|filter(filter => filter.isActive == 1) %}
        {% set notActiveFilters = preFilters|filter(filter => filter.isActive != 1) %}
        {% set filters = activeFilters|merge(notActiveFilters) %}

        {% if options.shouldHideEmptyFilters %}
            {% set filters = filters|filter(filter => filter.counter is defined and filter.counter is not empty and filter.counter > 0) %}
        {% endif %}

        {% if filter.getLimit %}
            {% set limit = filter.getLimit %}
        {% else %}
            {% set limit = 0 %}
        {% endif %}

        {% for filter in filters %}
            {% set filterId = filter.urlKey ~ filter.urlValue ~ options.instanceId %}

            {% if loop.index <= limit or filter.isActive %}
                <div class="{{ html_classes('filter-control', { 'filter-control_empty': options.showCounters and filter.counter is defined and filter.counter <= 0 }) }}">
                    <div>
                        <div class="control">
                            <div class="checkbox">
                                {{ checkbox_control({
                                        id: filterId,
                                        label: filter.name,
                                        name: filter.urlKey,
                                        value: filter.urlValue,
                                        checked: filter.isActive,
                                        dataAttributes: {
                                            'is-available': filter.isAvailable
                                        }
                                    }) 
                                }}

                                <div class="checkbox__content">
                                    <label class="label label_vcenter" for={{ filterId }}>
                                        {% if filter.color %}
                                            <div style="background-color: {{ filter.color }}" class="color-item color-item_xs"></div>
                                        {% endif %}

                                        {{ filter.name }}
                                    </label>
                                </div>
                            </div>
                        </div>
                    </div>

                    {% if options.showCounters and filter.counter is defined %}
                        <span aria-label="{{ translate('Products') }} {{ filter.counter }}"n class="filter-control__counter">{{ filter.counter }}</span>
                    {% endif %}
                </div>
            {% else %}
                {% if isMoreFilters != 1 %}
                    {% set filtersLeft = loop.length - loop.index0 %}
                    <h-toggle class="filters__more-filters">
                        <template>
                {% endif %}
                            {% set isMoreFilters = 1 %}

                            <div class="{{ html_classes('filter-control', { 'filter-control_empty': options.showCounters and filter.counter is defined and filter.counter <= 0 }) }}">
                                <div>
                                    <div class="control">
                                        <div class="checkbox">
                                            {{ checkbox_control({
                                                    id: filterId,
                                                    label: filter.name,
                                                    name: filter.urlKey,
                                                    value: filter.urlValue,
                                                    checked: filter.isActive,
                                                    dataAttributes: {
                                                        'is-available': filter.isAvailable
                                                    }
                                                }) 
                                            }}

                                            <div class="checkbox__content">
                                                <label class="label label_vcenter" for={{ filterId }}>
                                                    {% if filter.color %}
                                                        <div style="background-color: {{ filter.color }}" class="color-item color-item_xs"></div>
                                                    {% endif %}

                                                    {{ filter.name }}
                                                </label>
                                            </div>
                                        </div>
                                    </div>
                                </div>

                                {% if options.showCounters and filter.counter is defined %}
                                    <span aria-label="{{ translate('Products') }} {{ filter.counter }}" class="filter-control__counter">{{ filter.counter }}</span>
                                {% endif %}
                            </div>

                {% if loop.index == loop.length %}   
                        </template>

                        <h-toggle-btn class="filters__expand-btn" action="expand">{{ translate('More options') }} ({{ filtersLeft }})</h-toggle-btn>
                        <h-toggle-btn class="filters__collapse-btn"  action="collapse" hidden>{{ translate('Collapse') }}</h-toggle-btn>
                    </h-toggle>
                {% endif %}
            {% endif %}
        {% endfor %}
    {% endif %}
{% endmacro %}