Description
Preconditions and environment
- Magento version : 2.4.5-p12
- PHP 8.1.1
- MySQL
- ElasticSearch 7.11.2
Trying to add a custom data to the products index, but the custom field resolver is placed after the default one in the $items
property of the \Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver
, making it unusable.
Steps to reproduce
- Create a module that depends on
Magento_CatalogSearch
andMagento_Elasticsearch
(module.xml
) - Create a
etc/di.xml
file that adds a new product data (example below) and set thesortOrder
before thedefault
resolver:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="additionalFieldsProviderForElasticsearch" type="Magento\AdvancedSearch\Model\Adapter\DataMapper\AdditionalFieldsProvider">
<arguments>
<argument name="fieldsProviders" xsi:type="array">
<item name="customPrice" xsi:type="object" sortOrder="31">Vendor\Module\Model\Adapter\BatchDataMapper\CustomPriceProvider</item>
</argument>
</arguments>
</virtualType>
<type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\CompositeFieldProvider">
<arguments>
<argument name="providers" xsi:type="array">
<item name="custom_price_sort" xsi:type="object">Vendor\Module\Model\Elasticsearch\Adapter\FieldMapper\CustomPriceField</item>
</argument>
</arguments>
</type>
<type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
<arguments>
<argument name="items" xsi:type="array">
<item name="customPrice" xsi:type="object" sortOrder="31">Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice</item>
</argument>
</arguments>
</type>
</config>
- Create the customPrice provider and fieldname resolver classes
- Use the
\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\ResolverInterface
to get the field name in the Provider (example below):
/** @var \Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\AttributeProvider $this->attributeAdapterProvider */
$customPriceAttribute = $this->attributeAdapterProvider->getByAttributeCode('custom_price');
$customPriceFieldName = $this->fieldNameResolver->getFieldName(
$customPriceAttribute,
['customerGroupId' => $customerGroupId, 'websiteId' => $websiteId],
);
Expected result
- The
\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver::getFieldName
uses thecustomPrice
field name resolver - The
Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice
is used when called by the Provider.
Actual result
- The default field name resolver is used
Additional information
I also noticed thanks to xDebug that we enter the \Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver::__construct
5 times, the sort order is correct for each times except for the second entry.
Finally, I tried to declare the field name resolver in evey di.xml
declarations for modules elasticsaerch, elasticsearch5, elasticsearch6 and elasticsearch7 (see below) but it still doesn't work.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="additionalFieldsProviderForElasticsearch" type="Magento\AdvancedSearch\Model\Adapter\DataMapper\AdditionalFieldsProvider">
<arguments>
<argument name="fieldsProviders" xsi:type="array">
<item name="customPrice" xsi:type="object">Vendor\Module\Model\Adapter\BatchDataMapper\CustomPriceProvider</item>
</argument>
</arguments>
</virtualType>
<type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\CompositeFieldProvider">
<arguments>
<argument name="providers" xsi:type="array">
<item name="custom_price_sort" xsi:type="object">Vendor\Module\Model\Elasticsearch\Adapter\FieldMapper\CustomPriceField</item>
</argument>
</arguments>
</type>
<type name="Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
<arguments>
<argument name="items" xsi:type="array">
<item name="customPrice" xsi:type="object">Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice</item>
</argument>
</arguments>
</type>
<virtualType name="elasticsearch5FieldNameResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
<arguments>
<argument name="items" xsi:type="array">
<item name="customPrice" xsi:type="object" sortOrder="31">Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice</item>
</argument>
</arguments>
</virtualType>
<virtualType name="elasticsearch6FieldNameResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
<arguments>
<argument name="items" xsi:type="array">
<item name="customPrice" xsi:type="object" sortOrder="31">Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice</item>
</argument>
</arguments>
</virtualType>
<virtualType name="\Magento\Elasticsearch7\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver" type="\Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CompositeResolver">
<arguments>
<argument name="items" xsi:type="array">
<item name="customPrice" xsi:type="object" sortOrder="31">Vendor\Module\Model\Adapter\FieldMapper\Product\FieldProvider\FieldName\Resolver\CustomPrice</item>
</argument>
</arguments>
</virtualType>
</config>
Related to #32742 but this doesn't seem to work as expected.
Release note
No response
Triage and priority
- Severity: S0 - Affects critical data or functionality and leaves users without workaround.
- Severity: S1 - Affects critical data or functionality and forces users to employ a workaround.
- Severity: S2 - Affects non-critical data or functionality and forces users to employ a workaround.
- Severity: S3 - Affects non-critical data or functionality and does not force users to employ a workaround.
- Severity: S4 - Affects aesthetics, professional look and feel, “quality” or “usability”.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status