From e247b0517d4e5652ed8fa58beeeb397b7166f01e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 5 Feb 2026 17:14:46 +0100 Subject: [PATCH 01/11] Added doc for variant querying --- .../src/Command/ProductVariantCommand.php | 40 +++++++++++++++++-- docs/pim/product_api.md | 29 ++++++++++---- .../product_search_criteria.md | 5 ++- .../product_sort_clauses.md | 5 ++- phpstan-baseline.neon | 12 ++++++ 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php b/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php index 3b685a7fc4..6327f0cf9b 100644 --- a/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php +++ b/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php @@ -9,7 +9,9 @@ use Ibexa\Contracts\ProductCatalog\Local\LocalProductServiceInterface; use Ibexa\Contracts\ProductCatalog\Local\Values\Product\ProductVariantCreateStruct; use Ibexa\Contracts\ProductCatalog\ProductServiceInterface; +use Ibexa\Contracts\ProductCatalog\Values\Content\Query\Criterion\ProductCriterionAdapter; use Ibexa\Contracts\ProductCatalog\Values\Product\ProductVariantQuery; +use Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -46,12 +48,24 @@ protected function execute(InputInterface $input, OutputInterface $output): int $productCode = $input->getArgument('productCode'); $product = $this->productService->getProduct($productCode); - // Get variants - $variantQuery = new ProductVariantQuery(0, 5); + // Get variants filtered by variant codes + $codeQuery = new ProductVariantQuery(); + $codeQuery->setVariantCodes(['DESK1', 'DESK2']); + $specificVariants = $this->productService->findProductVariants($product, $codeQuery)->getVariants(); - $variants = $this->productService->findProductVariants($product, $variantQuery)->getVariants(); + // Get variants with specific attributes + $combinedQuery = new ProductVariantQuery(); + $combinedQuery->setAttributesCriterion( + new ProductCriterionAdapter( + new Criterion\LogicalAnd([ + new Criterion\ColorAttribute('color', ['red', 'blue']), + new Criterion\IntegerAttribute('size', 42), + ]) + ) + ); + $filteredVariants = $this->productService->findProductVariants($product, $combinedQuery)->getVariants(); - foreach ($variants as $variant) { + foreach ($specificVariants as $variant) { $output->writeln($variant->getName()); $attributes = $variant->getDiscriminatorAttributes(); foreach ($attributes as $attribute) { @@ -67,6 +81,24 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->localProductService->createProductVariants($product, $variantCreateStructs); + // Search variants across all products + $query = new ProductVariantQuery(); + $query->setVariantCodes(['DESK1', 'DESK2']); + $variantList = $this->productService->findVariants($query); + + foreach ($variantList->getVariants() as $variant) { + $output->writeln($variant->getName()); + } + + // Search variants with attribute criterion + $colorQuery = new ProductVariantQuery(); + $colorQuery->setAttributesCriterion( + new ProductCriterionAdapter( + new Criterion\ColorAttribute('color', ['red']) + ) + ); + $redVariants = $this->productService->findVariants($colorQuery); + return self::SUCCESS; } } diff --git a/docs/pim/product_api.md b/docs/pim/product_api.md index dad5a2e096..fb8f5b81ff 100644 --- a/docs/pim/product_api.md +++ b/docs/pim/product_api.md @@ -58,20 +58,35 @@ To delete a product, use `LocalProductServiceInterface::deleteProduct()`: ### Product variants -You can access the variants of a product by using `ProductServiceInterface::findProductVariants()`. +You can access the variants of a product by using [`ProductServiceInterface::findProductVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findProductVariants). The method takes the product object and a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object as parameters. -A `ProductVariantQuery` lets you define the offset and limit of the variant query. -The default offset is 0, and limit is 25. +You can filter variants by variant codes or use product criteria: ``` php -[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 49, 52) =]] +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 50, 66) =]] ``` -From a variant ([`ProductVariantInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-ProductVariantInterface.html)), you can access the attributes that are used to generate the variant by using `ProductVariantInterface::getDiscriminatorAttributes()`. +From a variant ([`ProductVariantInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-ProductVariantInterface.html)), you can access the attributes that are used to generate the variant by using [`ProductVariantInterface::getDiscriminatorAttributes()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-ProductVariantInterface.html#method_getDiscriminatorAttributes). ``` php -[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 53, 60) =]] +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 69, 73) =]] +``` + +See [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) references for more information about how to use the [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) class. + +#### Searching variants across products + +To search for variants across all products, use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) +This method takes a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object and returns variants regardless of their base product. + +Unlike `findProductVariants()`, which requires a specific product object, `findVariants()` allows you to search the entire variant catalog. + +You can filter variants using Product Criteria wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). +For example, search for variants with specific product codes or attribute values: + +``` php +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 83, 100) =]] ``` #### Creating variants @@ -81,7 +96,7 @@ This method takes the product and an array of [`ProductVariantCreateStruct`](/ap `ProductVariantCreateStruct` specifies the attribute values and the code for the new variant. ``` php -[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 62, 68) =]] +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 85, 91) =]] ``` ### Product assets diff --git a/docs/search/criteria_reference/product_search_criteria.md b/docs/search/criteria_reference/product_search_criteria.md index 35a3948ac3..907c5a0e4f 100644 --- a/docs/search/criteria_reference/product_search_criteria.md +++ b/docs/search/criteria_reference/product_search_criteria.md @@ -5,10 +5,13 @@ page_type: reference # Product Search Criteria reference -Product Search Criteria are only supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). +Product Search Criteria are supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). Search Criterion let you filter product by specific attributes, for example, color, availability, or price. +Product Search Criteria can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) +. See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. + ## Product Search Criteria |Search Criterion|Search based on| diff --git a/docs/search/sort_clause_reference/product_sort_clauses.md b/docs/search/sort_clause_reference/product_sort_clauses.md index 77aebe252b..1e3e1ce3d6 100644 --- a/docs/search/sort_clause_reference/product_sort_clauses.md +++ b/docs/search/sort_clause_reference/product_sort_clauses.md @@ -5,10 +5,13 @@ page_type: reference # Product Sort Clauses -Product Sort Clauses are only supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). +Product Sort Clauses are supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). By using Sort Clause you can filter product by specific attributes, for example: price, code, or availability. +Product Sort Clauses can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) +. See the [product variant search examples](../../pim/product_api.md#searching-variants-across-products) for more information. + | Sort Clause | Sorting based on | |-----|-----| |[BasePrice](baseprice_sort_clause.md)|Base product price| diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index f0376d016f..15279505d8 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -42,6 +42,18 @@ parameters: count: 1 path: code_samples/api/product_catalog/src/Command/ProductPriceCommand.php + - + message: '#^Parameter \#1 \$criterion of method Ibexa\\Contracts\\ProductCatalog\\Values\\Product\\ProductVariantQuery\:\:setAttributesCriterion\(\) expects Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\\|null, Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\ given\.$#' + identifier: argument.type + count: 1 + path: code_samples/api/product_catalog/src/Command/ProductVariantCommand.php + + - + message: '#^Parameter \#1 \$criterion of method Ibexa\\Contracts\\ProductCatalog\\Values\\Product\\ProductVariantQuery\:\:setAttributesCriterion\(\) expects Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\\|null, Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\ given\.$#' + identifier: argument.type + count: 1 + path: code_samples/api/product_catalog/src/Command/ProductVariantCommand.php + - message: '#^Cannot call method getDateTime\(\) on Ibexa\\Contracts\\Calendar\\Event\|null\.$#' identifier: method.nonObject From 580dd913430b8fc66691e58f639139146e6ca299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Fri, 6 Feb 2026 09:42:34 +0100 Subject: [PATCH 02/11] Added release notes stub --- docs/release_notes/ibexa_dxp_v5.0.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index 074b312180..f9ab2d2e5f 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -10,6 +10,15 @@ month_change: false
+ +#### Improved product variant querying + +Product variant querying now supports filtering by variant codes and product attribute criteria. + +You can now use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) to search for variants across all products, regardless of their base product. + +For more information, see [Product API - Searching variants](product_api.md#searching-variants-across-products). + [[% set version = 'v5.0.5' %]] [[= release_note_entry_begin("Ibexa DXP " + version, '2026-01-15', ['Headless', 'Experience', 'Commerce']) =]] From 8bf05953162d74a2e3a915623fe8943f327646fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Mon, 9 Feb 2026 10:58:27 +0100 Subject: [PATCH 03/11] Regenerated baseline --- phpstan-baseline.neon | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 15279505d8..f0376d016f 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -42,18 +42,6 @@ parameters: count: 1 path: code_samples/api/product_catalog/src/Command/ProductPriceCommand.php - - - message: '#^Parameter \#1 \$criterion of method Ibexa\\Contracts\\ProductCatalog\\Values\\Product\\ProductVariantQuery\:\:setAttributesCriterion\(\) expects Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\\|null, Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\ given\.$#' - identifier: argument.type - count: 1 - path: code_samples/api/product_catalog/src/Command/ProductVariantCommand.php - - - - message: '#^Parameter \#1 \$criterion of method Ibexa\\Contracts\\ProductCatalog\\Values\\Product\\ProductVariantQuery\:\:setAttributesCriterion\(\) expects Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\\|null, Ibexa\\Contracts\\ProductCatalog\\Values\\Content\\Query\\Criterion\\ProductCriterionAdapter\ given\.$#' - identifier: argument.type - count: 1 - path: code_samples/api/product_catalog/src/Command/ProductVariantCommand.php - - message: '#^Cannot call method getDateTime\(\) on Ibexa\\Contracts\\Calendar\\Event\|null\.$#' identifier: method.nonObject From 86f8a8d8718ca219713d15932d4ea6112b6547d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Wed, 18 Feb 2026 09:37:30 +0100 Subject: [PATCH 04/11] Apply suggestions from code review Co-authored-by: julitafalcondusza <117284672+julitafalcondusza@users.noreply.github.com> --- docs/pim/product_api.md | 6 +++--- docs/release_notes/ibexa_dxp_v5.0.md | 2 +- docs/search/criteria_reference/product_search_criteria.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/pim/product_api.md b/docs/pim/product_api.md index fb8f5b81ff..b97d6c84f9 100644 --- a/docs/pim/product_api.md +++ b/docs/pim/product_api.md @@ -58,7 +58,7 @@ To delete a product, use `LocalProductServiceInterface::deleteProduct()`: ### Product variants -You can access the variants of a product by using [`ProductServiceInterface::findProductVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findProductVariants). +You can access the variants of a product by using the [`ProductServiceInterface::findProductVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findProductVariants) method. The method takes the product object and a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object as parameters. You can filter variants by variant codes or use product criteria: @@ -77,13 +77,13 @@ See [Product Search Criteria](product_search_criteria.md) and [Product Sort Clau #### Searching variants across products -To search for variants across all products, use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) +To search for variants across all products, use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants). This method takes a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object and returns variants regardless of their base product. Unlike `findProductVariants()`, which requires a specific product object, `findVariants()` allows you to search the entire variant catalog. You can filter variants using Product Criteria wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). -For example, search for variants with specific product codes or attribute values: +For example, you can search for variants with specific product codes or attribute values, as below: ``` php [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 83, 100) =]] diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index f9ab2d2e5f..c89b6f899b 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -15,7 +15,7 @@ month_change: false Product variant querying now supports filtering by variant codes and product attribute criteria. -You can now use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) to search for variants across all products, regardless of their base product. +You can now use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) method to search for variants across all products, regardless of their base product. For more information, see [Product API - Searching variants](product_api.md#searching-variants-across-products). diff --git a/docs/search/criteria_reference/product_search_criteria.md b/docs/search/criteria_reference/product_search_criteria.md index 907c5a0e4f..d3d24b91ab 100644 --- a/docs/search/criteria_reference/product_search_criteria.md +++ b/docs/search/criteria_reference/product_search_criteria.md @@ -9,8 +9,8 @@ Product Search Criteria are supported by [Product Search (`ProductServiceInterfa Search Criterion let you filter product by specific attributes, for example, color, availability, or price. -Product Search Criteria can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) -. See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. +Product Search Criteria can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). +See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. ## Product Search Criteria From 9e94cb3cc9bf446661f3783f29e59003ff5560da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 19 Feb 2026 14:17:55 +0100 Subject: [PATCH 05/11] Apply suggestions from code review --- docs/search/sort_clause_reference/product_sort_clauses.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/search/sort_clause_reference/product_sort_clauses.md b/docs/search/sort_clause_reference/product_sort_clauses.md index 1e3e1ce3d6..84af056283 100644 --- a/docs/search/sort_clause_reference/product_sort_clauses.md +++ b/docs/search/sort_clause_reference/product_sort_clauses.md @@ -9,8 +9,8 @@ Product Sort Clauses are supported by [Product Search (`ProductServiceInterface: By using Sort Clause you can filter product by specific attributes, for example: price, code, or availability. -Product Sort Clauses can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) -. See the [product variant search examples](../../pim/product_api.md#searching-variants-across-products) for more information. +Product Sort Clauses can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). +See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. | Sort Clause | Sorting based on | |-----|-----| From 4a58964639e840711a3829984b187ac61d70ddf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 19 Feb 2026 14:39:32 +0100 Subject: [PATCH 06/11] Changed example variant codes --- .../product_catalog/src/Command/ProductVariantCommand.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php b/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php index 6327f0cf9b..0a69ab3b9c 100644 --- a/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php +++ b/code_samples/api/product_catalog/src/Command/ProductVariantCommand.php @@ -50,7 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Get variants filtered by variant codes $codeQuery = new ProductVariantQuery(); - $codeQuery->setVariantCodes(['DESK1', 'DESK2']); + $codeQuery->setVariantCodes(['DESK-red', 'DESK-blue']); $specificVariants = $this->productService->findProductVariants($product, $codeQuery)->getVariants(); // Get variants with specific attributes @@ -75,15 +75,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Create a variant $variantCreateStructs = [ - new ProductVariantCreateStruct(['color' => 'oak', 'frame_color' => 'white'], 'DESK1'), - new ProductVariantCreateStruct(['color' => 'white', 'frame_color' => 'black'], 'DESK2'), + new ProductVariantCreateStruct(['color' => 'oak', 'frame_color' => 'white'], 'DESK-red'), + new ProductVariantCreateStruct(['color' => 'white', 'frame_color' => 'black'], 'DESK-blue'), ]; $this->localProductService->createProductVariants($product, $variantCreateStructs); // Search variants across all products $query = new ProductVariantQuery(); - $query->setVariantCodes(['DESK1', 'DESK2']); + $query->setVariantCodes(['DESK-red', 'DESK-blue']); $variantList = $this->productService->findVariants($query); foreach ($variantList->getVariants() as $variant) { From 885876abaded351a0c4ccb36667db9997b0da253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 19 Feb 2026 15:24:12 +0100 Subject: [PATCH 07/11] Review suggestion --- docs/pim/product_api.md | 35 ++++++++++++++----- .../product_search_criteria.md | 9 ++--- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/docs/pim/product_api.md b/docs/pim/product_api.md index b97d6c84f9..eb0f672cd4 100644 --- a/docs/pim/product_api.md +++ b/docs/pim/product_api.md @@ -58,13 +58,25 @@ To delete a product, use `LocalProductServiceInterface::deleteProduct()`: ### Product variants +#### Searching for variants of a specific product + You can access the variants of a product by using the [`ProductServiceInterface::findProductVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findProductVariants) method. The method takes the product object and a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object as parameters. -You can filter variants by variant codes or use product criteria: +You can filter variants by: + +- variant codes: + +``` php +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 50, 54) =]] +``` + +- product criteria: + +To use [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: ``` php -[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 50, 66) =]] +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 55, 66) =]] ``` From a variant ([`ProductVariantInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-ProductVariantInterface.html)), you can access the attributes that are used to generate the variant by using [`ProductVariantInterface::getDiscriminatorAttributes()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-ProductVariantInterface.html#method_getDiscriminatorAttributes). @@ -73,20 +85,27 @@ From a variant ([`ProductVariantInterface`](/api/php_api/php_api_reference/class [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 69, 73) =]] ``` -See [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) references for more information about how to use the [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) class. - -#### Searching variants across products +#### Searching for variants across all products To search for variants across all products, use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants). This method takes a [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html) object and returns variants regardless of their base product. Unlike `findProductVariants()`, which requires a specific product object, `findVariants()` allows you to search the entire variant catalog. -You can filter variants using Product Criteria wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). -For example, you can search for variants with specific product codes or attribute values, as below: +You can filter variants by: + +- variant codes: + +``` php +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 83, 87) =]] +``` + +- product criteria: + +To use [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: ``` php -[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 83, 100) =]] +[[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 92, 100) =]] ``` #### Creating variants diff --git a/docs/search/criteria_reference/product_search_criteria.md b/docs/search/criteria_reference/product_search_criteria.md index d3d24b91ab..2cc6c6f6b6 100644 --- a/docs/search/criteria_reference/product_search_criteria.md +++ b/docs/search/criteria_reference/product_search_criteria.md @@ -5,12 +5,13 @@ page_type: reference # Product Search Criteria reference -Product Search Criteria are supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). +Product Search Criteria are supported by [product and product variant search)](product_api.md#products) with the following methods: -Search Criterion let you filter product by specific attributes, for example, color, availability, or price. +- `ProductServiceInterface::findProducts()` +- `ProductServiceInterface::findProductVariants()` +- `ProductServiceInterface::findVariants()` -Product Search Criteria can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). -See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. +Search Criterion let you filter product by specific attributes, for example, color, availability, or price. ## Product Search Criteria From a08b6651de196626fcd90d6bf20bd9c708297c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 19 Feb 2026 15:33:24 +0100 Subject: [PATCH 08/11] Fixed links --- docs/release_notes/ibexa_dxp_v5.0.md | 2 +- docs/search/sort_clause_reference/product_sort_clauses.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index c89b6f899b..e375875a67 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -17,7 +17,7 @@ Product variant querying now supports filtering by variant codes and product att You can now use [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) method to search for variants across all products, regardless of their base product. -For more information, see [Product API - Searching variants](product_api.md#searching-variants-across-products). +For more information, see [Product API - Searching variants](product_api.md#searching-for-variants-across-all-products). [[% set version = 'v5.0.5' %]] diff --git a/docs/search/sort_clause_reference/product_sort_clauses.md b/docs/search/sort_clause_reference/product_sort_clauses.md index 84af056283..3f4a84c856 100644 --- a/docs/search/sort_clause_reference/product_sort_clauses.md +++ b/docs/search/sort_clause_reference/product_sort_clauses.md @@ -10,7 +10,7 @@ Product Sort Clauses are supported by [Product Search (`ProductServiceInterface: By using Sort Clause you can filter product by specific attributes, for example: price, code, or availability. Product Sort Clauses can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). -See the [product variant search examples](product_api.md#searching-variants-across-products) for more information. +See the [product variant search examples](product_api.md#searching-for-variants-across-all-products) for more information. | Sort Clause | Sorting based on | |-----|-----| From 63b18545a4d9a99060548eb855fd7abc8ab5597f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Thu, 19 Feb 2026 15:51:56 +0100 Subject: [PATCH 09/11] Removed mention about search --- docs/pim/product_api.md | 4 ++-- docs/search/criteria_reference/product_search_criteria.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/pim/product_api.md b/docs/pim/product_api.md index eb0f672cd4..426ac471cd 100644 --- a/docs/pim/product_api.md +++ b/docs/pim/product_api.md @@ -73,7 +73,7 @@ You can filter variants by: - product criteria: -To use [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: +To use [Product Search Criteria](product_search_criteria.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with the [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: ``` php [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 55, 66) =]] @@ -102,7 +102,7 @@ You can filter variants by: - product criteria: -To use [Product Search Criteria](product_search_criteria.md) and [Product Sort Clauses](product_sort_clauses.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: +To use [Product Search Criteria](product_search_criteria.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with the [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: ``` php [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 92, 100) =]] diff --git a/docs/search/criteria_reference/product_search_criteria.md b/docs/search/criteria_reference/product_search_criteria.md index 2cc6c6f6b6..1a9c3dd6f2 100644 --- a/docs/search/criteria_reference/product_search_criteria.md +++ b/docs/search/criteria_reference/product_search_criteria.md @@ -5,7 +5,7 @@ page_type: reference # Product Search Criteria reference -Product Search Criteria are supported by [product and product variant search)](product_api.md#products) with the following methods: +Product Search Criteria are supported by [product and product variant search](product_api.md#products) with the following methods: - `ProductServiceInterface::findProducts()` - `ProductServiceInterface::findProductVariants()` From 7195d81cc4e0ab8b175c8aafb6a874f4525a8e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Fri, 20 Feb 2026 09:02:37 +0100 Subject: [PATCH 10/11] Apply suggestions from code review Co-authored-by: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> --- docs/pim/product_api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pim/product_api.md b/docs/pim/product_api.md index 426ac471cd..2848e5d915 100644 --- a/docs/pim/product_api.md +++ b/docs/pim/product_api.md @@ -75,7 +75,7 @@ You can filter variants by: To use [Product Search Criteria](product_search_criteria.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with the [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: -``` php +``` php hl_lines="4" [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 55, 66) =]] ``` @@ -104,7 +104,7 @@ You can filter variants by: To use [Product Search Criteria](product_search_criteria.md) with [`ProductVariantQuery`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-ProductVariantQuery.html), wrap it with the [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html) class, as in the example below: -``` php +``` php hl_lines="4" [[= include_file('code_samples/api/product_catalog/src/Command/ProductVariantCommand.php', 92, 100) =]] ``` From 4500e596e3b4ca19d7448261ac081c94cbc32e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Fri, 20 Feb 2026 09:41:34 +0100 Subject: [PATCH 11/11] Reverted changes to sort clauses --- docs/search/sort_clause_reference/product_sort_clauses.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/search/sort_clause_reference/product_sort_clauses.md b/docs/search/sort_clause_reference/product_sort_clauses.md index 3f4a84c856..77aebe252b 100644 --- a/docs/search/sort_clause_reference/product_sort_clauses.md +++ b/docs/search/sort_clause_reference/product_sort_clauses.md @@ -5,13 +5,10 @@ page_type: reference # Product Sort Clauses -Product Sort Clauses are supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). +Product Sort Clauses are only supported by [Product Search (`ProductServiceInterface::findProduct`)](product_api.md#products). By using Sort Clause you can filter product by specific attributes, for example: price, code, or availability. -Product Sort Clauses can also be used with `ProductVariantQuery` when wrapped in a [`ProductCriterionAdapter`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Content-Query-Criterion-ProductCriterionAdapter.html). -See the [product variant search examples](product_api.md#searching-for-variants-across-all-products) for more information. - | Sort Clause | Sorting based on | |-----|-----| |[BasePrice](baseprice_sort_clause.md)|Base product price|