Skip to content

Commit 5f6e24f

Browse files
author
Graham Wharton
committed
Admin Product Page now copies image files from database to local storage in database storage mode.
1 parent 48d8d43 commit 5f6e24f

File tree

2 files changed

+99
-5
lines changed
  • app/code/Magento/Catalog

2 files changed

+99
-5
lines changed

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Magento\Framework\App\Filesystem\DirectoryList;
2020
use Magento\Framework\Exception\FileSystemException;
2121
use Magento\Backend\Block\DataProviders\ImageUploadConfig as ImageUploadConfigDataProvider;
22+
use Magento\MediaStorage\Helper\File\Storage\Database;
2223

2324
/**
2425
* Block for gallery content.
@@ -50,25 +51,34 @@ class Content extends \Magento\Backend\Block\Widget
5051
*/
5152
private $imageUploadConfigDataProvider;
5253

54+
/**
55+
* @var Database
56+
*/
57+
private $fileStorageDatabase;
58+
5359
/**
5460
* @param \Magento\Backend\Block\Template\Context $context
5561
* @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
5662
* @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig
5763
* @param array $data
5864
* @param ImageUploadConfigDataProvider $imageUploadConfigDataProvider
65+
* @param Database $fileStorageDatabase
5966
*/
6067
public function __construct(
6168
\Magento\Backend\Block\Template\Context $context,
6269
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
6370
\Magento\Catalog\Model\Product\Media\Config $mediaConfig,
6471
array $data = [],
65-
ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null
72+
ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null,
73+
Database $fileStorageDatabase = null
6674
) {
6775
$this->_jsonEncoder = $jsonEncoder;
6876
$this->_mediaConfig = $mediaConfig;
6977
parent::__construct($context, $data);
7078
$this->imageUploadConfigDataProvider = $imageUploadConfigDataProvider
7179
?: ObjectManager::getInstance()->get(ImageUploadConfigDataProvider::class);
80+
$this->fileStorageDatabase = $fileStorageDatabase
81+
?: ObjectManager::getInstance()->get(Database::class);
7282
}
7383

7484
/**
@@ -164,6 +174,13 @@ public function getImagesJson()
164174
$images = $this->sortImagesByPosition($value['images']);
165175
foreach ($images as &$image) {
166176
$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+
}
167184
try {
168185
$fileHandler = $mediaDir->stat($this->_mediaConfig->getMediaPath($image['file']));
169186
$image['size'] = $fileHandler['size'];
@@ -187,9 +204,12 @@ public function getImagesJson()
187204
private function sortImagesByPosition($images)
188205
{
189206
if (is_array($images)) {
190-
usort($images, function ($imageA, $imageB) {
191-
return ($imageA['position'] < $imageB['position']) ? -1 : 1;
192-
});
207+
usort(
208+
$images,
209+
function ($imageA, $imageB) {
210+
return ($imageA['position'] < $imageB['position']) ? -1 : 1;
211+
}
212+
);
193213
}
194214
return $images;
195215
}

app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Catalog\Model\Entity\Attribute;
1010
use Magento\Catalog\Model\Product;
1111
use Magento\Framework\Phrase;
12+
use Magento\MediaStorage\Helper\File\Storage\Database;
1213

1314
/**
1415
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -50,6 +51,11 @@ class ContentTest extends \PHPUnit\Framework\TestCase
5051
*/
5152
protected $imageHelper;
5253

54+
/**
55+
* @var \Magento\MediaStorage\Helper\File\Storage\Database|\PHPUnit_Framework_MockObject_MockObject
56+
*/
57+
protected $databaseMock;
58+
5359
/**
5460
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
5561
*/
@@ -71,13 +77,18 @@ public function setUp()
7177
->disableOriginalConstructor()
7278
->getMock();
7379

80+
$this->databaseMock = $this->getMockBuilder(Database::class)
81+
->disableOriginalConstructor()
82+
->getMock();
83+
7484
$this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
7585
$this->content = $this->objectManager->getObject(
7686
\Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery\Content::class,
7787
[
7888
'mediaConfig' => $this->mediaConfigMock,
7989
'jsonEncoder' => $this->jsonEncoderMock,
80-
'filesystem' => $this->fileSystemMock
90+
'filesystem' => $this->fileSystemMock,
91+
'fileStorageDatabase' => $this->databaseMock
8192
]
8293
);
8394
}
@@ -143,6 +154,13 @@ public function testGetImagesJson()
143154
$this->readMock->expects($this->any())->method('stat')->willReturnMap($sizeMap);
144155
$this->jsonEncoderMock->expects($this->once())->method('encode')->willReturnCallback('json_encode');
145156

157+
$this->readMock->expects($this->any())
158+
->method('isFile')
159+
->will($this->returnValue(true));
160+
$this->databaseMock->expects($this->any())
161+
->method('checkDbUsage')
162+
->will($this->returnValue(false));
163+
146164
$this->assertSame(json_encode($imagesResult), $this->content->getImagesJson());
147165
}
148166

@@ -210,6 +228,14 @@ public function testGetImagesJsonWithException()
210228
$this->fileSystemMock->expects($this->any())->method('getDirectoryRead')->willReturn($this->readMock);
211229
$this->mediaConfigMock->expects($this->any())->method('getMediaUrl');
212230
$this->mediaConfigMock->expects($this->any())->method('getMediaPath');
231+
232+
$this->readMock->expects($this->any())
233+
->method('isFile')
234+
->will($this->returnValue(true));
235+
$this->databaseMock->expects($this->any())
236+
->method('checkDbUsage')
237+
->will($this->returnValue(false));
238+
213239
$this->readMock->expects($this->any())->method('stat')->willReturnOnConsecutiveCalls(
214240
$this->throwException(
215241
new \Magento\Framework\Exception\FileSystemException(new Phrase('test'))
@@ -365,4 +391,52 @@ private function getMediaAttribute(string $label, string $attributeCode)
365391

366392
return $mediaAttribute;
367393
}
394+
395+
/**
396+
* Test GetImagesJson() calls MediaStorage functions to obtain image from DB prior to stat call
397+
*
398+
* @return void
399+
*/
400+
public function testGetImagesJsonMediaStorageMode()
401+
{
402+
$images = [
403+
'images' => [
404+
[
405+
'value_id' => '0',
406+
'file' => 'file_1.jpg',
407+
'media_type' => 'image',
408+
'position' => '0'
409+
]
410+
]
411+
];
412+
413+
$mediaPath = [
414+
['file_1.jpg', 'catalog/product/image_1.jpg']
415+
];
416+
417+
$this->content->setElement($this->galleryMock);
418+
419+
$this->galleryMock->expects($this->once())
420+
->method('getImages')
421+
->willReturn($images);
422+
$this->fileSystemMock->expects($this->once())
423+
->method('getDirectoryRead')
424+
->willReturn($this->readMock);
425+
$this->mediaConfigMock->expects($this->any())
426+
->method('getMediaPath')
427+
->willReturnMap($mediaPath);
428+
429+
$this->readMock->expects($this->any())
430+
->method('isFile')
431+
->will($this->returnValue(false));
432+
$this->databaseMock->expects($this->any())
433+
->method('checkDbUsage')
434+
->will($this->returnValue(true));
435+
436+
$this->databaseMock->expects($this->once())
437+
->method('saveFileToFilesystem')
438+
->with('catalog/product/image_1.jpg');
439+
440+
$this->content->getImagesJson();
441+
}
368442
}

0 commit comments

Comments
 (0)