Skip to content

Commit 0564e43

Browse files
Merge pull request #271 from BitBagCommerce/feature/Sylius-2_0_taxon_search
Feature Sylius 2.0 support- Taxon search
2 parents d9be0fb + 41f6622 commit 0564e43

18 files changed

+230
-105
lines changed

config/config.yml

+99
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ sylius_twig_hooks:
4141
props:
4242
template: "@BitBagSyliusElasticsearchPlugin/Shop/SearchForm/searchForm.html.twig"
4343
priority: 0
44+
4445
'bitbag.sylius_elasticsearch_plugin.site_wide_search.index':
4546
content:
4647
template: '@SyliusShop/product/index/content.html.twig'
@@ -134,3 +135,101 @@ sylius_twig_hooks:
134135
order_by: 'price'
135136
sort: 'asc'
136137
priority: 200
138+
139+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index':
140+
content:
141+
template: '@SyliusShop/product/index/content.html.twig'
142+
priority: 0
143+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content':
144+
breadcrumbs:
145+
template: "@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/breadcrumbs.html.twig"
146+
priority: 100
147+
body:
148+
template: '@SyliusShop/product/index/content/body.html.twig'
149+
priority: 0
150+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body':
151+
sidebar:
152+
template: '@SyliusShop/product/index/content/body/sidebar.html.twig'
153+
priority: 100
154+
main:
155+
template: '@SyliusShop/product/index/content/body/main.html.twig'
156+
priority: 0
157+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.sidebar':
158+
facets:
159+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/sidebar/facets.html.twig'
160+
priority: 0
161+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main':
162+
filters:
163+
template: '@SyliusShop/product/index/content/body/main/filters.html.twig'
164+
priority: 200
165+
search:
166+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/search.html.twig'
167+
priority: 150
168+
products:
169+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/products.html.twig'
170+
priority: 100
171+
pagination:
172+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/pagination.html.twig'
173+
priority: 0
174+
175+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main.filters':
176+
controls:
177+
template: '@SyliusShop/product/index/content/body/main/filters/controls.html.twig'
178+
priority: 0
179+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main.filters.controls':
180+
limit:
181+
template: '@SyliusShop/product/index/content/body/main/filters/controls/limit.html.twig'
182+
priority: 100
183+
sorting:
184+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting.html.twig'
185+
priority: 0
186+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main.filters.controls.limit':
187+
toggle:
188+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/limit/toggle.html.twig'
189+
priority: 100
190+
menu:
191+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/limit/menu.html.twig'
192+
priority: 0
193+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main.filters.controls.sorting':
194+
toggle:
195+
template: '@SyliusShop/product/index/content/body/main/filters/controls/sorting/toggle.html.twig'
196+
priority: 100
197+
menu:
198+
template: '@SyliusShop/product/index/content/body/main/filters/controls/sorting/menu.html.twig'
199+
priority: 0
200+
'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index.content.body.main.filters.controls.sorting.menu':
201+
bestsellers:
202+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting/item.html.twig'
203+
configuration:
204+
title: 'bitbag_sylius_elasticsearch_plugin.ui.bestsellers'
205+
order_by: 'sold_units'
206+
sort: 'desc'
207+
priority: 600
208+
newest:
209+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting/item.html.twig'
210+
configuration:
211+
title: 'bitbag_sylius_elasticsearch_plugin.ui.newest'
212+
order_by: 'product_created_at'
213+
sort: 'desc'
214+
priority: 500
215+
oldest:
216+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting/item.html.twig'
217+
configuration:
218+
title: 'bitbag_sylius_elasticsearch_plugin.ui.oldest'
219+
order_by: 'product_created_at'
220+
sort: 'asc'
221+
priority: 400
222+
most_expensive:
223+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting/item.html.twig'
224+
configuration:
225+
title: 'bitbag_sylius_elasticsearch_plugin.ui.most_expensive'
226+
order_by: 'price'
227+
sort: 'desc'
228+
priority: 300
229+
cheapest:
230+
template: '@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/content/body/main/sorting/item.html.twig'
231+
configuration:
232+
title: 'bitbag_sylius_elasticsearch_plugin.ui.cheapest'
233+
order_by: 'price'
234+
sort: 'asc'
235+
priority: 200

