diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php index f61f9071155aa915d3d06e4ef66fa0de29fa100f..262ba8cccc27e0e8ee179dc64ae59e0366c9e21f 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php @@ -16,6 +16,7 @@ namespace Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery; use Magento\Backend\Block\Media\Uploader; use Magento\Framework\View\Element\AbstractBlock; use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Exception\FileSystemException; class Content extends \Magento\Backend\Block\Widget { @@ -34,6 +35,16 @@ class Content extends \Magento\Backend\Block\Widget */ protected $_jsonEncoder; + /** + * @var \Magento\Catalog\Helper\Image + */ + private $imageHelper; + + /** + * @var \Magento\Framework\View\Asset\Repository + */ + private $assetRepo; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder @@ -128,12 +139,22 @@ class Content extends \Magento\Backend\Block\Widget is_array($value['images']) && count($value['images']) ) { - $directory = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA); + $mediaDir = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA); $images = $this->sortImagesByPosition($value['images']); foreach ($images as &$image) { $image['url'] = $this->_mediaConfig->getMediaUrl($image['file']); - $fileHandler = $directory->stat($this->_mediaConfig->getMediaPath($image['file'])); - $image['size'] = $fileHandler['size']; + try { + $fileHandler = $mediaDir->stat($this->_mediaConfig->getMediaPath($image['file'])); + $image['size'] = $fileHandler['size']; + } catch (FileSystemException $e) { + $staticDir = $this->_filesystem->getDirectoryRead(DirectoryList::STATIC_VIEW); + $image['url'] = $this->getImageHelper()->getDefaultPlaceholderUrl('thumbnail'); + $fileHandler = $staticDir->stat( + $this->getAssetRepo()->createAsset($this->getImageHelper()->getPlaceholder('thumbnail'))->getPath() + ); + $image['size'] = $fileHandler['size']; + $this->_logger->warning($e); + } } return $this->_jsonEncoder->encode($images); } @@ -227,4 +248,31 @@ class Content extends \Magento\Backend\Block\Widget { return $this->_jsonEncoder->encode($this->getImageTypes()); } + + /** + * @return \Magento\Catalog\Helper\Image + * @deprecated + */ + private function getImageHelper() + { + if ($this->imageHelper === null) { + $this->imageHelper = \Magento\Framework\App\ObjectManager::getInstance() + ->get('Magento\Catalog\Helper\Image'); + } + return $this->imageHelper; + } + + /** + * @return \Magento\Framework\View\Asset\Repository + * @deprecated + */ + private function getAssetRepo() + { + if ($this->assetRepo === null) { + $this->assetRepo = \Magento\Framework\App\ObjectManager::getInstance() + ->get('\Magento\Framework\View\Asset\Repository'); + } + + return $this->assetRepo; + } } diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php index 72a25933efa0be60c575128021c0a1816b4bfbe2..33faf5963c91014fa1bd7be34cf2dd961a87fe34 100644 --- a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php @@ -7,6 +7,7 @@ namespace Magento\Catalog\Test\Unit\Block\Adminhtml\Product\Helper\Form\Gallery; use Magento\Framework\Filesystem; use Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery\Content; +use Magento\Framework\Phrase; class ContentTest extends \PHPUnit_Framework_TestCase { @@ -40,6 +41,16 @@ class ContentTest extends \PHPUnit_Framework_TestCase */ protected $galleryMock; + /** + * @var \Magento\Catalog\Helper\Image|\PHPUnit_Framework_MockObject_MockObject + */ + protected $imageHelper; + + /** + * @var \Magento\Framework\View\Asset\Repository|\PHPUnit_Framework_MockObject_MockObject + */ + protected $assetRepo; + /** * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ @@ -47,7 +58,13 @@ class ContentTest extends \PHPUnit_Framework_TestCase public function setUp() { - $this->fileSystemMock = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); + $this->fileSystemMock = $this->getMock( + 'Magento\Framework\Filesystem', + ['stat', 'getDirectoryRead'], + [], + '', + false + ); $this->readMock = $this->getMock('Magento\Framework\Filesystem\Directory\ReadInterface'); $this->galleryMock = $this->getMock( 'Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery', @@ -56,7 +73,13 @@ class ContentTest extends \PHPUnit_Framework_TestCase '', false ); - $this->mediaConfigMock = $this->getMock('Magento\Catalog\Model\Product\Media\Config', [], [], '', false); + $this->mediaConfigMock = $this->getMock( + 'Magento\Catalog\Model\Product\Media\Config', + ['getMediaUrl', 'getMediaPath'], + [], + '', + false + ); $this->jsonEncoderMock = $this->getMockBuilder('Magento\Framework\Json\EncoderInterface') ->disableOriginalConstructor() ->getMock(); @@ -130,7 +153,6 @@ class ContentTest extends \PHPUnit_Framework_TestCase $this->mediaConfigMock->expects($this->any())->method('getMediaUrl')->willReturnMap($url); $this->mediaConfigMock->expects($this->any())->method('getMediaPath')->willReturnMap($mediaPath); - $this->readMock->expects($this->any())->method('stat')->willReturnMap($sizeMap); $this->jsonEncoderMock->expects($this->once())->method('encode')->willReturnCallback('json_encode'); @@ -144,4 +166,92 @@ class ContentTest extends \PHPUnit_Framework_TestCase $this->assertSame('[]', $this->content->getImagesJson()); } + + public function testGetImagesJsonWithException() + { + $this->imageHelper = $this->getMockBuilder('Magento\Catalog\Helper\Image') + ->disableOriginalConstructor() + ->setMethods(['getDefaultPlaceholderUrl', 'getPlaceholder']) + ->getMock(); + + $this->assetRepo = $this->getMockBuilder('Magento\Framework\View\Asset\Repository') + ->disableOriginalConstructor() + ->setMethods(['createAsset', 'getPath']) + ->getMock(); + + $this->objectManager->setBackwardCompatibleProperty( + $this->content, + 'imageHelper', + $this->imageHelper + ); + + $this->objectManager->setBackwardCompatibleProperty( + $this->content, + 'assetRepo', + $this->assetRepo + ); + + $placeholderUrl = 'url_to_the_placeholder/placeholder.jpg'; + + $sizePlaceholder = ['size' => 399659]; + + $imagesResult = [ + [ + 'value_id' => '2', + 'file' => 'file_2.jpg', + 'media_type' => 'image', + 'position' => '0', + 'url' => 'url_to_the_placeholder/placeholder.jpg', + 'size' => 399659 + ], + [ + 'value_id' => '1', + 'file' => 'file_1.jpg', + 'media_type' => 'image', + 'position' => '1', + 'url' => 'url_to_the_placeholder/placeholder.jpg', + 'size' => 399659 + ] + ]; + + $images = [ + 'images' => [ + [ + 'value_id' => '1', + 'file' => 'file_1.jpg', + 'media_type' => 'image', + 'position' => '1' + ], + [ + 'value_id' => '2', + 'file' => 'file_2.jpg', + 'media_type' => 'image', + 'position' => '0' + ] + ] + ]; + + $this->content->setElement($this->galleryMock); + $this->galleryMock->expects($this->once())->method('getImages')->willReturn($images); + $this->fileSystemMock->expects($this->any())->method('getDirectoryRead')->willReturn($this->readMock); + $this->mediaConfigMock->expects($this->any())->method('getMediaUrl'); + $this->mediaConfigMock->expects($this->any())->method('getMediaPath'); + $this->readMock->expects($this->any())->method('stat')->willReturnOnConsecutiveCalls( + $this->throwException( + new \Magento\Framework\Exception\FileSystemException(new \Magento\Framework\Phrase('test')) + ), + $sizePlaceholder, + $this->throwException( + new \Magento\Framework\Exception\FileSystemException(new \Magento\Framework\Phrase('test')) + ), + $sizePlaceholder + ); + $this->imageHelper->expects($this->any())->method('getDefaultPlaceholderUrl')->willReturn($placeholderUrl); + $this->imageHelper->expects($this->any())->method('getPlaceholder'); + $this->assetRepo->expects($this->any())->method('createAsset')->willReturnSelf(); + $this->assetRepo->expects($this->any())->method('getPath'); + $this->jsonEncoderMock->expects($this->once())->method('encode')->willReturnCallback('json_encode'); + + $this->assertSame(json_encode($imagesResult), $this->content->getImagesJson()); + } }