Skip to content

Commit 8867a57

Browse files
added logic if placeholder is overridden, unblock test.
1 parent 990f8ea commit 8867a57

File tree

3 files changed

+123
-17
lines changed

3 files changed

+123
-17
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/Product/ProductImage/Url.php

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
use Magento\Catalog\Model\Product;
1111
use Magento\Catalog\Model\Product\ImageFactory;
12+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Image\Placeholder as PlaceholderProvider;
1213
use Magento\Framework\Exception\LocalizedException;
1314
use Magento\Framework\GraphQl\Config\Element\Field;
1415
use Magento\Framework\GraphQl\Query\ResolverInterface;
1516
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
16-
use Magento\Framework\View\Asset\Repository as AssetRepository;
1717

1818
/**
1919
* Returns product's image url
@@ -25,21 +25,22 @@ class Url implements ResolverInterface
2525
*/
2626
private $productImageFactory;
2727
/**
28-
* @var AssetRepository
28+
* @var PlaceholderProvider
2929
*/
30-
private $assetRepository;
30+
private $_placeholderProvider;
3131

3232
/**
3333
* Url constructor.
3434
* @param ImageFactory $productImageFactory
35-
* @param AssetRepository $assetRepository
35+
* @param PlaceholderProvider $placeholderProvider
3636
*/
3737
public function __construct(
3838
ImageFactory $productImageFactory,
39-
AssetRepository $assetRepository
39+
PlaceholderProvider $placeholderProvider
40+
4041
) {
4142
$this->productImageFactory = $productImageFactory;
42-
$this->assetRepository = $assetRepository;
43+
$this->_placeholderProvider = $placeholderProvider;
4344
}
4445

4546
/**
@@ -68,26 +69,23 @@ public function resolve(
6869
}
6970

7071
/**
71-
* Get image url
72+
* Get image URL
7273
*
7374
* @param string $imageType
74-
* @param string|null $imagePath Null if image is not set
75+
* @param string|null $imagePath
7576
* @return string
77+
* @throws \Exception
7678
*/
7779
private function getImageUrl(string $imageType, ?string $imagePath): string
7880
{
7981
$image = $this->productImageFactory->create();
8082
$image->setDestinationSubdir($imageType)
8183
->setBaseFile($imagePath);
8284

83-
$imageUrl = $image->isBaseFilePlaceholder()
84-
? $this->assetRepository->createAsset(
85-
"Magento_Catalog::images/product/placeholder/{$imageType}.jpg",
86-
['area' => \Magento\Framework\App\Area::AREA_FRONTEND]
87-
)
88-
->getUrl()
89-
: $image->getUrl();
85+
if ($image->isBaseFilePlaceholder()) {
86+
return $this->_placeholderProvider->getPlaceholder($imageType);
87+
}
9088

91-
return $imageUrl;
89+
return $image->getUrl();
9290
}
9391
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
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\Image;
9+
10+
use Magento\Catalog\Model\View\Asset\PlaceholderFactory;
11+
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\Framework\View\Asset\Repository as AssetRepository;
13+
use Magento\Framework\View\Design\Theme\ThemeProviderInterface;
14+
use Magento\Store\Model\StoreManagerInterface;
15+
16+
/**
17+
* Class Placeholder
18+
* @package Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Image
19+
*/
20+
class Placeholder
21+
{
22+
/**
23+
* @var PlaceholderFactory
24+
*/
25+
private $_placeholderFactory;
26+
/**
27+
* @var AssetRepository
28+
*/
29+
private $_assetRepository;
30+
/**
31+
* @var ScopeConfigInterface
32+
*/
33+
private $_scopeConfig;
34+
/**
35+
* @var StoreManagerInterface
36+
*/
37+
private $_storeManager;
38+
/**
39+
* @var ThemeProviderInterface
40+
*/
41+
private $_themeProvider;
42+
43+
/**
44+
* Placeholder constructor.
45+
* @param PlaceholderFactory $placeholderFactory
46+
* @param AssetRepository $assetRepository
47+
* @param ScopeConfigInterface $scopeConfig
48+
* @param StoreManagerInterface $storeManager
49+
* @param ThemeProviderInterface $themeProvider
50+
*/
51+
public function __construct(
52+
PlaceholderFactory $placeholderFactory,
53+
AssetRepository $assetRepository,
54+
ScopeConfigInterface $scopeConfig,
55+
StoreManagerInterface $storeManager,
56+
ThemeProviderInterface $themeProvider
57+
) {
58+
$this->_placeholderFactory = $placeholderFactory;
59+
$this->_assetRepository = $assetRepository;
60+
$this->_scopeConfig = $scopeConfig;
61+
$this->_storeManager = $storeManager;
62+
$this->_themeProvider = $themeProvider;
63+
}
64+
65+
/**
66+
* Get placeholder
67+
*
68+
* @param $imageType
69+
* @return string
70+
* @throws \Magento\Framework\Exception\NoSuchEntityException
71+
*/
72+
public function getPlaceholder($imageType): string
73+
{
74+
$imageAsset = $this->_placeholderFactory->create(['type' => $imageType]);
75+
76+
// check if placeholder defined in config
77+
if ($imageAsset->getFilePath()) {
78+
return $imageAsset->getUrl();
79+
}
80+
81+
return $this->_assetRepository->createAsset(
82+
"Magento_Catalog::images/product/placeholder/{$imageType}.jpg",
83+
$this->getThemeData()
84+
)->getUrl();
85+
}
86+
87+
/**
88+
* Get theme model
89+
*
90+
* @return mixed
91+
* @throws \Magento\Framework\Exception\NoSuchEntityException
92+
*/
93+
public function getThemeData()
94+
{
95+
$themeId = $this->_scopeConfig->getValue(
96+
\Magento\Framework\View\DesignInterface::XML_PATH_THEME_ID,
97+
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
98+
$this->_storeManager->getStore()->getId()
99+
);
100+
101+
/** @var $theme \Magento\Framework\View\Design\ThemeInterface */
102+
$theme = $this->_themeProvider->getThemeById($themeId);
103+
104+
$data = $theme->getData();
105+
$data['themeModel'] = $theme;
106+
107+
return $data;
108+
}
109+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ public function testProductWithBaseImage()
5151
*/
5252
public function testProductWithoutBaseImage()
5353
{
54-
$this->markTestIncomplete('https://github.com/magento/graphql-ce/issues/239');
5554
$productSku = 'simple';
5655
$query = <<<QUERY
5756
{

0 commit comments

Comments
 (0)