From c644177fe0edf08ff8b98e50705df365e4309223 Mon Sep 17 00:00:00 2001 From: Botis Date: Tue, 5 Oct 2021 19:18:29 +0200 Subject: [PATCH] #ESP-252 Add special attributes management * Add special attributes management * Add No value filter for boolean * Fix applying boolean filters on GraphQL --- .../Api/SpecialAttributeInterface.php | 53 ++++++++++ .../LayeredNavigation/Builder/Attribute.php | 16 ++- .../Attribute/SpecialAttributesProvider.php | 100 ++++++++++++++++++ .../Model/Layer/Filter/Boolean.php | 88 ++++++++++++--- .../Aggregation/SpecialAttribute.php | 66 ++++++++++++ .../Plugin/Search/RequestMapperPlugin.php | 84 ++++++++++++--- .../Modifier/Coverage.php | 28 +++-- .../etc/frontend/di.xml | 17 +-- .../etc/graphql/di.xml | 5 + 9 files changed, 412 insertions(+), 45 deletions(-) create mode 100644 src/module-elasticsuite-catalog/Api/SpecialAttributeInterface.php create mode 100644 src/module-elasticsuite-catalog/Model/Attribute/SpecialAttributesProvider.php create mode 100644 src/module-elasticsuite-catalog/Plugin/Search/Request/Product/Attribute/Aggregation/SpecialAttribute.php diff --git a/src/module-elasticsuite-catalog/Api/SpecialAttributeInterface.php b/src/module-elasticsuite-catalog/Api/SpecialAttributeInterface.php new file mode 100644 index 000000000..187e9a180 --- /dev/null +++ b/src/module-elasticsuite-catalog/Api/SpecialAttributeInterface.php @@ -0,0 +1,53 @@ + + * @copyright 2021 Smile + * @license Open Software License ("OSL") v. 3.0 + */ + +namespace Smile\ElasticsuiteCatalog\Api; + +/** + * SpecialAttributeInterface class. + * + * @category Smile + * @package Smile\ElasticsuiteCatalog + * @author Botis + */ +interface SpecialAttributeInterface +{ + /** + * Get attribute code. + * + * @return string + */ + public function getAttributeCode(): string; + + /** + * Get ES filter field. + * + * @return string + */ + public function getFilterField(): string; + + /** + * Get additional aggregation data. + * + * @return array + */ + public function getAdditionalAggregationData(): array; + + /** + * Skip attribute. + * + * @return bool + */ + public function skipAttribute(): bool; +} diff --git a/src/module-elasticsuite-catalog/GraphQl/DataProvider/Product/LayeredNavigation/Builder/Attribute.php b/src/module-elasticsuite-catalog/GraphQl/DataProvider/Product/LayeredNavigation/Builder/Attribute.php index 02d0d78f6..377d95160 100644 --- a/src/module-elasticsuite-catalog/GraphQl/DataProvider/Product/LayeredNavigation/Builder/Attribute.php +++ b/src/module-elasticsuite-catalog/GraphQl/DataProvider/Product/LayeredNavigation/Builder/Attribute.php @@ -18,6 +18,7 @@ use Magento\CatalogGraphQl\DataProvider\Product\LayeredNavigation\LayerBuilderInterface; use Magento\Framework\Api\Search\AggregationInterface; use Magento\Framework\Api\Search\BucketInterface; +use Smile\ElasticsuiteCatalog\Model\Attribute\SpecialAttributesProvider; use Smile\ElasticsuiteCore\Helper\Mapping; /** @@ -52,6 +53,11 @@ class Attribute // Not implementing the LayerBuilderInterface because it did not */ private $attributeRepository; + /** + * @var SpecialAttributesProvider + */ + protected $specialAttributesProvider; + /** * @var array */ @@ -61,19 +67,22 @@ class Attribute // Not implementing the LayerBuilderInterface because it did not ]; /** - * @param \Magento\Framework\ObjectManagerInterface $objectManager Object Manager - * @param AttributeRepository $attributeRepository Attribute Repository - * @param array $bucketNameFilter Bucket Filter + * @param \Magento\Framework\ObjectManagerInterface $objectManager Object Manager. + * @param AttributeRepository $attributeRepository Attribute Repository. + * @param SpecialAttributesProvider $specialAttributesProvider Special Attributes Provider. + * @param array $bucketNameFilter Bucket Filter. */ public function __construct( \Magento\Framework\ObjectManagerInterface $objectManager, AttributeRepository $attributeRepository, + SpecialAttributesProvider $specialAttributesProvider, $bucketNameFilter = [] ) { // Using Object Manager for BC with Magento <2.3.4. $this->layerFormatter = $objectManager->get(LayerFormatter::class); $this->bucketNameFilter = \array_merge($this->bucketNameFilter, $bucketNameFilter); $this->attributeRepository = $attributeRepository; + $this->specialAttributesProvider = $specialAttributesProvider; } /** @@ -92,6 +101,7 @@ public function build(AggregationInterface $aggregation, ?int $storeId): array if (substr($bucketName, 0, strlen($prefix)) === $prefix) { $attributeCode = substr($bucketName, strlen($prefix)); } + $attributeCode = $this->specialAttributesProvider->getSpecialAttributeByFilterField($bucketName) ?? $attributeCode; $label = $attributeCode; try { diff --git a/src/module-elasticsuite-catalog/Model/Attribute/SpecialAttributesProvider.php b/src/module-elasticsuite-catalog/Model/Attribute/SpecialAttributesProvider.php new file mode 100644 index 000000000..021ff4c27 --- /dev/null +++ b/src/module-elasticsuite-catalog/Model/Attribute/SpecialAttributesProvider.php @@ -0,0 +1,100 @@ + + * @copyright 2021 Smile + * @license Open Software License ("OSL") v. 3.0 + */ +namespace Smile\ElasticsuiteCatalog\Model\Attribute; + +use Smile\ElasticsuiteCatalog\Api\SpecialAttributeInterface; + +/** + * Special Attributes Provider. + * + * @category Smile + * @package Smile\ElasticsuiteCatalog + * @author Botis + */ +class SpecialAttributesProvider +{ + /** + * @var SpecialAttributeInterface[] + */ + protected $attributes = []; + + /** + * SpecialAttributesProvider constructor. + * + * @param SpecialAttributeInterface[] $attributes Attributes. + */ + public function __construct($attributes = []) + { + $this->attributes = $attributes; + } + + /** + * Get special attributes list. + * + * @return SpecialAttributeInterface[] + */ + public function getList(): array + { + $attributes = []; + foreach ($this->attributes as $attribute) { + if (!$attribute->skipAttribute()) { + $attributes[$attribute->getAttributeCode()] = $attribute; + } + } + + return $attributes; + } + + /** + * Get special attribute. + * + * @param string $attributeCode Attribute code. + * + * @return SpecialAttributeInterface|null + */ + public function getSpecialAttribute(string $attributeCode): ?SpecialAttributeInterface + { + return $this->getList()[$attributeCode] ?? null; + } + + /** + * Get special attribute. + * + * @param string $filterField Filter field. + * + * @return string|null + */ + public function getSpecialAttributeByFilterField(string $filterField): ?string + { + foreach ($this->getList() as $attribute) { + if ($attribute->getFilterField() === $filterField) { + return $attribute->getAttributeCode(); + } + } + + return null; + } + + /** + * Check if attribute is special. + * + * @param string $attributeCode Attribute code. + * + * @return bool + */ + public function isSpecialAttribute(string $attributeCode): bool + { + return isset($this->getList()[$attributeCode]); + } +} diff --git a/src/module-elasticsuite-catalog/Model/Layer/Filter/Boolean.php b/src/module-elasticsuite-catalog/Model/Layer/Filter/Boolean.php index f117483e1..57db09d6e 100644 --- a/src/module-elasticsuite-catalog/Model/Layer/Filter/Boolean.php +++ b/src/module-elasticsuite-catalog/Model/Layer/Filter/Boolean.php @@ -13,6 +13,16 @@ */ namespace Smile\ElasticsuiteCatalog\Model\Layer\Filter; +use Magento\Catalog\Model\Layer; +use Magento\Catalog\Model\Layer\Filter\Item\DataBuilder; +use Magento\Catalog\Model\Layer\Filter\ItemFactory; +use Magento\Framework\Escaper; +use Magento\Framework\Filter\StripTags; +use Magento\Store\Model\StoreManagerInterface; +use Smile\ElasticsuiteCatalog\Api\SpecialAttributeInterface; +use Smile\ElasticsuiteCatalog\Helper\ProductAttribute; +use Smile\ElasticsuiteCatalog\Model\Attribute\SpecialAttributesProvider; + /** * Product boolean filter implementation. * @@ -22,35 +32,80 @@ */ class Boolean extends Attribute { + /** + * @var SpecialAttributesProvider + */ + protected $specialAttributesProvider; + + /** + * Boolean Constructor. + * + * @param ItemFactory $filterItemFactory Factory for item of the facets. + * @param StoreManagerInterface $storeManager Store manager. + * @param Layer $layer Catalog product layer. + * @param DataBuilder $itemDataBuilder Item data builder. + * @param StripTags $tagFilter String HTML tags filter. + * @param Escaper $escaper Html Escaper. + * @param ProductAttribute $mappingHelper Mapping helper. + * @param SpecialAttributesProvider $specialAttributesProvider Special Attributes Provider. + * @param array $data Custom data. + */ + public function __construct( + ItemFactory $filterItemFactory, + StoreManagerInterface $storeManager, + Layer $layer, + DataBuilder $itemDataBuilder, + StripTags $tagFilter, + Escaper $escaper, + ProductAttribute $mappingHelper, + SpecialAttributesProvider $specialAttributesProvider, + array $data = [] + ) { + parent::__construct( + $filterItemFactory, + $storeManager, + $layer, + $itemDataBuilder, + $tagFilter, + $escaper, + $mappingHelper, + $data + ); + + $this->specialAttributesProvider = $specialAttributesProvider; + } + /** * {@inheritDoc} */ public function apply(\Magento\Framework\App\RequestInterface $request) { - $attributeValue = (bool) $request->getParam($this->_requestVar); + $attributeValue = $request->getParam($this->_requestVar); - if (!empty($attributeValue)) { + if ($attributeValue !== null) { if (!is_array($attributeValue)) { $attributeValue = [$attributeValue]; } - $this->currentFilterValue = $attributeValue; + $attributeValue = array_map(function ($value) { + return (bool) $value; + }, $attributeValue); + /** @var \Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection $productCollection */ $productCollection = $this->getLayer()->getProductCollection(); $productCollection->addFieldToFilter($this->getFilterField(), $attributeValue); $layerState = $this->getLayer()->getState(); - $booleanFilterLabels = []; foreach ($this->currentFilterValue as $currentFilter) { - $booleanFilterLabels[] = (string) $this->getAttributeModel()->getSource()->getOptionText((int) $currentFilter); + $filter = $this->_createItem( + $this->getAttributeModel()->getSource()->getOptionText((int) $currentFilter), + $this->currentFilterValue + ); + $filter->setRawValue($currentFilter); + $layerState->addFilter($filter); } - $filterLabel = implode(', ', $booleanFilterLabels); - - $filter = $this->_createItem($filterLabel, $this->currentFilterValue); - - $layerState->addFilter($filter); } return $this; @@ -69,7 +124,14 @@ public function hasMoreItems() */ protected function getFilterField() { - return $this->getAttributeModel()->getAttributeCode(); + $field = $this->getAttributeModel()->getAttributeCode(); + + $specialAttribute = $this->specialAttributesProvider->getSpecialAttribute($field); + if ($specialAttribute instanceof SpecialAttributeInterface) { + $field = $specialAttribute->getFilterField(); + } + + return $field; } /** @@ -85,7 +147,9 @@ protected function _initItems() foreach ($this->_items as $item) { $applyValue = $item->getLabel(); - if ($item->getValue() == \Magento\Eav\Model\Entity\Attribute\Source\Boolean::VALUE_YES) { + if ($item->getValue() == \Magento\Eav\Model\Entity\Attribute\Source\Boolean::VALUE_YES + || $item->getValue() == \Magento\Eav\Model\Entity\Attribute\Source\Boolean::VALUE_NO + ) { if (is_numeric($item->getLabel())) { $label = $this->getAttributeModel()->getSource()->getOptionText((int) $item->getLabel()); $item->setLabel((string) $label); diff --git a/src/module-elasticsuite-catalog/Plugin/Search/Request/Product/Attribute/Aggregation/SpecialAttribute.php b/src/module-elasticsuite-catalog/Plugin/Search/Request/Product/Attribute/Aggregation/SpecialAttribute.php new file mode 100644 index 000000000..6499b21bc --- /dev/null +++ b/src/module-elasticsuite-catalog/Plugin/Search/Request/Product/Attribute/Aggregation/SpecialAttribute.php @@ -0,0 +1,66 @@ + + * @copyright 2021 Smile + * @license Open Software License ("OSL") v. 3.0 + */ +namespace Smile\ElasticsuiteCAtalog\Plugin\Search\Request\Product\Attribute\Aggregation; + +use Magento\Catalog\Model\ResourceModel\Eav\Attribute; +use Smile\ElasticsuiteCatalog\Api\SpecialAttributeInterface; +use Smile\ElasticsuiteCatalog\Search\Request\Product\Attribute\AggregationInterface; +use Smile\ElasticsuiteCatalog\Model\Attribute\SpecialAttributesProvider; + +/** + * Class SpecialAttribute. + * + * @category Smile + * @package Smile\ElasticsuiteCatalog + * @author Botis + */ +class SpecialAttribute +{ + /** + * @var SpecialAttributesProvider + */ + private $specialAttributesProvider; + + /** + * SpecialAttribute Constructor. + * + * @param SpecialAttributesProvider $specialAttributesProvider Special Attributes Provider. + */ + public function __construct( + SpecialAttributesProvider $specialAttributesProvider + ) { + $this->specialAttributesProvider = $specialAttributesProvider; + } + + /** + * Replace filter field value for special attributes. + * + * @param AggregationInterface $subject Plugin subject. + * @param array $result Result. + * @param Attribute $attribute Attribute. + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @return array + */ + public function afterGetAggregationData(AggregationInterface $subject, array $result, Attribute $attribute): array + { + $specialAttribute = $this->specialAttributesProvider->getSpecialAttribute($attribute->getAttributeCode()); + if ($specialAttribute instanceof SpecialAttributeInterface) { + $result['name'] = $specialAttribute->getFilterField(); + $result = array_merge($result, $specialAttribute->getAdditionalAggregationData()); + } + + return $result; + } +} diff --git a/src/module-elasticsuite-catalog/Plugin/Search/RequestMapperPlugin.php b/src/module-elasticsuite-catalog/Plugin/Search/RequestMapperPlugin.php index 4f1daa6dc..3f0503958 100644 --- a/src/module-elasticsuite-catalog/Plugin/Search/RequestMapperPlugin.php +++ b/src/module-elasticsuite-catalog/Plugin/Search/RequestMapperPlugin.php @@ -14,6 +14,8 @@ namespace Smile\ElasticsuiteCatalog\Plugin\Search; use Magento\Framework\Api\Search\SearchCriteriaInterface; +use Smile\ElasticsuiteCatalog\Api\SpecialAttributeInterface; +use Smile\ElasticsuiteCatalog\Model\Attribute\SpecialAttributesProvider; use Smile\ElasticsuiteCatalog\Model\Search\Request\Field\Mapper as RequestFieldMapper; use Smile\ElasticsuiteCore\Api\Search\Request\ContainerConfigurationInterface; use Smile\ElasticsuiteCore\Model\Search\RequestMapper; @@ -22,6 +24,8 @@ /** * Apply catalog product settings to the search API request mapper. * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * * @category Smile * @package Smile\ElasticsuiteCatalog * @author Aurelien FOUCRET @@ -66,15 +70,21 @@ class RequestMapperPlugin */ private $requestFieldMapper; + /** + * @var SpecialAttributesProvider + */ + protected $specialAttributesProvider; + /** * Constructor. * - * @param \Magento\Customer\Model\Session $customerSession Customer session. - * @param \Magento\Store\Model\StoreManagerInterface $storeManager Store manager. - * @param \Smile\ElasticsuiteCore\Helper\Mapping $mappingHelper Mapping helper. - * @param \Smile\ElasticsuiteCore\Api\Search\ContextInterface $searchContext Search context. - * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository Category Repository. - * @param RequestFieldMapper $requestFieldMapper Search request field mapper. + * @param \Magento\Customer\Model\Session $customerSession Customer session. + * @param \Magento\Store\Model\StoreManagerInterface $storeManager Store manager. + * @param \Smile\ElasticsuiteCore\Helper\Mapping $mappingHelper Mapping helper. + * @param \Smile\ElasticsuiteCore\Api\Search\ContextInterface $searchContext Search context. + * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository Category Repository. + * @param RequestFieldMapper $requestFieldMapper Search request field mapper. + * @param SpecialAttributesProvider $specialAttributesProvider Special Attributes Provider. */ public function __construct( \Magento\Customer\Model\Session $customerSession, @@ -82,14 +92,16 @@ public function __construct( \Smile\ElasticsuiteCore\Helper\Mapping $mappingHelper, \Smile\ElasticsuiteCore\Api\Search\ContextInterface $searchContext, \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository, - RequestFieldMapper $requestFieldMapper + RequestFieldMapper $requestFieldMapper, + SpecialAttributesProvider $specialAttributesProvider ) { - $this->customerSession = $customerSession; - $this->storeManager = $storeManager; - $this->mappingHelper = $mappingHelper; - $this->searchContext = $searchContext; - $this->categoryRepository = $categoryRepository; - $this->requestFieldMapper = $requestFieldMapper; + $this->customerSession = $customerSession; + $this->storeManager = $storeManager; + $this->mappingHelper = $mappingHelper; + $this->searchContext = $searchContext; + $this->categoryRepository = $categoryRepository; + $this->requestFieldMapper = $requestFieldMapper; + $this->specialAttributesProvider = $specialAttributesProvider; } /** @@ -154,7 +166,7 @@ public function afterGetFilters( foreach ($result as $fieldName => $filterValue) { $fieldName = $this->getMappingField($containerConfiguration, $fieldName); - $filters[$fieldName] = $filterValue; + $filters[$fieldName] = $this->getFieldValue($containerConfiguration, $fieldName, $filterValue); } $result = $filters; @@ -210,10 +222,23 @@ private function getMappingField(ContainerConfigurationInterface $containerConfi { $fieldName = $this->requestFieldMapper->getMappedFieldName($fieldName); + $specialAttribute = $this->specialAttributesProvider->getSpecialAttribute($fieldName); + if ($specialAttribute instanceof SpecialAttributeInterface) { + return $specialAttribute->getFilterField(); + } + try { - $optionTextFieldName = $this->mappingHelper->getOptionTextFieldName($fieldName); - $containerConfiguration->getMapping()->getField($optionTextFieldName); - $fieldName = $optionTextFieldName; + $field = $containerConfiguration->getMapping()->getField($fieldName); + } catch (\Exception $e) { + $field = null; + } + + try { + if ($field === null || $field->getType() != 'boolean') { + $optionTextFieldName = $this->mappingHelper->getOptionTextFieldName($fieldName); + $containerConfiguration->getMapping()->getField($optionTextFieldName); + $fieldName = $optionTextFieldName; + } } catch (\Exception $e) { ; } @@ -221,6 +246,31 @@ private function getMappingField(ContainerConfigurationInterface $containerConfi return $fieldName; } + /** + * Get field value in the proper type. + * + * @param ContainerConfigurationInterface $containerConfiguration Container configuration. + * @param string $fieldName Field name. + * @param mixed $fieldValue Field value. + * + * @return mixed + */ + private function getFieldValue(ContainerConfigurationInterface $containerConfiguration, string $fieldName, $fieldValue) + { + try { + $field = $containerConfiguration->getMapping()->getField($fieldName); + if ($field->getType() === 'boolean' && is_array($fieldValue)) { + foreach ($fieldValue as &$value) { + $value = (bool) $value; + } + } + } catch (\Exception $e) { + ; + } + + return $fieldValue; + } + /** * Return current category id for the search request. * diff --git a/src/module-elasticsuite-catalog/Search/Request/Product/Aggregation/Provider/FilterableAttributes/Modifier/Coverage.php b/src/module-elasticsuite-catalog/Search/Request/Product/Aggregation/Provider/FilterableAttributes/Modifier/Coverage.php index 0363c1a6f..fe286e1f0 100644 --- a/src/module-elasticsuite-catalog/Search/Request/Product/Aggregation/Provider/FilterableAttributes/Modifier/Coverage.php +++ b/src/module-elasticsuite-catalog/Search/Request/Product/Aggregation/Provider/FilterableAttributes/Modifier/Coverage.php @@ -14,8 +14,10 @@ namespace Smile\ElasticsuiteCatalog\Search\Request\Product\Aggregation\Provider\FilterableAttributes\Modifier; use Smile\ElasticsuiteCatalog\Model\Attribute\Source\FilterDisplayMode; +use Smile\ElasticsuiteCatalog\Model\Attribute\SpecialAttributesProvider; use Smile\ElasticsuiteCatalog\Search\Request\Product\Aggregation\Provider\FilterableAttributes\ModifierInterface; use Smile\ElasticsuiteCatalog\Search\Request\Product\Coverage\ProviderFactory as CoverageProviderFactory; +use Smile\ElasticsuiteCore\Search\Request\Builder as SearchRequestBuilder; /** * Coverage Modifier for filterable attributes provider. @@ -36,18 +38,26 @@ class Coverage implements ModifierInterface */ private $coverageProviderFactory; + /** + * @var SpecialAttributesProvider + */ + protected $specialAttributesProvider; + /** * Coverage constructor. * - * @param \Smile\ElasticsuiteCore\Search\Request\Builder $coverageRequestBuilder Coverage Request builder. - * @param \Smile\ElasticsuiteCatalog\Search\Request\Product\Coverage\ProviderFactory $coverageProviderFactory Coverage provider factory. + * @param SearchRequestBuilder $coverageRequestBuilder Coverage Request builder. + * @param CoverageProviderFactory $coverageProviderFactory Coverage provider factory. + * @param SpecialAttributesProvider $specialAttributesProvider Special Attributes Provider. */ public function __construct( - \Smile\ElasticsuiteCore\Search\Request\Builder $coverageRequestBuilder, - CoverageProviderFactory $coverageProviderFactory + SearchRequestBuilder $coverageRequestBuilder, + CoverageProviderFactory $coverageProviderFactory, + SpecialAttributesProvider $specialAttributesProvider ) { - $this->coverageRequestBuilder = $coverageRequestBuilder; - $this->coverageProviderFactory = $coverageProviderFactory; + $this->coverageRequestBuilder = $coverageRequestBuilder; + $this->coverageProviderFactory = $coverageProviderFactory; + $this->specialAttributesProvider = $specialAttributesProvider; } /** @@ -68,7 +78,11 @@ public function modifyAttributes($storeId, $requestName, $attributes, $query, $f $attributeCode = $attribute->getAttributeCode(); $minCoverageRate = $attribute->getFacetMinCoverageRate(); - $isRelevant = isset($coverageRates[$attributeCode]) && ($coverageRates[$attributeCode] >= $minCoverageRate); + $isRelevant = true; + if (!$this->specialAttributesProvider->isSpecialAttribute($attributeCode)) { + $isRelevant = isset($coverageRates[$attributeCode]) && ($coverageRates[$attributeCode] >= $minCoverageRate); + } + $forceDisplay = $attribute->getFacetDisplayMode() == FilterDisplayMode::ALWAYS_DISPLAYED; $isHidden = $attribute->getFacetDisplayMode() == FilterDisplayMode::ALWAYS_HIDDEN; diff --git a/src/module-elasticsuite-catalog/etc/frontend/di.xml b/src/module-elasticsuite-catalog/etc/frontend/di.xml index bc24af3f6..acc86fb6b 100644 --- a/src/module-elasticsuite-catalog/etc/frontend/di.xml +++ b/src/module-elasticsuite-catalog/etc/frontend/di.xml @@ -101,14 +101,14 @@ searchFilterList - + categoryFilterList searchFilterList - - + + @@ -120,13 +120,13 @@ - + catalog_product_autocomplete - + Smile\ElasticsuiteCatalog\Model\Autocomplete\Product\Collection @@ -183,7 +183,7 @@ - + Smile\ElasticsuiteCatalog\Helper\ProductAttribute @@ -231,4 +231,9 @@ + + + + diff --git a/src/module-elasticsuite-catalog/etc/graphql/di.xml b/src/module-elasticsuite-catalog/etc/graphql/di.xml index cbd11af2d..576798d7f 100644 --- a/src/module-elasticsuite-catalog/etc/graphql/di.xml +++ b/src/module-elasticsuite-catalog/etc/graphql/di.xml @@ -138,4 +138,9 @@ + + + +