diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/Query/Search.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/Query/Search.php index 4eb76fb5c2d5b..d74d27d6630aa 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/Query/Search.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/Query/Search.php @@ -7,6 +7,7 @@ namespace Magento\CatalogGraphQl\Model\Resolver\Products\Query; +use Magento\Catalog\Model\Product; use Magento\CatalogGraphQl\DataProvider\Product\SearchCriteriaBuilder; use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\ProductSearch; use Magento\CatalogGraphQl\Model\Resolver\Products\SearchResult; @@ -14,12 +15,15 @@ use Magento\Framework\Api\Search\SearchCriteriaInterface; use Magento\Framework\Exception\InputException; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; +use Magento\Framework\Phrase; use Magento\GraphQl\Model\Query\ContextInterface; use Magento\Search\Api\SearchInterface; use Magento\Search\Model\Search\PageSizeProvider; /** * Full text search for catalog using given search criteria. + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Search implements ProductQueryInterface { @@ -115,10 +119,17 @@ public function getResult( $totalPages = $realPageSize ? ((int)ceil($searchResults->getTotalCount() / $realPageSize)) : 0; $productArray = []; - /** @var \Magento\Catalog\Model\Product $product */ + /** @var Product $product */ foreach ($searchResults->getItems() as $product) { $productArray[$product->getId()] = $product->getData(); $productArray[$product->getId()]['model'] = $product; + foreach ($queryFields as $field) { + $productArray[$product->getId()][$field] = $this->getAttributeValue( + $product, + $productArray, + $field + ); + } } return $this->searchResultFactory->create( @@ -148,4 +159,27 @@ private function buildSearchCriteria(array $args, ResolveInfo $info): SearchCrit return $searchCriteria; } + + /** + * Get product attribute value + * + * @param Product $product + * @param array $productArray + * @param string $field + * + * @return string|null|int|bool + */ + private function getAttributeValue(Product $product, array $productArray, string $field) + { + if ($attribute = $product->getResource()->getAttribute($field)) { + $attributeValue = $attribute->getFrontend()->getValue($product); + if ($attributeValue && !($attributeValue instanceof Phrase)) { + return $attributeValue; + } else { + return $productArray[$product->getId()][$field] ?? null; + } + } + + return ""; + } } diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php index 9946e74a24994..a02dc976a7503 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php @@ -813,14 +813,12 @@ private function assertOptions($product, $actualResponse) */ private function assertBaseFields($product, $actualResponse) { - $assertionMap = [ ['response_field' => 'attribute_set_id', 'expected_value' => $product->getAttributeSetId()], ['response_field' => 'created_at', 'expected_value' => $product->getCreatedAt()], ['response_field' => 'id', 'expected_value' => $product->getId()], ['response_field' => 'name', 'expected_value' => $product->getName()], - ['response_field' => 'price', 'expected_value' => - [ + ['response_field' => 'price', 'expected_value' => [ 'minimalPrice' => [ 'amount' => [ 'value' => $product->getSpecialPrice(), @@ -920,7 +918,9 @@ private function assertEavAttributes($product, $actualResponse) 'expected_value' => $expectedAttribute ? $expectedAttribute->getValue() : null ]; } - + if ($assertionMap[4]['expected_value'] === "US") { + $assertionMap[4]['expected_value'] = 'United States'; + } $this->assertResponseFields($actualResponse, $assertionMap); } diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductWithMultiselectAttributeTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductWithMultiselectAttributeTest.php new file mode 100644 index 0000000000000..e895a458aedd8 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductWithMultiselectAttributeTest.php @@ -0,0 +1,59 @@ +reIndexAndCleanCache(); + $query = <<graphQlQuery($query); + $this->assertStringContainsString( + 'Option 2, Option 3, Option 4 "!@#$%^&*', + $response['products']['items'][0]['multiselect_attribute'] + ); + } + + /** + * Reindex and clean cache + * + * @return void + * @throws LocalizedException + */ + private function reIndexAndCleanCache() : void + { + $appDir = dirname(Bootstrap::getInstance()->getAppTempDir()); + $out = ''; + // phpcs:ignore Magento2.Security.InsecureFunction + exec("php -f {$appDir}/bin/magento indexer:reindex", $out); + $this->cleanCache(); + } +}