Skip to content

Commit 36cbd17

Browse files
committed
Merge remote-tracking branch 'upstream/2.4-develop' into 2.4-develop
2 parents 4991888 + 90012f2 commit 36cbd17

File tree

53 files changed

+1965
-1658
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1965
-1658
lines changed

app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,20 @@
1313
*/
1414
namespace Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery;
1515

16-
use Magento\Framework\App\ObjectManager;
16+
use Magento\Backend\Block\DataProviders\ImageUploadConfig as ImageUploadConfigDataProvider;
1717
use Magento\Backend\Block\Media\Uploader;
18-
use Magento\Framework\View\Element\AbstractBlock;
1918
use Magento\Framework\App\Filesystem\DirectoryList;
19+
use Magento\Framework\App\ObjectManager;
2020
use Magento\Framework\Exception\FileSystemException;
21-
use Magento\Backend\Block\DataProviders\ImageUploadConfig as ImageUploadConfigDataProvider;
21+
use Magento\Framework\Storage\FileNotFoundException;
22+
use Magento\Framework\Storage\StorageProvider;
23+
use Magento\Framework\View\Element\AbstractBlock;
2224
use Magento\MediaStorage\Helper\File\Storage\Database;
2325

2426
/**
2527
* Block for gallery content.
28+
*
29+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2630
*/
2731
class Content extends \Magento\Backend\Block\Widget
2832
{
@@ -55,11 +59,21 @@ class Content extends \Magento\Backend\Block\Widget
5559
* @var Database
5660
*/
5761
private $fileStorageDatabase;
62+
/**
63+
* @var StorageProvider
64+
*/
65+
private $storageProvider;
66+
67+
/**
68+
* @var \Magento\Framework\Filesystem\Directory\ReadInterface
69+
*/
70+
private $mediaDirectory;
5871

5972
/**
6073
* @param \Magento\Backend\Block\Template\Context $context
6174
* @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
6275
* @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig
76+
* @param StorageProvider $storageProvider
6377
* @param array $data
6478
* @param ImageUploadConfigDataProvider $imageUploadConfigDataProvider
6579
* @param Database $fileStorageDatabase
@@ -68,17 +82,20 @@ public function __construct(
6882
\Magento\Backend\Block\Template\Context $context,
6983
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
7084
\Magento\Catalog\Model\Product\Media\Config $mediaConfig,
85+
StorageProvider $storageProvider,
7186
array $data = [],
7287
ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null,
7388
Database $fileStorageDatabase = null
7489
) {
7590
$this->_jsonEncoder = $jsonEncoder;
7691
$this->_mediaConfig = $mediaConfig;
7792
parent::__construct($context, $data);
93+
$this->mediaDirectory = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA);
7894
$this->imageUploadConfigDataProvider = $imageUploadConfigDataProvider
7995
?: ObjectManager::getInstance()->get(ImageUploadConfigDataProvider::class);
8096
$this->fileStorageDatabase = $fileStorageDatabase
8197
?: ObjectManager::getInstance()->get(Database::class);
98+
$this->storageProvider = $storageProvider;
8299
}
83100

84101
/**
@@ -157,10 +174,49 @@ public function getAddImagesButton()
157174
);
158175
}
159176

177+
/**
178+
* Sync images to database
179+
*
180+
* @param string $fileName
181+
*/
182+
private function syncImageToDatabase(string $fileName): void
183+
{
184+
if ($this->fileStorageDatabase->checkDbUsage() &&
185+
!$this->mediaDirectory->isFile($this->_mediaConfig->getMediaPath($fileName))
186+
) {
187+
$this->fileStorageDatabase->saveFileToFilesystem(
188+
$this->_mediaConfig->getMediaPath($fileName)
189+
);
190+
}
191+
}
192+
193+
/**
194+
* Returns file metadata as an associative array
195+
*
196+
* @param string $fileName
197+
* @return array
198+
* @throws FileNotFoundException
199+
*/
200+
private function getFileMetadata(string $fileName): array
201+
{
202+
$metadata = [];
203+
try {
204+
$info = $this->storageProvider->get('media')
205+
->getMetadata($this->_mediaConfig->getMediaPath($fileName));
206+
$metadata['size'] = $info['size'];
207+
} catch (FileSystemException $e) {
208+
$metadata['url'] = $this->getImageHelper()->getDefaultPlaceholderUrl('small_image');
209+
$metadata['size'] = 0;
210+
$this->_logger->warning($e);
211+
}
212+
return $metadata;
213+
}
214+
160215
/**
161216
* Returns image json
162217
*
163218
* @return string
219+
* @throws FileNotFoundException
164220
*/
165221
public function getImagesJson()
166222
{
@@ -170,24 +226,14 @@ public function getImagesJson()
170226
is_array($value['images']) &&
171227
count($value['images'])
172228
) {
173-
$mediaDir = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA);
174229
$images = $this->sortImagesByPosition($value['images']);
175230
foreach ($images as &$image) {
176231
$image['url'] = $this->_mediaConfig->getMediaUrl($image['file']);
177-
if ($this->fileStorageDatabase->checkDbUsage() &&
178-
!$mediaDir->isFile($this->_mediaConfig->getMediaPath($image['file']))
179-
) {
180-
$this->fileStorageDatabase->saveFileToFilesystem(
181-
$this->_mediaConfig->getMediaPath($image['file'])
182-
);
183-
}
184-
try {
185-
$fileHandler = $mediaDir->stat($this->_mediaConfig->getMediaPath($image['file']));
186-
$image['size'] = $fileHandler['size'];
187-
} catch (FileSystemException $e) {
188-
$image['url'] = $this->getImageHelper()->getDefaultPlaceholderUrl('small_image');
189-
$image['size'] = 0;
190-
$this->_logger->warning($e);
232+
$this->syncImageToDatabase($image['file']);
233+
if (isset($image['image_metadata']) && is_array($image['image_metadata'])) {
234+
$image = array_replace_recursive($image, $image['image_metadata']);
235+
} else {
236+
$image = array_replace_recursive($image, $this->getFileMetadata($image['file']));
191237
}
192238
}
193239
return $this->_jsonEncoder->encode($images);

app/code/Magento/Catalog/Block/Product/Gallery.php

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@
1111
*/
1212
namespace Magento\Catalog\Block\Product;
1313

14+
use Magento\Framework\Storage\FileNotFoundException;
1415
use Magento\Catalog\Model\Product;
15-
use Magento\Framework\App\Filesystem\DirectoryList;
16+
use Magento\Catalog\Model\Product\Media\Config;
17+
use Magento\Framework\App\ObjectManager;
1618
use Magento\Framework\Data\Collection;
19+
use Magento\Framework\Registry;
20+
use Magento\Framework\Storage\StorageProvider;
1721

1822
/**
1923
* Product gallery block
@@ -26,22 +30,37 @@ class Gallery extends \Magento\Framework\View\Element\Template
2630
/**
2731
* Core registry
2832
*
29-
* @var \Magento\Framework\Registry
33+
* @var Registry
3034
*/
3135
protected $_coreRegistry = null;
3236

37+
/**
38+
* @var StorageProvider
39+
*/
40+
private $storageProvider;
41+
/**
42+
* @var Config
43+
*/
44+
private $mediaConfig;
45+
3346
/**
3447
* @param \Magento\Framework\View\Element\Template\Context $context
35-
* @param \Magento\Framework\Registry $registry
48+
* @param Registry $registry
3649
* @param array $data
50+
* @param StorageProvider $storageProvider
51+
* @param Config $mediaConfig
3752
*/
3853
public function __construct(
3954
\Magento\Framework\View\Element\Template\Context $context,
40-
\Magento\Framework\Registry $registry,
41-
array $data = []
55+
Registry $registry,
56+
array $data = [],
57+
StorageProvider $storageProvider = null,
58+
Config $mediaConfig = null
4259
) {
4360
$this->_coreRegistry = $registry;
4461
parent::__construct($context, $data);
62+
$this->storageProvider = $storageProvider ?? ObjectManager::getInstance()->get(StorageProvider::class);
63+
$this->mediaConfig = $mediaConfig ?? ObjectManager::getInstance()->get(Config::class);
4564
}
4665

4766
/**
@@ -121,16 +140,24 @@ public function getImageFile()
121140
*/
122141
public function getImageWidth()
123142
{
124-
$file = $this->getCurrentImage()->getPath();
125-
126-
if ($this->_filesystem->getDirectoryRead(DirectoryList::MEDIA)->isFile($file)) {
127-
$size = getimagesize($file);
128-
if (isset($size[0])) {
129-
if ($size[0] > 600) {
143+
$file = $this->getCurrentImage()->getFile();
144+
if (!$file) {
145+
return false;
146+
}
147+
$productMediaFile = $this->mediaConfig->getMediaPath($file);
148+
149+
$mediaStorage = $this->storageProvider->get('media');
150+
if ($mediaStorage->has($productMediaFile)) {
151+
try {
152+
$meta = $mediaStorage->getMetadata($productMediaFile);
153+
$size = $meta['size'];
154+
if ($size > 600) {
130155
return 600;
131156
} else {
132-
return (int) $size[0];
157+
return (int) $size;
133158
}
159+
} catch (FileNotFoundException $e) {
160+
return false;
134161
}
135162
}
136163

app/code/Magento/Catalog/Controller/Adminhtml/Product/Gallery/Upload.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
99
use Magento\Framework\App\Filesystem\DirectoryList;
1010
use Magento\Framework\App\ObjectManager;
11-
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\Storage\StorageProvider;
1212

1313
/**
1414
* Upload product image action controller
@@ -52,16 +52,23 @@ class Upload extends \Magento\Backend\App\Action implements HttpPostActionInterf
5252
*/
5353
private $productMediaConfig;
5454

55+
/**
56+
* @var StorageProvider
57+
*/
58+
private $storageProvider;
59+
5560
/**
5661
* @param \Magento\Backend\App\Action\Context $context
5762
* @param \Magento\Framework\Controller\Result\RawFactory $resultRawFactory
63+
* @param StorageProvider $storageProvider
5864
* @param \Magento\Framework\Image\AdapterFactory $adapterFactory
5965
* @param \Magento\Framework\Filesystem $filesystem
6066
* @param \Magento\Catalog\Model\Product\Media\Config $productMediaConfig
6167
*/
6268
public function __construct(
6369
\Magento\Backend\App\Action\Context $context,
6470
\Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
71+
StorageProvider $storageProvider,
6572
\Magento\Framework\Image\AdapterFactory $adapterFactory = null,
6673
\Magento\Framework\Filesystem $filesystem = null,
6774
\Magento\Catalog\Model\Product\Media\Config $productMediaConfig = null
@@ -74,6 +81,7 @@ public function __construct(
7481
->get(\Magento\Framework\Filesystem::class);
7582
$this->productMediaConfig = $productMediaConfig ?: ObjectManager::getInstance()
7683
->get(\Magento\Catalog\Model\Product\Media\Config::class);
84+
$this->storageProvider = $storageProvider;
7785
}
7886

7987
/**
@@ -84,6 +92,7 @@ public function __construct(
8492
public function execute()
8593
{
8694
try {
95+
/** @var \Magento\MediaStorage\Model\File\Uploader $uploader */
8796
$uploader = $this->_objectManager->create(
8897
\Magento\MediaStorage\Model\File\Uploader::class,
8998
['fileId' => 'image']
@@ -93,11 +102,18 @@ public function execute()
93102
$uploader->addValidateCallback('catalog_product_image', $imageAdapter, 'validateUploadFile');
94103
$uploader->setAllowRenameFiles(true);
95104
$uploader->setFilesDispersion(true);
105+
96106
$mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA);
107+
$baseImagePath = $this->productMediaConfig->getBaseTmpMediaPath();
97108
$result = $uploader->save(
98-
$mediaDirectory->getAbsolutePath($this->productMediaConfig->getBaseTmpMediaPath())
109+
$mediaDirectory->getAbsolutePath($baseImagePath)
99110
);
100111

112+
$origFile = $this->productMediaConfig->getTmpMediaPath($result['file']);
113+
$storage = $this->storageProvider->get('media');
114+
$content = $mediaDirectory->readFile($origFile);
115+
$storage->put($origFile, $content);
116+
101117
$this->_eventManager->dispatch(
102118
'catalog_product_gallery_upload_image_after',
103119
['result' => $result, 'action' => $this]

app/code/Magento/Catalog/Helper/Image.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Magento\Framework\View\Element\Block\ArgumentInterface;
1414

1515
/**
16-
* Catalog image helper.
16+
* Catalog image helper
1717
*
1818
* @api
1919
* @SuppressWarnings(PHPMD.TooManyFields)
@@ -166,7 +166,8 @@ public function __construct(
166166
$this->_assetRepo = $assetRepo;
167167
$this->viewConfig = $viewConfig;
168168
$this->viewAssetPlaceholderFactory = $placeholderFactory
169-
?: ObjectManager::getInstance()->get(PlaceholderFactory::class);
169+
?: ObjectManager::getInstance()
170+
->get(PlaceholderFactory::class);
170171
$this->mediaConfig = $mediaConfig ?: ObjectManager::getInstance()->get(CatalogMediaConfig::class);
171172
}
172173

@@ -573,6 +574,9 @@ public function save()
573574
* Return resized product image information
574575
*
575576
* @return array
577+
* @deprecated Magento is not responsible for image resizing anymore. This method works with local filesystem only.
578+
* Service that provides resized images should guarantee that the image sizes correspond to requested ones.
579+
* Use `getWidth()` and `getHeight()` instead.
576580
*/
577581
public function getResizedImageInfo()
578582
{

app/code/Magento/Catalog/Model/Config/Source/Web/CatalogMediaUrlFormat.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function toOptionArray()
2424
'value' => CatalogMediaConfig::IMAGE_OPTIMIZATION_PARAMETERS,
2525
'label' => __('Image optimization based on query parameters')
2626
],
27-
['value' => CatalogMediaConfig::HASH, 'label' => __('Unique hash per image variant (Legacy mode)')]
27+
['value' => CatalogMediaConfig::HASH, 'label' => __('Legacy mode (unique hash per image variant)')]
2828
];
2929
}
3030
}

0 commit comments

Comments
 (0)