Skip to content

Commit 7851672

Browse files
Merge remote-tracking branch 'remotes/github/MC-17218' into EPAM-PR-64
2 parents 3f0049b + 3a818b2 commit 7851672

File tree

5 files changed

+136
-17
lines changed

5 files changed

+136
-17
lines changed

app/code/Magento/MediaStorage/Console/Command/ImagesResizeCommand.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ protected function configure()
7676
protected function execute(InputInterface $input, OutputInterface $output)
7777
{
7878
try {
79+
$errors = [];
7980
$this->appState->setAreaCode(Area::AREA_GLOBAL);
8081
$generator = $this->resize->resizeFromThemes();
8182

@@ -95,7 +96,15 @@ protected function execute(InputInterface $input, OutputInterface $output)
9596
}
9697

9798
while ($generator->valid()) {
98-
$progress->setMessage($generator->key());
99+
$resizeInfo = $generator->key();
100+
$error = $resizeInfo['error'];
101+
$filename = $resizeInfo['filename'];
102+
103+
if ($error !== '') {
104+
$errors[$filename] = $error;
105+
}
106+
107+
$progress->setMessage($filename);
99108
$progress->advance();
100109
$generator->next();
101110
}
@@ -106,7 +115,14 @@ protected function execute(InputInterface $input, OutputInterface $output)
106115
}
107116

108117
$output->write(PHP_EOL);
109-
$output->writeln("<info>Product images resized successfully</info>");
118+
if (count($errors)) {
119+
$output->writeln("<info>Product images resized with errors:</info>");
120+
foreach ($errors as $error) {
121+
$output->writeln("<error>{$error}</error>");
122+
}
123+
} else {
124+
$output->writeln("<info>Product images resized successfully</info>");
125+
}
110126

111127
return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
112128
}

app/code/Magento/MediaStorage/Service/ImageResize.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,21 @@ public function resizeFromThemes(array $themes = null): \Generator
161161
$viewImages = $this->getViewImages($themes ?? $this->getThemesInUse());
162162

163163
foreach ($productImages as $image) {
164+
$error = '';
164165
$originalImageName = $image['filepath'];
165166
$originalImagePath = $this->mediaDirectory->getAbsolutePath(
166167
$this->imageConfig->getMediaPath($originalImageName)
167168
);
168-
foreach ($viewImages as $viewImage) {
169-
$this->resize($viewImage, $originalImagePath, $originalImageName);
169+
170+
if ($this->mediaDirectory->isFile($originalImagePath)) {
171+
foreach ($viewImages as $viewImage) {
172+
$this->resize($viewImage, $originalImagePath, $originalImageName);
173+
}
174+
} else {
175+
$error = __('Cannot resize image "%1" - original image not found', $originalImagePath);
170176
}
171-
yield $originalImageName => $count;
177+
178+
yield ['filename' => $originalImageName, 'error' => $error] => $count;
172179
}
173180
}
174181

dev/tests/integration/testsuite/Magento/MediaStorage/Console/Command/ImageResizeCommandTest.php

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
declare(strict_types=1);
6+
declare(strict_types = 1);
77

88
namespace Magento\MediaStorage\Console\Command;
99

@@ -15,10 +15,11 @@
1515
use Magento\Framework\ObjectManagerInterface;
1616
use Magento\TestFramework\Helper\Bootstrap;
1717
use Symfony\Component\Console\Tester\CommandTester;
18+
use Symfony\Component\Console\Input\ArgvInput;
19+
use Symfony\Component\Console\Output\ConsoleOutput;
1820

