• v3.0
    • Versions
    • master
    • v3.0
    • v2.3
    • v2.2
    • v2.1
    • v2.0
    • v1.7
    • v1.6
    • v1.5
    • v1.4
    • v1.3
    • v1.2
    • v1.1
    • v1.0

 

  • Install Akeneo PIM
    • Install Akeneo PIM with Docker
    • Install Akeneo PIM manually
      • System Requirements
      • System installation on Debian 9 (Stretch)
      • System installation on Ubuntu 16.04 (Xenial Xerus)
      • Installing Akeneo PIM Community Edition (CE) with the Archive
      • Installing Akeneo PIM Enterprise Edition (EE) with the Archive
      • Setting up the job queue daemon
    • How to customize the Dataset
    • How to Add Translation Packs
  • Migrate Akeneo PIM projects
  • Import and Export data
    • How import works
    • Understanding the Product Import
    • Understanding the Product Export
    • Formats
      • Localized labels
      • Scopable labels
      • Association types data structure
      • Attribute data structure
      • Category data structure
      • Family data structure
      • Family variant data structure
      • Group data structure
      • Options data structure
      • Product data structure
      • Product model data structure
    • Akeneo Connectors
    • How to Customize Import / Export
      • How to create a new Connector
      • How to import Products from a XML file
      • How to clean a CSV file during a Product import
      • How to automate imports/exports
  • Manipulate the Akeneo PIM data
    • How to Customize Mass Edit Operations
      • How to register a new bulk action
      • How to Register a New Mass Edit Action on Products
      • How to Avoid Rules Execution on Mass Edit Actions
    • How to Manipulate Products
      • How to Query Products
      • How to Create Products
      • How to Update Products
      • How to Validate Products
      • How to Save Products
      • How to Remove Products
    • How to Manipulate Non-Product Objects
      • How to Query Non-Product Objects
      • How to Create Non-Product Objects
      • How to Update Non-Product Objects
      • How to Validate Non-Product Objects
      • How to Save Non-Product Objects
      • How to Remove Non-Product Objects
    • How to add a custom action rule
      • General information about rule format
      • How to add a custom action in the rule engine
    • How to Define Access Control List
    • How to Customize the Catalog Structure
      • How to Create a Reference Data
      • How to add a custom unit of measure
      • How to Add New Properties to a Category
    • How to Customize Product Assets
      • How to Add a New Transformation
      • How to Add a Default Thumbnail For Unknown File Types
      • How to connect to an external server for storage
      • How to change the validation rule to match a reference file to an asset
      • How to Mass Import Assets
    • How To Customize Teamwork Assistant (Enterprise Edition)
      • Customize notifications
      • Add a calculation step
      • How to log calculation step
      • Remove projects impacted by a custom catalog update
  • Design the user interfaces
    • How to customize any frontend part of the application
    • How to add an action button or meta data to the product edit form
    • How to add a tab to a form
    • How to add a new tab in System / Configuration
    • How to add custom information to a field
    • How to add a new field type
    • Create a custom product export builder filter
    • How to create the UI to manage a Reference Data
    • How to add a new page
    • How to customize the main menu
    • Styleguide
  • Maintain Akeneo PIM projects
    • First aid kit
    • Bug qualification
    • Common issues
    • Scalability Guide
      • Audit with 3 Representative Catalogs
      • More than 10k attributes?
      • More than 10k families?
      • More than 10k categories?
      • More than 500 attributes usable in the product grids?
      • More than 100k products to export?
      • More than 1GB of product media to export?
    • How to purge history
      • How to Purge jobs executions
      • How to adapt the version purger to your needs
  • Contribute to Akeneo PIM
    • How to report an issue?
    • How to translate the user interface?
    • How to enhance the documentation?
    • How to contribute to a Connector?
    • How to submit a patch to the PIM?
    • How to contribute to the frontend part of the application
    • How behavior tests are architectured in the PIM?
      • Establishing Decorator Pattern
      • Using Spin In Behat
  • Use SSO authentication locally
  • Technical overview
    • Product Information
    • Teamwork Assistant (Enterprise Edition)
      • Project creation
      • Project completeness
      • Project Completeness widget
      • Catalog update impact
      • Scalability guide
      • Users permission summary for Behat tests
    • Collaborative workflow
      • Simple workflow
      • Partial workflow
  • Technical architecture
    • Best Practices
      • Create a project
      • Create a reusable bundle
      • Setup Behat
      • Code Conventions
      • Coding Standards
    • How to implement your business logic using the event system
    • Events
      • Storage events
      • Workflow events (Enterprise Edition only)
    • How to Localize your data
      • How to change the PIM locale
      • How to Use Localizers
      • How to use Presenters
    • How to Add a Notification
    • Performances Guide
      • Memory usage of rules execution (Enterprise Edition)
      • Memory leak fix in Rules Engine (ORM)
      • More than 100 WYSIWYG editors in a page
      • PHP7 and HHVM Compatibility?
      • Job product batch size
    • How to Use the Web REST API
    • Standard format
      • Products
      • Other entities
      • Usage
    • Application Technical Information
      • Application Technical Dependencies
      • Server side set up for hosting
      • System Requirements
      • Recommended configuration
      • Client side configuration and compatibilities
      • Operation processes
      • Flow Matrix
  • Akeneo Cloud Edition
    • Flexibility Mode
      • Overview
      • Partners Starterkit
      • Environments Access
      • Composer settings
      • Periodic tasks / Crontab settings
      • PIM Application
      • PIM Updates and Migrations
      • Data File Transfer
      • Backups management
      • Partners
      • System Components
    • Serenity Mode
      • Overview
      • PIM Updates and Migrations
  • Akeneo Onboarder
    • Prerequisites
    • Installation
    • Synchronization
    • Environment variables
      • Using the DotEnv file
      • Using environment variables

