Skip to content

Commit e9fb986

Browse files
merge magento/2.3.2-develop into magento-trigger/MC-16106
2 parents 09ce15b + 76a0af9 commit e9fb986

File tree

8 files changed

+154
-8
lines changed

8 files changed

+154
-8
lines changed

app/code/Magento/CatalogGraphQl/Model/Category/LevelCalculator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function calculate(int $rootCategoryId) : int
4848
$connection = $this->resourceConnection->getConnection();
4949
$select = $connection->select()
5050
->from($this->resourceConnection->getTableName('catalog_category_entity'), 'level')
51-
->where($this->resourceCategory->getLinkField() . " = ?", $rootCategoryId);
51+
->where($this->resourceCategory->getEntityIdField() . " = ?", $rootCategoryId);
5252

5353
return (int) $connection->fetchOne($select);
5454
}

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,6 @@ public function getList(
8686
$collection->load();
8787

8888
// Methods that perform extra fetches post-load
89-
if (in_array('media_gallery_entries', $attributes)) {
90-
$collection->addMediaGalleryData();
91-
}
9289
if (in_array('options', $attributes)) {
9390
$collection->addOptionsToResult();
9491
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor;
9+
10+
use Magento\Catalog\Model\ResourceModel\Product\Collection;
11+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessorInterface;
12+
use Magento\Framework\Api\SearchCriteriaInterface;
13+
use Magento\Catalog\Model\Product\Media\Config as MediaConfig;
14+
15+
/**
16+
* Add attributes required for every GraphQL product resolution process.
17+
*
18+
* {@inheritdoc}
19+
*/
20+
class MediaGalleryProcessor implements CollectionProcessorInterface
21+
{
22+
/**
23+
* @var MediaConfig
24+
*/
25+
private $mediaConfig;
26+
27+
/**
28+
* Add media gallery attributes to collection
29+
*
30+
* @param MediaConfig $mediaConfig
31+
*/
32+
public function __construct(MediaConfig $mediaConfig)
33+
{
34+
$this->mediaConfig = $mediaConfig;
35+
}
36+
37+
/**
38+
* @inheritdoc
39+
*/
40+
public function process(
41+
Collection $collection,
42+
SearchCriteriaInterface $searchCriteria,
43+
array $attributeNames
44+
): Collection {
45+
if (in_array('media_gallery_entries', $attributeNames)) {
46+
$mediaAttributes = $this->mediaConfig->getMediaAttributeCodes();
47+
foreach ($mediaAttributes as $mediaAttribute) {
48+
if (!in_array($mediaAttribute, $attributeNames)) {
49+
$collection->addAttributeToSelect($mediaAttribute);
50+
}
51+
}
52+
$collection->addMediaGalleryData();
53+
}
54+
55+
return $collection;
56+
}
57+
}

app/code/Magento/CatalogGraphQl/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<item name="search" xsi:type="object">Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor\SearchCriteriaProcessor</item>
4747
<item name="stock" xsi:type="object">Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor\StockProcessor</item>
4848
<item name="visibility" xsi:type="object">Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor\VisibilityStatusProcessor</item>
49+
<item name="mediaGallery" xsi:type="object">Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor\MediaGalleryProcessor</item>
4950
</argument>
5051
</arguments>
5152
</type>

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
use Magento\TestFramework\TestCase\GraphQlAbstract;
1111

12+
/**
13+
* Test media gallery queries
14+
*/
1215
class MediaGalleryTest extends GraphQlAbstract
1316
{
1417
/**
@@ -45,6 +48,43 @@ public function testProductSmallImageUrlWithExistingImage()
4548
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image']['url']));
4649
}
4750

51+
/**
52+
* @magentoApiDataFixture Magento/Catalog/_files/product_with_multiple_images.php
53+
*/
54+
public function testMediaGalleryTypesAreCorrect()
55+
{
56+
$productSku = 'simple';
57+
$query = <<<QUERY
58+
{
59+
products(filter: {sku: {eq: "{$productSku}"}}) {
60+
items {
61+
media_gallery_entries {
62+
label
63+
media_type
64+
file
65+
types
66+
}
67+
}
68+
}
69+
}
70+
QUERY;
71+
$response = $this->graphQlQuery($query);
72+
73+
$this->assertNotEmpty($response['products']['items'][0]['media_gallery_entries']);
74+
$mediaGallery = $response['products']['items'][0]['media_gallery_entries'];
75+
$this->assertCount(2, $mediaGallery);
76+
77+
$this->assertEquals('Image Alt Text', $mediaGallery[0]['label']);
78+
$this->assertEquals('image', $mediaGallery[0]['media_type']);
79+
$this->assertContains('magento_image', $mediaGallery[0]['file']);
80+
$this->assertEquals(['image', 'small_image'], $mediaGallery[0]['types']);
81+
82+
$this->assertEquals('Thumbnail Image', $mediaGallery[1]['label']);
83+
$this->assertEquals('image', $mediaGallery[1]['media_type']);
84+
$this->assertContains('magento_thumbnail', $mediaGallery[1]['file']);
85+
$this->assertEquals(['thumbnail', 'swatch_image'], $mediaGallery[1]['types']);
86+
}
87+
4888
/**
4989
* @param string $url
5090
* @return bool

dev/tests/integration/testsuite/Magento/Catalog/_files/product_image.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@
1818
$mediaDirectory->create($targetDirPath);
1919
$mediaDirectory->create($targetTmpDirPath);
2020

21-
$targetTmpFilePath = $mediaDirectory->getAbsolutePath() . DIRECTORY_SEPARATOR . $targetTmpDirPath
22-
. DIRECTORY_SEPARATOR . 'magento_image.jpg';
23-
copy(__DIR__ . '/magento_image.jpg', $targetTmpFilePath);
24-
// Copying the image to target dir is not necessary because during product save, it will be moved there from tmp dir
21+
$images = ['magento_image.jpg', 'magento_small_image.jpg', 'magento_thumbnail.jpg'];
22+
23+
foreach ($images as $image) {
24+
$targetTmpFilePath = $mediaDirectory->getAbsolutePath() . DIRECTORY_SEPARATOR . $targetTmpDirPath
25+
. DIRECTORY_SEPARATOR . $image;
26+
27+
$sourceFilePath = __DIR__ . DIRECTORY_SEPARATOR . $image;
28+
29+
copy($sourceFilePath, $targetTmpFilePath);
30+
// Copying the image to target dir is not necessary because during product save, it will be moved there from tmp dir
31+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
require __DIR__ . '/product_image.php';
8+
require __DIR__ . '/product_simple.php';
9+
10+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
11+
$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
12+
$product = $productRepository->get('simple');
13+
14+
/** @var $product \Magento\Catalog\Model\Product */
15+
$product->setStoreId(0)
16+
->setImage('/m/a/magento_image.jpg')
17+
->setSmallImage('/m/a/magento_image.jpg')
18+
->setThumbnail('/m/a/magento_thumbnail.jpg')
19+
->setSwatchImage('/m/a/magento_thumbnail.jpg')
20+
->setData('media_gallery', ['images' => [
21+
[
22+
'file' => '/m/a/magento_image.jpg',
23+
'position' => 1,
24+
'label' => 'Image Alt Text',
25+
'disabled' => 0,
26+
'media_type' => 'image'
27+
],
28+
[
29+
'file' => '/m/a/magento_thumbnail.jpg',
30+
'position' => 2,
31+
'label' => 'Thumbnail Image',
32+
'disabled' => 0,
33+
'media_type' => 'image'
34+
],
35+
]])
36+
->setCanSaveCustomOptions(true)
37+
->save();
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
require __DIR__ . '/product_with_image_rollback.php';

0 commit comments

Comments
 (0)