config/routing.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
bitbag_sylius_elasticsearch_plugin_shop_list_products:
2-
path: /{_locale}/products-list/{slug}
1+
bitbag_sylius_elasticsearch_plugin_shop_taxon_products:
2+
path: /{_locale}/taxons/{slug}
33
defaults:
44
_controller: bitbag_sylius_elasticsearch_plugin.controller.action.shop.taxon_products_search
5-
template: "@BitBagSyliusElasticsearchPlugin/Shop/Product/index.html.twig"
5+
template: "@BitBagSyliusElasticsearchPlugin/Shop/TaxonProductsSearch/index.html.twig"
66
requirements:
77
slug: .+
88

templates/Shop/Product/Index/_filterForm.html.twig

-14
This file was deleted.

templates/Shop/Product/Index/_pagination.html.twig

-15
This file was deleted.

templates/Shop/Product/Index/_sorting.html.twig

-17
This file was deleted.

templates/Shop/Product/index.html.twig

-56
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% set form = hookable_metadata.context.search_form %}
2+
{% form_theme form '@SyliusShop/form/theme.html.twig' %}
3+
4+
<div class="row mt-5">
5+
{{ form_start(form, {'attr': {'id': form.vars.id}}) }}
6+
<input type="hidden" name="_method" value="GET" />
7+
{% hook 'body' %}
8+
{{ form_end(form, {render_rest: false}) }}
9+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% set route = app.request.attributes.get('_route') %}
2+
{% set route_parameters = app.request.query.all|unset_elements(['order_by', 'sort', 'page']) %}
3+
{% set slug = app.request.get('slug') %}
4+
5+
<div class="dropdown-menu dropdown-menu-end ">
6+
{% for limit in bitbag_es_pagination_available_page_limits %}
7+
<a class="dropdown-item" href="{{ path(route, {'slug': slug, 'limit': limit}|merge(route_parameters)) }}">{{ limit }}</a>
8+
{% endfor %}
9+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<button type="button" class="btn btn-sm dropdown-toggle" data-bs-toggle="dropdown">
2+
<span class="text-black-50">{{ 'sylius.ui.show'|trans }}: </span>
3+
{{ hookable_metadata.context.products is defined and hookable_metadata.context.products is not empty and hookable_metadata.context.products.maxPerPage is defined ? hookable_metadata.context.products.maxPerPage : 'N/A' }}
4+
</button>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{% set products = hookable_metadata.context.products is defined and hookable_metadata.context.products is not empty ? hookable_metadata.context.products : null %}
2+
{% import '@SyliusShop/shared/pagination/pagination.html.twig' as pagination %}
3+
4+
{% if products is not null %}
5+
{{ pagination.simple(products) }}
6+
{% endif %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% import '@SyliusShop/shared/messages.html.twig' as messages %}
2+
3+
{% set products = hookable_metadata.context.products is defined and hookable_metadata.context.products is not empty ? hookable_metadata.context.products : [] %}
4+
5+
{% if products|length > 0 %}
6+
<div id="search_results" class="products-grid" {{ sylius_test_html_attribute('products') }}>
7+
{% for product in products %}
8+
{{ component('sylius_shop:product:card', { product: product, template: '@SyliusShop/product/common/card.html.twig' }) }}
9+
{% endfor %}
10+
</div>
11+
{% else %}
12+
{{ messages.info('sylius.ui.no_results_to_display') }}
13+
{% endif %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{% set form = hookable_metadata.context.form %}
2+
{% set taxon = hookable_metadata.context.taxon %}
3+
{% set slug = taxon.slug %}
4+
5+
{{ form_start(form, {'action': path('bitbag_sylius_elasticsearch_plugin_shop_taxon_products', {'slug': slug})}) }}
6+
<div class="ui segment mb-4">
7+
<div class="input-group">
8+
{{ form_widget(form.name, {'attr': {'placeholder': 'bitbag_sylius_elasticsearch_plugin.ui.search_box.search_in_taxon', 'class': 'prompt'}}) }}
9+
10+
<button id="bitbag_elasticsearch_taxon_search" class="btn btn btn-outline-secondary btn-sm" type="submit" aria-label="search button">
11+
{{ ux_icon('tabler:search') }}
12+
</button>
13+
</div>
14+
</div>
15+
{{ form_end(form, {'render_rest': false}) }}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{% if hookable_metadata.context.products is defined and hookable_metadata.context.products is not empty and hookable_metadata.context.products.nbResults is defined and hookable_metadata.context.products.nbResults > 0 %}
2+
3+
{% set route = app.request.attributes.get('_route') %}
4+
{% set route_parameters = app.request.query.all|unset_elements(['order_by', 'sort', 'page']) %}
5+
6+
{% if app.request.query.all()['order_by'] is not defined or app.request.query.all()['order_by'] is empty %}
7+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.newest'|trans|lower %}
8+
{% elseif app.request.query.all()['order_by'] == 'sold_units'%}
9+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.bestsellers'|trans|lower %}
10+
{% elseif app.request.query.all()['order_by'] == 'product_created_at' and app.request.query.all()['sort'] == 'desc'%}
11+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.newest'|trans|lower %}
12+
{% elseif app.request.query.all()['order_by'] == 'product_created_at' and app.request.query.all()['sort'] == 'asc'%}
13+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.oldest'|trans|lower %}
14+
{% elseif app.request.query.all()['order_by'] == 'price' and app.request.query.all()['sort'] == 'desc'%}
15+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.most_expensive'|trans|lower %}
16+
{% elseif app.request.query.all()['order_by'] == 'price' and app.request.query.all()['sort'] == 'asc'%}
17+
{% set current_sorting_label = 'bitbag_sylius_elasticsearch_plugin.ui.cheapest'|trans|lower %}
18+
{% endif %}
19+
20+
<div class="dropdown">
21+
{% hook 'sorting' with { route, route_parameters, current_sorting_label } %}
22+
</div>
23+
{% endif %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% set route = hookable_metadata.context.route %}
2+
{% set route_parameters = hookable_metadata.context.route_parameters %}
3+
{% set slug = app.request.get('slug') %}
4+
{% set order_by = hookable_metadata.configuration.order_by %}
5+
{% set sort = hookable_metadata.configuration.sort %}
6+
{% set title = hookable_metadata.configuration.title|trans %}
7+
8+
<a class="dropdown-item" href="{{ path(route, {'slug': slug, 'order_by': order_by, 'sort': sort}|merge(route_parameters)) }}" data-text="{{ title|lower }}">{{ title }}</a>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{% set form = hookable_metadata.context.form %}
2+
3+
{% form_theme form '@SyliusShop/form/theme.html.twig' %}
4+
5+
<div class="container-xl">
6+
{{ form_start(form, {'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate', 'id': form.vars.id}}) }}
7+
{% if form.facets is defined %}
8+
<div class="bitbag-sylius-elasticsearch-plugin-facets-form">
9+
{% for facet in form.facets %}
10+
{% if facet.vars.name != 'taxon' %}
11+
{{ form_row(facet) }}
12+
{% endif %}
13+
{% endfor %}
14+
</div>
15+
{% endif %}
16+
17+
{{ form_end(form, {render_rest: false}) }}
18+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{% from '@SyliusShop/shared/breadcrumbs.html.twig' import breadcrumbs as breadcrumbs %}
2+
3+
{% set taxon = hookable_metadata.context.taxon %}
4+
{% set items = [{ path: path('sylius_shop_homepage'), label: 'sylius.ui.home'|trans }] %}
5+
{% set ancestors = taxon.ancestors|reverse %}
6+
7+
{% for ancestor in ancestors %}
8+
{% if ancestor.isRoot() or not ancestor.enabled %}
9+
{% set items = items|merge([{ label: ancestor.name }]) %}
10+
{% else %}
11+
{% set items = items|merge([{ path: path('sylius_shop_product_index', {'slug': ancestor.slug, '_locale': ancestor.translation.locale}), label: ancestor.name }]) %}
12+
{% endif %}
13+
{% endfor %}
14+
15+
{% set items = items|merge([{ label: taxon.name, active: true }]) %}
16+
17+
{{ breadcrumbs(items) }}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% extends '@SyliusShop/shared/layout/base.html.twig' %}
2+
3+
{% block content %}
4+
{% hook 'bitbag.sylius_elasticsearch_plugin.taxon_products_search.index' with { products, form } %}
5+
{% endblock %}

translations/messages.en.yml

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ bitbag_sylius_elasticsearch_plugin:
1818
placeholder: Search for products...
1919
search_button:
2020
label: Search
21+
search_in_taxon: Search in this taxon
2122

2223
facet:
2324
price:

0 commit comments

Comments
 (0)