From 154e9889cd61fee6db2d3c972dae2224496bacf7 Mon Sep 17 00:00:00 2001 From: bitbager Date: Sat, 21 Sep 2019 18:26:08 +0200 Subject: [PATCH] Add taxon position sorting and make it default --- .../ShopProductsSortDataHandlerSpec.php | 20 ++++++++-- .../ShopProductsSortDataHandler.php | 23 +++++++++++- ...roductMainTaxonPositionPropertyBuilder.php | 37 +++++++++++++++++++ src/Refresher/ResourceRefresherInterface.php | 4 +- .../config/indexes/bitbag_shop_products.yml | 1 + src/Resources/config/services/controller.xml | 2 + .../config/services/property_builder.xml | 5 +++ .../services/property_name_resolver.xml | 4 ++ 8 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 src/PropertyBuilder/ProductMainTaxonPositionPropertyBuilder.php diff --git a/spec/Controller/RequestDataHandler/ShopProductsSortDataHandlerSpec.php b/spec/Controller/RequestDataHandler/ShopProductsSortDataHandlerSpec.php index d717d50c..23ddeecf 100644 --- a/spec/Controller/RequestDataHandler/ShopProductsSortDataHandlerSpec.php +++ b/spec/Controller/RequestDataHandler/ShopProductsSortDataHandlerSpec.php @@ -12,21 +12,27 @@ namespace spec\BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler; +use BitBag\SyliusElasticsearchPlugin\Context\TaxonContextInterface; use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\ShopProductsSortDataHandler; use BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler\SortDataHandlerInterface; use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolverInterface; use PhpSpec\ObjectBehavior; use Sylius\Component\Channel\Context\ChannelContextInterface; +use Sylius\Component\Core\Model\TaxonInterface; final class ShopProductsSortDataHandlerSpec extends ObjectBehavior { function let( ConcatedNameResolverInterface $channelPricingNameResolver, - ChannelContextInterface $channelContext + ChannelContextInterface $channelContext, + TaxonContextInterface $taxonContext, + ConcatedNameResolverInterface $taxonPositionNameResolver ): void { $this->beConstructedWith( $channelPricingNameResolver, $channelContext, + $taxonContext, + $taxonPositionNameResolver, 'sold_units', 'created_at', 'price' @@ -43,11 +49,19 @@ function it_implements_sort_data_handler_interface(): void $this->shouldHaveType(SortDataHandlerInterface::class); } - function it_retrieves_data(): void + function it_retrieves_data( + TaxonContextInterface $taxonContext, + TaxonInterface $taxon, + ConcatedNameResolverInterface $taxonPositionNameResolver + ): void { + $taxonContext->getTaxon()->willReturn($taxon); + $taxon->getCode()->willReturn('t_shirt'); + $taxonPositionNameResolver->resolvePropertyName('t_shirt')->willReturn('t_shirt_position'); + $this->retrieveData([])->shouldBeEqualTo([ 'sort' => [ - 'sold_units' => [ + 't_shirt_position' => [ 'order' => SortDataHandlerInterface::SORT_DESC_INDEX, ], ], diff --git a/src/Controller/RequestDataHandler/ShopProductsSortDataHandler.php b/src/Controller/RequestDataHandler/ShopProductsSortDataHandler.php index 9eca0cf2..22d59f03 100644 --- a/src/Controller/RequestDataHandler/ShopProductsSortDataHandler.php +++ b/src/Controller/RequestDataHandler/ShopProductsSortDataHandler.php @@ -12,6 +12,7 @@ namespace BitBag\SyliusElasticsearchPlugin\Controller\RequestDataHandler; +use BitBag\SyliusElasticsearchPlugin\Context\TaxonContextInterface; use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolverInterface; use Sylius\Component\Channel\Context\ChannelContextInterface; @@ -23,6 +24,12 @@ final class ShopProductsSortDataHandler implements SortDataHandlerInterface /** @var ChannelContextInterface */ private $channelContext; + /** @var TaxonContextInterface */ + private $taxonContext; + + /** @var ConcatedNameResolverInterface */ + private $taxonPositionNameResolver; + /** @var string */ private $soldUnitsProperty; @@ -35,12 +42,16 @@ final class ShopProductsSortDataHandler implements SortDataHandlerInterface public function __construct( ConcatedNameResolverInterface $channelPricingNameResolver, ChannelContextInterface $channelContext, + TaxonContextInterface $taxonContext, + ConcatedNameResolverInterface $taxonPositionNameResolver, string $soldUnitsProperty, string $createdAtProperty, string $pricePropertyPrefix ) { $this->channelPricingNameResolver = $channelPricingNameResolver; $this->channelContext = $channelContext; + $this->taxonContext = $taxonContext; + $this->taxonPositionNameResolver = $taxonPositionNameResolver; $this->soldUnitsProperty = $soldUnitsProperty; $this->createdAtProperty = $createdAtProperty; $this->pricePropertyPrefix = $pricePropertyPrefix; @@ -49,11 +60,12 @@ public function __construct( public function retrieveData(array $requestData): array { $data = []; + $positionSortingProperty = $this->getPositionSortingProperty(); - $orderBy = isset($requestData[self::ORDER_BY_INDEX]) ? $requestData[self::ORDER_BY_INDEX] : $this->soldUnitsProperty; + $orderBy = isset($requestData[self::ORDER_BY_INDEX]) ? $requestData[self::ORDER_BY_INDEX] : $positionSortingProperty; $sort = isset($requestData[self::SORT_INDEX]) ? $requestData[self::SORT_INDEX] : self::SORT_DESC_INDEX; - $availableSorters = [$this->soldUnitsProperty, $this->createdAtProperty, $this->pricePropertyPrefix]; + $availableSorters = [$positionSortingProperty, $this->soldUnitsProperty, $this->createdAtProperty, $this->pricePropertyPrefix]; $availableSorting = [self::SORT_ASC_INDEX, self::SORT_DESC_INDEX]; if (!in_array($orderBy, $availableSorters) || !in_array($sort, $availableSorting)) { @@ -69,4 +81,11 @@ public function retrieveData(array $requestData): array return $data; } + + private function getPositionSortingProperty(): string + { + $taxonCode = $this->taxonContext->getTaxon()->getCode(); + + return $this->taxonPositionNameResolver->resolvePropertyName($taxonCode); + } } diff --git a/src/PropertyBuilder/ProductMainTaxonPositionPropertyBuilder.php b/src/PropertyBuilder/ProductMainTaxonPositionPropertyBuilder.php new file mode 100644 index 00000000..96e47306 --- /dev/null +++ b/src/PropertyBuilder/ProductMainTaxonPositionPropertyBuilder.php @@ -0,0 +1,37 @@ +taxonPositionNameResolver = $taxonPositionNameResolver; + } + + public function consumeEvent(TransformEvent $event): void + { + $this->buildProperty($event, ProductInterface::class, + function (ProductInterface $product, Document $document): void { + $mainTaxon = $product->getMainTaxon(); + + if (null === $mainTaxon) { + return; + } + + $document->set( + $this->taxonPositionNameResolver->resolvePropertyName($mainTaxon->getCode()), + $mainTaxon->getPosition() + ); + } + ); + } +} diff --git a/src/Refresher/ResourceRefresherInterface.php b/src/Refresher/ResourceRefresherInterface.php index 5e6f034a..03231d33 100644 --- a/src/Refresher/ResourceRefresherInterface.php +++ b/src/Refresher/ResourceRefresherInterface.php @@ -1,7 +1,5 @@ + + %bitbag_es_shop_product_sold_units% %bitbag_es_shop_product_created_at% %bitbag_es_shop_product_price_property_prefix% diff --git a/src/Resources/config/services/property_builder.xml b/src/Resources/config/services/property_builder.xml index 267acbf1..136ade29 100644 --- a/src/Resources/config/services/property_builder.xml +++ b/src/Resources/config/services/property_builder.xml @@ -68,6 +68,11 @@ + + + + + diff --git a/src/Resources/config/services/property_name_resolver.xml b/src/Resources/config/services/property_name_resolver.xml index f9e2e8cf..fe84ebba 100644 --- a/src/Resources/config/services/property_name_resolver.xml +++ b/src/Resources/config/services/property_name_resolver.xml @@ -21,5 +21,9 @@ %bitbag_es_shop_product_price_property_prefix% + + + %bitbag_es_shop_taxon_position_property_prefix% +