1921
/**
2022
* Test for \Magento\MediaStorage\Console\Command\ImagesResizeCommand.
21-
*
2223
*/
2324
class ImageResizeCommandTest extends \PHPUnit\Framework\TestCase
2425
{
@@ -37,6 +38,21 @@ class ImageResizeCommandTest extends \PHPUnit\Framework\TestCase
3738
*/
3839
private $objectManager;
3940

41+
/**
42+
* @var \Magento\MediaStorage\Console\Command\ImagesResizeCommand
43+
*/
44+
private $imageResizeCommand;
45+
46+
/**
47+
* @var ArgvInput
48+
*/
49+
private $input;
50+
51+
/**
52+
* @var ConsoleOutput
53+
*/
54+
private $output;
55+
4056
/**
4157
* @var WriteInterface
4258
*/
@@ -53,18 +69,37 @@ class ImageResizeCommandTest extends \PHPUnit\Framework\TestCase
5369
private $fileName;
5470

5571
/**
56-
* @inheritdoc
72+
* @inheritDoc
5773
*/
58-
public function setUp()
74+
protected function setUp()
5975
{
60-
$this->fileName = 'image.jpg';
76+
parent::setUp();
77+
6178
$this->objectManager = Bootstrap::getObjectManager();
79+
$this->imageResizeCommand = $this->objectManager->create(
80+
\Magento\MediaStorage\Console\Command\ImagesResizeCommand::class
81+
);
82+
83+
$this->input = $this->objectManager->create(ArgvInput::class, ['argv' => ['catalog:image:resize']]);
84+
$this->output = $this->objectManager->create(ConsoleOutput::class);
85+
$this->fileName = 'image.jpg';
6286
$this->command = $this->objectManager->get(ImagesResizeCommand::class);
6387
$this->tester = new CommandTester($this->command);
6488
$this->filesystem = $this->objectManager->get(Filesystem::class);
6589
$this->mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA);
6690
}
6791

92+
/**
93+
* Test that catalog:image:resize command executed successfully with missing image file
94+
*
95+
* @magentoDataFixture Magento/MediaStorage/_files/product_with_missed_image.php
96+
*/
97+
public function testRunResizeWithMissingFile()
98+
{
99+
$resultCode = $this->imageResizeCommand->run($this->input, $this->output);
100+
$this->assertSame($resultCode, 0);
101+
}
102+
68103
/**
69104
* Test command with zero byte file
70105
*
@@ -95,13 +130,6 @@ public function testExecuteWithZeroByteImage()
95130

96131
$this->tester->execute([]);
97132
$this->assertContains('Wrong file', $this->tester->getDisplay());
98-
}
99-
100-
/**
101-
* @inheritDoc
102-
*/
103-
public function tearDown()
104-
{
105133
$this->mediaDirectory->getDriver()->deleteFile($this->mediaDirectory->getAbsolutePath($this->fileName));
106134
}
107135
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
use Magento\Framework\App\Filesystem\DirectoryList;
9+
10+
require dirname(__DIR__, 2) . '/Catalog/_files/product_image.php';
11+
require dirname(__DIR__, 2) . '/Catalog/_files/product_simple.php';
12+
13+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
14+
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
15+
$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
16+
$product = $productRepository->get('simple');
17+
$product->setStoreId(0)
18+
->setImage('/m/a/magento_image.jpg')
19+
->setSmallImage('/m/a/magento_image.jpg')
20+
->setThumbnail('/m/a/magento_image.jpg')
21+
->setData(
22+
'media_gallery',
23+
[
24+
'images' => [
25+
[
26+
'file' => '/m/a/magento_image.jpg',
27+
'position' => 1,
28+
'label' => 'Image Alt Text',
29+
'disabled' => 0,
30+
'media_type' => 'image',
31+
],
32+
],
33+
]
34+
)->save();
35+
$image = array_shift($product->getData('media_gallery')['images']);
36+
$product = $productRepository->get('simple', false, 1, true);
37+
$product->setData(
38+
'media_gallery',
39+
[
40+
'images' => [
41+
[
42+
'value_id' => $image['value_id'],
43+
'file' => $image['file'],
44+
'disabled' => 1,
45+
'media_type' => 'image',
46+
],
47+
],
48+
]
49+
);
50+
$productRepository->save($product);
51+
52+
$mediaDirectory = $objectManager->get(\Magento\Framework\Filesystem::class)
53+
->getDirectoryWrite(DirectoryList::MEDIA);
54+
55+
$config = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
56+
\Magento\Catalog\Model\Product\Media\Config::class
57+
);
58+
59+
$mediaDirectory->delete($config->getBaseMediaPath() . '/m/a/magento_image.jpg');
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
require dirname(__DIR__, 2) . '/Catalog/_files/product_image_rollback.php';
9+
require dirname(__DIR__, 2) . '/Catalog/_files/product_simple_rollback.php';

0 commit comments

Comments
 (0)