mirror of
https://github.com/jbcr/SyliusElasticsearchPlugin.git
synced 2026-03-24 00:42:08 +01:00
OP-7: Address CR comments
This commit is contained in:
@@ -47,6 +47,7 @@ final class ShopProductsFinder implements ShopProductsFinderInterface
|
||||
if (!$selectedBuckets) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$facet = $this->facetRegistry->getFacetById($facetId);
|
||||
$boolQuery->addFilter($facet->getQuery($selectedBuckets));
|
||||
}
|
||||
|
||||
49
src/Form/Resolver/ProductsFilterFacetResolver.php
Normal file
49
src/Form/Resolver/ProductsFilterFacetResolver.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file was created by developers working at BitBag
|
||||
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
|
||||
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BitBag\SyliusElasticsearchPlugin\Form\Resolver;
|
||||
|
||||
use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
|
||||
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder\TaxonFacetsQueryBuilderInterface;
|
||||
use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
|
||||
final class ProductsFilterFacetResolver implements ProductsFilterFacetResolverInterface
|
||||
{
|
||||
private TaxonFacetsQueryBuilderInterface $queryBuilder;
|
||||
|
||||
private RegistryInterface $facetRegistry;
|
||||
|
||||
private PaginatedFinderInterface $finder;
|
||||
|
||||
public function __construct(
|
||||
TaxonFacetsQueryBuilderInterface $queryBuilder,
|
||||
RegistryInterface $facetRegistry,
|
||||
PaginatedFinderInterface $finder
|
||||
) {
|
||||
$this->queryBuilder = $queryBuilder;
|
||||
$this->facetRegistry = $facetRegistry;
|
||||
$this->finder = $finder;
|
||||
}
|
||||
|
||||
public function resolveFacets(FormEvent $event, string $namePropertyPrefix): Pagerfanta
|
||||
{
|
||||
$query = $this->queryBuilder->getQuery($event, $namePropertyPrefix);
|
||||
|
||||
foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
|
||||
$query->addAggregation($facet->getAggregation()->setName($facetId));
|
||||
}
|
||||
|
||||
$query->setSize(0);
|
||||
|
||||
return $this->finder->findPaginated($query);
|
||||
}
|
||||
}
|
||||
19
src/Form/Resolver/ProductsFilterFacetResolverInterface.php
Normal file
19
src/Form/Resolver/ProductsFilterFacetResolverInterface.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file was created by developers working at BitBag
|
||||
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
|
||||
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BitBag\SyliusElasticsearchPlugin\Form\Resolver;
|
||||
|
||||
use Pagerfanta\Pagerfanta;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
|
||||
interface ProductsFilterFacetResolverInterface
|
||||
{
|
||||
public function resolveFacets(FormEvent $event, string $namePropertyPrefix): Pagerfanta;
|
||||
}
|
||||
@@ -10,11 +10,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace BitBag\SyliusElasticsearchPlugin\Form\Type;
|
||||
|
||||
use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\DataHandlerInterface;
|
||||
use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
|
||||
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\QueryBuilderInterface;
|
||||
use Elastica\Query;
|
||||
use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
|
||||
use BitBag\SyliusElasticsearchPlugin\Form\Resolver\ProductsFilterFacetResolverInterface;
|
||||
use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter;
|
||||
use Pagerfanta\Adapter\AdapterInterface;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
@@ -25,33 +21,16 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
final class ShopProductsFilterType extends AbstractFilterType
|
||||
{
|
||||
/** @var string */
|
||||
private $namePropertyPrefix;
|
||||
private string $namePropertyPrefix;
|
||||
|
||||
/** @var PaginatedFinderInterface */
|
||||
private $finder;
|
||||
|
||||
/** @var RegistryInterface */
|
||||
private $facetRegistry;
|
||||
|
||||
/** @var QueryBuilderInterface */
|
||||
private $searchProductsQueryBuilder;
|
||||
|
||||
/** @var DataHandlerInterface */
|
||||
private $shopProductListDataHandler;
|
||||
private ProductsFilterFacetResolverInterface $facetResolver;
|
||||
|
||||
public function __construct(
|
||||
string $namePropertyPrefix,
|
||||
PaginatedFinderInterface $finder,
|
||||
RegistryInterface $facetRegistry,
|
||||
QueryBuilderInterface $searchProductsQueryBuilder,
|
||||
DataHandlerInterface $shopProductListDataHandler
|
||||
ProductsFilterFacetResolverInterface $facetResolver
|
||||
) {
|
||||
$this->namePropertyPrefix = $namePropertyPrefix;
|
||||
$this->finder = $finder;
|
||||
$this->facetRegistry = $facetRegistry;
|
||||
$this->searchProductsQueryBuilder = $searchProductsQueryBuilder;
|
||||
$this->shopProductListDataHandler = $shopProductListDataHandler;
|
||||
$this->facetResolver = $facetResolver;
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
@@ -63,7 +42,7 @@ final class ShopProductsFilterType extends AbstractFilterType
|
||||
->add('price', PriceFilterType::class, ['required' => false, 'label' => false])
|
||||
->setMethod('GET');
|
||||
|
||||
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'resolveFacets']);
|
||||
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'addFacets']);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
@@ -73,33 +52,13 @@ final class ShopProductsFilterType extends AbstractFilterType
|
||||
]);
|
||||
}
|
||||
|
||||
public function resolveFacets(FormEvent $event): void
|
||||
public function addFacets(FormEvent $event): void
|
||||
{
|
||||
$query = $this->getQuery($event);
|
||||
$facets = $this->facetResolver->resolveFacets($event, $this->namePropertyPrefix);
|
||||
|
||||
foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
|
||||
$query->addAggregation($facet->getAggregation()->setName($facetId));
|
||||
if ($facets->getAdapter()) {
|
||||
$this->modifyForm($event->getForm(), $facets->getAdapter());
|
||||
}
|
||||
|
||||
$query->setSize(0);
|
||||
|
||||
$results = $this->finder->findPaginated($query);
|
||||
|
||||
if ($results->getAdapter()) {
|
||||
$this->modifyForm($event->getForm(), $results->getAdapter());
|
||||
}
|
||||
}
|
||||
|
||||
private function getQuery(FormEvent $event): Query
|
||||
{
|
||||
$eventData = $event->getData();
|
||||
if (!isset($eventData[$this->namePropertyPrefix])) {
|
||||
$eventData[$this->namePropertyPrefix] = '';
|
||||
}
|
||||
|
||||
$data = $this->shopProductListDataHandler->retrieveData($eventData);
|
||||
|
||||
return new Query($this->searchProductsQueryBuilder->buildQuery($data));
|
||||
}
|
||||
|
||||
private function modifyForm(FormInterface $form, AdapterInterface $adapter): void
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file was created by developers working at BitBag
|
||||
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
|
||||
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder;
|
||||
|
||||
use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\DataHandlerInterface;
|
||||
use BitBag\SyliusElasticsearchPlugin\QueryBuilder\QueryBuilderInterface;
|
||||
use Elastica\Query;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
|
||||
final class TaxonFacetsQueryBuilder implements TaxonFacetsQueryBuilderInterface
|
||||
{
|
||||
private DataHandlerInterface $shopProductListDataHandler;
|
||||
|
||||
private QueryBuilderInterface $searchProductsQueryBuilder;
|
||||
|
||||
public function __construct(
|
||||
DataHandlerInterface $shopProductListDataHandler,
|
||||
QueryBuilderInterface $searchProductsQueryBuilder
|
||||
) {
|
||||
$this->shopProductListDataHandler = $shopProductListDataHandler;
|
||||
$this->searchProductsQueryBuilder = $searchProductsQueryBuilder;
|
||||
}
|
||||
|
||||
public function getQuery(FormEvent $event, string $namePropertyPrefix): Query
|
||||
{
|
||||
$eventData = $event->getData();
|
||||
if (!isset($eventData[$namePropertyPrefix])) {
|
||||
$eventData[$namePropertyPrefix] = '';
|
||||
}
|
||||
|
||||
$data = $this->shopProductListDataHandler->retrieveData($eventData);
|
||||
|
||||
return new Query($this->searchProductsQueryBuilder->buildQuery($data));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file was created by developers working at BitBag
|
||||
* Do you need more information about us and what we do? Visit our https://bitbag.io website!
|
||||
* We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder;
|
||||
|
||||
use Elastica\Query;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
|
||||
interface TaxonFacetsQueryBuilderInterface
|
||||
{
|
||||
public function getQuery(FormEvent $event, string $namePropertyPrefix): Query;
|
||||
}
|
||||
@@ -29,10 +29,7 @@
|
||||
|
||||
<service id="bitbag_sylius_elasticsearch_plugin.form.type.shop_products_filter" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ShopProductsFilterType">
|
||||
<argument>%bitbag_es_shop_name_property_prefix%</argument>
|
||||
<argument type="service" id="fos_elastica.finder.bitbag_shop_product" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.facet.taxon_registry" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.shop_products" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_product_list" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.form.resolver.facet_resolver" />
|
||||
<tag name="form.type" />
|
||||
</service>
|
||||
|
||||
@@ -71,5 +68,11 @@
|
||||
<service id="bitbag_sylius_elasticsearch_plugin.form.mapper.type.percent" class="BitBag\SyliusElasticsearchPlugin\Form\Type\ChoiceMapper\AttributesMapper\AttributesTypePercentMapper">
|
||||
<tag name="bitbag_sylius_elasticsearch_plugin.form.type.product_attributes_mapper" />
|
||||
</service>
|
||||
|
||||
<service id="bitbag_sylius_elasticsearch_plugin.form.resolver.facet_resolver" class="BitBag\SyliusElasticsearchPlugin\Form\Resolver\ProductsFilterFacetResolver">
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.facet.taxon_registry" />
|
||||
<argument type="service" id="fos_elastica.finder.bitbag_shop_product" />
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
||||
|
||||
@@ -89,11 +89,9 @@
|
||||
<argument>%bitbag_es_fuzziness%</argument>
|
||||
</service>
|
||||
|
||||
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\TaxonFacetsQueryBuilder">
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.is_enabled" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.has_channel" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.has_product_taxon" />
|
||||
<argument>%bitbag_es_fuzziness%</argument>
|
||||
<service id="bitbag_sylius_elasticsearch_plugin.query_builder.taxon_facets" class="BitBag\SyliusElasticsearchPlugin\QueryBuilder\FormQueryBuilder\TaxonFacetsQueryBuilder">
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.controller.request_data_handler.shop_product_list" />
|
||||
<argument type="service" id="bitbag_sylius_elasticsearch_plugin.query_builder.shop_products" />
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
||||
|
||||
Reference in New Issue
Block a user