Skip to content

Commit 646f248

Browse files
committed
Declared new type for product images
1 parent 6877798 commit 646f248

File tree

3 files changed

+33
-61
lines changed

3 files changed

+33
-61
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Product/SmallImageUrl.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Product/SmallImage.php

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,18 @@
99

1010
use Magento\Catalog\Helper\ImageFactory as CatalogImageHelperFactory;
1111
use Magento\Catalog\Model\Product;
12-
use Magento\Catalog\Model\ResourceModel\Product\GalleryFactory as GalleryResourceFactory;
1312
use Magento\Framework\GraphQl\Config\Element\Field;
1413
use Magento\Framework\GraphQl\Query\Resolver\Value;
1514
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
1615
use Magento\Framework\GraphQl\Query\ResolverInterface;
1716
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
18-
use Magento\Store\Model\Store;
1917
use Magento\Store\Model\StoreManagerInterface;
2018

2119
/**
2220
* Returns product's small image. If the small image is not set, returns a placeholder
2321
*/
24-
class SmallImageUrl implements ResolverInterface
22+
class SmallImage implements ResolverInterface
2523
{
26-
/**
27-
* @var GalleryResourceFactory
28-
*/
29-
private $galleryResourceFactory;
30-
3124
/**
3225
* @var CatalogImageHelperFactory
3326
*/
@@ -38,26 +31,18 @@ class SmallImageUrl implements ResolverInterface
3831
*/
3932
private $valueFactory;
4033

41-
/**
42-
* @var StoreManagerInterface
43-
*/
44-
private $storeManager;
45-
4634
/**
4735
* @param ValueFactory $valueFactory
4836
* @param CatalogImageHelperFactory $catalogImageHelperFactory
49-
* @param GalleryResourceFactory $galleryResourceFactory
5037
* @param StoreManagerInterface $storeManager
5138
*/
5239
public function __construct(
5340
ValueFactory $valueFactory,
5441
CatalogImageHelperFactory $catalogImageHelperFactory,
55-
GalleryResourceFactory $galleryResourceFactory,
5642
StoreManagerInterface $storeManager
5743
) {
5844
$this->valueFactory = $valueFactory;
5945
$this->catalogImageHelperFactory = $catalogImageHelperFactory;
60-
$this->galleryResourceFactory = $galleryResourceFactory;
6146
$this->storeManager = $storeManager;
6247
}
6348

@@ -79,47 +64,24 @@ public function resolve(
7964
}
8065
/** @var Product $product */
8166
$product = $value['model'];
82-
83-
/* If small_image is not loaded for product, need to load it separately */
84-
if (!$product->getSmallImage()) {
85-
$galleryResource = $this->galleryResourceFactory->create();
86-
$storeIds = [
87-
Store::DEFAULT_STORE_ID,
88-
$this->storeManager->getStore()->getId()
89-
];
90-
$productImages = $galleryResource->getProductImages($product, $storeIds);
91-
$productSmallImage = $this->getSmallImageFromGallery($productImages);
92-
$product->setSmallImage($productSmallImage);
93-
}
67+
$imageType = $field->getName();
9468

9569
$catalogImageHelper = $this->catalogImageHelperFactory->create();
96-
$smallImageURL = $catalogImageHelper->init(
70+
$imageUrl = $catalogImageHelper->init(
9771
$product,
98-
'product_small_image',
99-
['type' => 'small_image']
72+
'product_' . $imageType,
73+
['type' => $imageType]
10074
)->getUrl();
10175

102-
$result = function () use ($smallImageURL) {
103-
return $smallImageURL;
76+
$imageData = [
77+
'url' => $imageUrl,
78+
'path' => $product->getData($imageType)
79+
];
80+
81+
$result = function () use ($imageData) {
82+
return $imageData;
10483
};
10584

10685
return $this->valueFactory->create($result);
10786
}
108-
109-
/**
110-
* Retrieves small image from the product gallery image
111-
*
112-
* @param array $productImages
113-
* @return string|null
114-
*/
115-
private function getSmallImageFromGallery(array $productImages)
116-
{
117-
foreach ($productImages as $productImage) {
118-
if ($productImage['attribute_code'] == 'small_image') {
119-
return $productImage['filepath'];
120-
}
121-
}
122-
123-
return null;
124-
}
12587
}

app/code/Magento/CatalogGraphQl/etc/schema.graphqls

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,7 @@ interface ProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\
258258
meta_keyword: String @doc(description: "A comma-separated list of keywords that are visible only to search engines")
259259
meta_description: String @doc(description: "A brief overview of the product for search results listings, maximum 255 characters")
260260
image: String @doc(description: "The relative path to the main image on the product page")
261-
small_image: String @doc(description: "The relative path to the small image, which is used on catalog pages")
262-
small_image_url: String @doc(description: "The small image URL, which is used on catalog pages") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\SmallImageUrl")
261+
small_image: ProductImage @doc(description: "The relative path to the small image, which is used on catalog pages") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\SmallImage")
263262
thumbnail: String @doc(description: "The relative path to the product's thumbnail image")
264263
new_from_date: String @doc(description: "The beginning date for new product listings, and determines if the product is featured as a new product") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\NewFromTo")
265264
new_to_date: String @doc(description: "The end date for new product listings") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\NewFromTo")
@@ -353,6 +352,11 @@ type CustomizableFileValue @doc(description: "CustomizableFileValue defines the
353352
image_size_y: Int @doc(description: "The maximum height of an image")
354353
}
355354

355+
type ProductImage @doc(description: "Product image information. Contains image relative path and URL") {
356+
url: String
357+
path: String
358+
}
359+
356360
interface CustomizableOptionInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\CustomizableOptionTypeResolver") @doc(description: "The CustomizableOptionInterface contains basic information about a customizable option. It can be implemented by several types of configurable options.") {
357361
title: String @doc(description: "The display name for this option")
358362
required: Boolean @doc(description: "Indicates whether the option is required")
@@ -541,6 +545,6 @@ type SortField {
541545
}
542546

543547
type SortFields @doc(description: "SortFields contains a default value for sort fields and all available sort fields") {
544-
default: String @doc(description: "Default value of sort fields")
548+
default: String @doc(description: "Default value of sort fields")
545549
options: [SortField] @doc(description: "Available sort fields")
546550
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/MediaGalleryTest.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,18 @@ public function testProductSmallImageUrlWithExistingImage()
3131
{
3232
products(filter: {sku: {eq: "{$productSku}"}}) {
3333
items {
34-
small_image_url
34+
small_image {
35+
url
36+
}
3537
}
3638
}
3739
}
3840
QUERY;
3941
$response = $this->graphQlQuery($query);
4042

41-
self::assertArrayHasKey('small_image_url', $response['products']['items'][0]);
42-
self::assertContains('magento_image.jpg', $response['products']['items'][0]['small_image_url']);
43-
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image_url']));
43+
self::assertArrayHasKey('url', $response['products']['items'][0]['small_image']);
44+
self::assertContains('magento_image.jpg', $response['products']['items'][0]['small_image']['url']);
45+
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image']['url']));
4446
}
4547

4648
/**
@@ -56,15 +58,19 @@ public function testProductSmallImageUrlWithNoImage()
5658
{
5759
products(filter: {sku: {eq: "{$productSku}"}}) {
5860
items {
59-
small_image_url
61+
small_image {
62+
url
63+
}
6064
}
6165
}
6266
}
6367
QUERY;
6468
$response = $this->graphQlQuery($query);
65-
self::assertArrayHasKey('small_image_url', $response['products']['items'][0]);
66-
self::assertContains('placeholder/small_image.jpg', $response['products']['items'][0]['small_image_url']);
67-
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image_url']));
69+
70+
var_dump($response['products']['items'][0]);
71+
self::assertArrayHasKey('small_image', $response['products']['items'][0]);
72+
self::assertContains('placeholder/small_image.jpg', $response['products']['items'][0]['small_image']['url']);
73+
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image']['url']));
6874
}
6975

7076
/**

0 commit comments

Comments
 (0)