Working Sylius Elasticsearch integration based on FOSElasticaBundle. The main goal of this plugin is to support filtering products by
options, attributes, taxons, channels and name in the front product list page. It totally replaces the default Sylius sylius_shop_product_index
route.
What is more, the plugin has a nice Sylius-oriented architecture that allows mapping resources to the Elastic document easier. It is flexible as well, so that you can customize the existing features for your specific business needs.
You can order our support on this page.
We work on amazing eCommerce projects on top of Sylius and Pimcore. Need some help or additional resources for a project? Write us an email on mikolaj.krol@bitbag.pl or visit our website! 🚀
We created a demo app with some useful use-cases of the plugin! Visit demo.bitbag.shop to take a look at it.
The admin can be accessed under demo.bitbag.shop/admin link and sylius: sylius
credentials.
$ composer require bitbag/elasticsearch-plugin
Add plugin dependencies to your AppKernel.php file:
public function registerBundles()
{
return array_merge(parent::registerBundles(), [
...
new \FOS\ElasticaBundle\FOSElasticaBundle(),
new \BitBag\SyliusElasticsearchPlugin\BitBagSyliusElasticsearchPlugin(),
]);
}
Import required config in your app/config/config.yml
file:
# app/config/config.yml
imports:
...
- { resource: "@BitBagSyliusElasticsearchPlugin/Resources/config/config.yml" }
Import routing on top of your app/config/routing.yml
file:
# app/config/routing.yml
bitbag_sylius_elasticsearch_plugin:
resource: "@BitBagSyliusElasticsearchPlugin/Resources/config/routing.yml"
redirect_sylius_shop_product_index:
path: /{_locale}/taxons/{slug}
controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::redirectAction
defaults:
route: bitbag_sylius_elasticsearch_plugin_shop_list_products
permanent: true
requirements:
_locale: ^[a-z]{2}(?:_[A-Z]{2})?$
slug: .+
With a elasticsearch server running, execute following command:
$ bin/console fos:elastica:populate
Note: If you are running it on production, add the -e prod
flag to this command. Elastic are created with environment suffix.
When you go now to the /{_locale}/products/taxon/{slug}
page, you should see a totally new set of filters. You should see something like this:
You might also want to refer the horizontal menu to a new product list page. Follow below instructions to do so:
- If you haven't done it yet, create a
_horizontalMenu.html.twig
file inapp/Resources/SyliusShopBundle/views/Taxon
directory. - Replace
sylius_shop_product_index
withbitbag_sylius_elasticsearch_plugin_shop_list_products
. - Clean your cache with
bin/console cache:clear
command. - 🎉
You might not want to show some specific options or attributes in the menu. You can set specific parameters for that:
parameters:
bitbag_es_excluded_filter_options: []
bitbag_es_excluded_filter_attributes: ['book_isbn', 'book_pages']
By default all options and attributes are indexed. After you change these parameters, remember to run bin/console fo:el:po
command again
(a shortcut for fos:elastica:populate
).
By default, current indexes listen on all Doctrine events. You can override this setting for each index by overriding index definition in your config.yml
file:
fos_elastica:
indexes:
bitbag_attribute_taxons:
types:
default:
persistence:
listener:
insert: true
update: false
delete: true
Indexes with bitbag_shop_product
, bitbag_attribute_taxons
and bitbag_option_taxons
keys are available so far.
bitbag.sylius_elasticsearch_plugin.context.product_attributes BitBag\SyliusElasticsearchPlugin\Context\ProductAttributesContext
bitbag.sylius_elasticsearch_plugin.context.product_options BitBag\SyliusElasticsearchPlugin\Context\ProductOptionsContext
bitbag.sylius_elasticsearch_plugin.context.taxon BitBag\SyliusElasticsearchPlugin\Context\TaxonContext
bitbag.sylius_elasticsearch_plugin.string_formatter BitBag\SyliusElasticsearchPlugin\Formatter\StringFormatter
bitbag.sylius_elasticsearch_plugin.twig.extension.unset_array_elements BitBag\SyliusElasticsearchPlugin\Twig\Extension\UnsetArrayElementsExtension
bitbag_sylius_elasticsearch_plugin.controller.action.shop.list_products BitBag\SyliusElasticsearchPlugin\Controller\Action\Shop\ListProductsAction
bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.pagination BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\PaginationDataHandler
bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_product_list BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\ShopProductListDataHandler
bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_products_sort BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\ShopProductsSortDataHandler
bitbag_sylius_elasticsearch_plugin.finder.product_attributes BitBag\SyliusElasticsearchPlugin\Finder\ProductAttributesFinder
bitbag_sylius_elasticsearch_plugin.finder.product_options BitBag\SyliusElasticsearchPlugin\Finder\ProductOptionsFinder
bitbag_sylius_elasticsearch_plugin.finder.shop_products BitBag\SyliusElasticsearchPlugin\Finder\ShopProductsFinder
bitbag_sylius_elasticsearch_plugin.form.type.choice_mapper.product_attributes BitBag\SyliusElasticsearchPlugin\Form\Type\ChoiceMapper\ProductAttributesMapper
bitbag_sylius_elasticsearch_plugin.form.type.choice_mapper.product_options BitBag\SyliusElasticsearchPlugin\Form\Type\ChoiceMapper\ProductOptionsMapper
bitbag_sylius_elasticsearch_plugin.form.type.name_filter BitBag\SyliusElasticsearchPlugin\Form\Type\NameFilterType
bitbag_sylius_elasticsearch_plugin.form.type.price_filter BitBag\SyliusElasticsearchPlugin\Form\Type\PriceFilterType
bitbag_sylius_elasticsearch_plugin.form.type.product_attributes_filter BitBag\SyliusElasticsearchPlugin\Form\Type\ProductAttributesFilterType
bitbag_sylius_elasticsearch_plugin.form.type.product_options_filter BitBag\SyliusElasticsearchPlugin\Form\Type\ProductOptionsFilterType
bitbag_sylius_elasticsearch_plugin.form.type.shop_products_filter BitBag\SyliusElasticsearchPlugin\Form\Type\ShopProductsFilterType
bitbag_sylius_elasticsearch_plugin.property_builder.attribute BitBag\SyliusElasticsearchPlugin\PropertyBuilder\AttributeBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.attribute_taxons BitBag\SyliusElasticsearchPlugin\PropertyBuilder\AttributeTaxonsBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.channel_pricing BitBag\SyliusElasticsearchPlugin\PropertyBuilder\ChannelPricingBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.channels BitBag\SyliusElasticsearchPlugin\PropertyBuilder\ChannelsBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.option BitBag\SyliusElasticsearchPlugin\PropertyBuilder\OptionBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.option_taxons BitBag\SyliusElasticsearchPlugin\PropertyBuilder\OptionTaxonsBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.product_created_at BitBag\SyliusElasticsearchPlugin\PropertyBuilder\ProductCreatedAtPropertyBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.product_name BitBag\SyliusElasticsearchPlugin\PropertyBuilder\ProductNameBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.product_taxons BitBag\SyliusElasticsearchPlugin\PropertyBuilder\ProductTaxonsBuilder
bitbag_sylius_elasticsearch_plugin.property_builder.sold_units BitBag\SyliusElasticsearchPlugin\PropertyBuilder\SoldUnitsPropertyBuilder
bitbag_sylius_elasticsearch_plugin.property_name_resolver.attribute BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolver
bitbag_sylius_elasticsearch_plugin.property_name_resolver.channel_pricing BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolver
bitbag_sylius_elasticsearch_plugin.property_name_resolver.name BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolver
bitbag_sylius_elasticsearch_plugin.property_name_resolver.option BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolver
bitbag_sylius_elasticsearch_plugin.property_name_resolver.price BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\PriceNameResolver
bitbag_sylius_elasticsearch_plugin.query_builder.contains_name BitBag\SyliusElasticsearchPlugin\QueryBuilder\ContainsNameQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_attribute_taxon BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasTaxonQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_attributes BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasAttributesQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_channel BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasChannelQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_option_taxon BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasTaxonQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_options BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasOptionsQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_price_between BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasPriceBetweenQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.has_product_taxon BitBag\SyliusElasticsearchPlugin\QueryBuilder\HasTaxonQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.is_enabled BitBag\SyliusElasticsearchPlugin\QueryBuilder\IsEnabledQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.product_attributes_by_taxon BitBag\SyliusElasticsearchPlugin\QueryBuilder\ProductAttributesByTaxonQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.product_options_by_taxon BitBag\SyliusElasticsearchPlugin\QueryBuilder\ProductOptionsByTaxonQueryBuilder
bitbag_sylius_elasticsearch_plugin.query_builder.shop_products BitBag\SyliusElasticsearchPlugin\QueryBuilder\ShopProductsQueryBuilder
bitbag_es_excluded_filter_attributes []
bitbag_es_excluded_filter_options []
bitbag_es_shop_attribute_property_prefix attribute
bitbag_es_shop_attribute_taxons_property attribute_taxons
bitbag_es_shop_channels_property channels
bitbag_es_shop_enabled_property enabled
bitbag_es_shop_name_property_prefix name
bitbag_es_shop_option_property_prefix option
bitbag_es_shop_option_taxons_property option_taxons
bitbag_es_shop_product_created_at product_created_at
bitbag_es_shop_product_price_property_prefix price
bitbag_es_shop_product_sold_units sold_units
bitbag_es_shop_product_taxons_property product_taxons
fos_elastica.default_index bitbag_shop_product
$ composer install
$ cd tests/Application
$ yarn install
$ yarn run gulp
$ bin/console assets:install web -e test
$ bin/console doctrine:schema:create -e test
$ elasticsearch
$ bin/console fos:elastica:populate -e test
$ bin/console server:run 127.0.0.1:8080 -d web -e test
$ open http://localhost:8080
$ bin/behat
$ bin/phpspec run
Learn more about our contribution workflow on http://docs.sylius.org/en/latest/contributing/.