Create a custom product export builder filter¶

When you create a new attribute type or if you want to change the rendering of a filter you need to create a custom filter. In this quick cookbook we will go through all the steps to achieve this task.

Declare a filter provider for our custom filter¶

To create a custom filter, first we need to create a FilterProvider for our new filter type:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

namespace Acme\Bundle\CustomBundle\Enrich\Provider\Filter;

use Akeneo\Platform\Bundle\UIBundle\Provider\Filter\FilterProviderInterface;
use Akeneo\Pim\Structure\Component\Model\AttributeInterface;

class RangeFilterProvider implements FilterProviderInterface
{
    /**
     * {@inheritdoc}
     */
    public function getFilters($attribute)
    {
        // We expose our future custom filter for the product export builder
        return ['product-export-builder' => 'acme-range-filter'];
    }

    /**
     * {@inheritdoc}
     */
    public function supports($element)
    {
        return $element instanceof AttributeInterface  &&
            $element->getAttributeType() === 'pim_catalog_number' &&
            null !== $element->getNumberMin() &&
            null !== $element->getNumberMax();
    }
}

Now we can register this filter provider in our service.yml file

1
2
3
4
5
services:
    acme.custom.provider.filter.range:
        class: Acme\Bundle\CustomBundle\Enrich\Provider\Filter\RangeFilterProvider
        tags:
            - { name: pim_enrich.provider.filter, priority: 110 }

Your filter provider is now registered, congrats!

Create the filter¶

Now that we have a filter provider, we can create the filter itself:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'use strict';
/*
 * src/Acme/Bundle/CustomBundle/Resources/public/js/product/filter/range-filter.js
 */
define([
    'underscore',
    'oro/translator',
    'pim/filter/attribute/attribute',
    'acme/template/product/filter/range',
    'jquery.select2'
], function (
    _,
    __,
    AttributeFilter,
    template
) {
    return AttributeFilter.extend({
        shortname: 'range',
        template: _.template(template),

        /*
        We listen on the change event of the range field.
         */
        events: {
            'change [name="filter-value"]': 'updateState'
        },

        configure: function () {
            this.listenTo(this.getRoot(), 'pim_enrich:form:entity:pre_update', function (data) {
                // Before the set data, we define the defaults values of our field
                _.defaults(data, {field: this.getCode(), value: '', operator: '>='});
            }.bind(this));

            return AttributeFilter.prototype.configure.apply(this, arguments);
        },

        renderInput: function (templateContext) {
            // It's time to render our field
            return this.template(_.extend({}, templateContext, {
                value: this.getValue()
            }));
        },

        updateState: function () {
            // When the dom change, we update our internal model
            this.setData({
                field: this.getField(),
                operator: this.getOperator(),
                value: this.$('[name="filter-value"]').val()
            });
        }
    });
});

And its template:

1
2
3
4
5
6
7
8
9
<!-- src/Acme/Bundle/CustomBundle/Resources/public/templates/product/filter/range.html -->
<input
    type="range"
    name="filter-value"
    value="<%= value %>"
    min="<%= attribute.number_min %>"
    max="<%= attribute.number_max %>"
    <%- editable ? '' : 'disabled' %>
/>

You can now register this module into our requirejs configuration:

1
2
3
4
5
6
# Acme/Bundle/CustomBundle/Resources/config/requirejs.yml
config:
    paths:
        acme/range-filter: acmecustom/js/product/filter/range-filter

        acme/template/product/filter/range: acmecustom/templates/product/filter/range.html

After registering this module you must build the frontend with webpack:

yarn run webpack

Then, last operation, match the filter type (acme-range-filter) with the requirejs module (acme/range-filter):

1
2
3
4
# Acme/Bundle/CustomBundle/Resources/config/form_extensions.yml
extensions:
    acme-range-filter:
        module: acme/range-filter

After a cache clearing, we can now set the min and max value of any number attribute to start to use this new custom filter!


Found a typo or a hole in the documentation and feel like contributing?
Join us on Github!