Skip to content

Commit 202f48e

Browse files
committed
PB-341: Save content as template
- Create thumbnail of screenshot
1 parent b634d85 commit 202f48e

File tree

7 files changed

+93
-10
lines changed

7 files changed

+93
-10
lines changed

app/code/Magento/PageBuilder/Api/Data/TemplateInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ public function getPreviewImage() : string;
7272
*/
7373
public function setPreviewImage(string $path) : TemplateInterface;
7474

75+
/**
76+
* Get the thumbnail image for the preview
77+
*
78+
* @return string
79+
*/
80+
public function getPreviewThumbnailImage() : string;
81+
7582
/**
7683
* Retrieve template value
7784
*

app/code/Magento/PageBuilder/Controller/Adminhtml/Template/Save.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Magento\PageBuilder\Api\TemplateRepositoryInterface;
2525
use Magento\PageBuilder\Model\TemplateFactory;
2626
use Psr\Log\LoggerInterface;
27+
use Magento\Framework\Image\AdapterFactory;
2728

2829
/**
2930
* Save a template within template manager
@@ -74,6 +75,11 @@ class Save extends Action implements HttpPostActionInterface
7475
*/
7576
private $mediaStorage;
7677

78+
/**
79+
* @var AdapterFactory
80+
*/
81+
private $imageAdapterFactory;
82+
7783
/**
7884
* @param Context $context
7985
* @param LoggerInterface $logger
@@ -84,6 +90,7 @@ class Save extends Action implements HttpPostActionInterface
8490
* @param ImageContentValidator $imageContentValidator
8591
* @param ImageContentFactory $imageContentFactory
8692
* @param Database $mediaStorage
93+
* @param AdapterFactory $imageAdapterFactory
8794
*/
8895
public function __construct(
8996
Context $context,
@@ -94,7 +101,8 @@ public function __construct(
94101
Filesystem $filesystem,
95102
ImageContentValidator $imageContentValidator,
96103
ImageContentFactory $imageContentFactory,
97-
Database $mediaStorage
104+
Database $mediaStorage,
105+
AdapterFactory $imageAdapterFactory
98106
) {
99107
parent::__construct($context);
100108

@@ -106,6 +114,7 @@ public function __construct(
106114
$this->imageContentValidator = $imageContentValidator;
107115
$this->imageContentFactory = $imageContentFactory;
108116
$this->mediaStorage = $mediaStorage;
117+
$this->imageAdapterFactory = $imageAdapterFactory;
109118
}
110119

111120
/**
@@ -142,6 +151,8 @@ public function execute()
142151
// Store the preview image within the new entity
143152
$template->setPreviewImage($filePath);
144153
} catch (\Exception $e) {
154+
echo $e->getMessage();
155+
exit;
145156
$this->logger->critical($e);
146157

147158
return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData(
@@ -252,6 +263,13 @@ private function storePreviewImage(RequestInterface $request) : ?string
252263
);
253264
}
254265

266+
// Generate a thumbnail, called -thumb next to the image for usage in the grid
267+
$absolutePath = $mediaDir->getAbsolutePath() . $filePath;
268+
$imageFactory = $this->imageAdapterFactory->create();
269+
$imageFactory->open($absolutePath);
270+
$imageFactory->resize(350);
271+
$imageFactory->save(str_replace('.jpg', '-thumb.jpg', $absolutePath));
272+
255273
// Store the preview image within the new entity
256274
return $filePath;
257275
}

app/code/Magento/PageBuilder/Model/Template.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@ public function setPreviewImage(string $path) : TemplateInterface
6262
return $this->setData(TemplateInterface::KEY_PREVIEW_IMAGE, $path);
6363
}
6464

65+
/**
66+
* @inheritDoc
67+
*/
68+
public function getPreviewThumbnailImage() : string
69+
{
70+
return str_replace(
71+
'.jpg',
72+
'-thumb.jpg',
73+
$this->getData(TemplateInterface::KEY_PREVIEW_IMAGE)
74+
);
75+
}
76+
6577
/**
6678
* @inheritDoc
6779
*/

app/code/Magento/PageBuilder/Model/TemplateRepository.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ public function delete(TemplateInterface $template) : bool
146146
if ($mediaDir->isExist($previewImage)) {
147147
$mediaDir->delete($previewImage);
148148
}
149+
if ($mediaDir->isExist($templateModel->getPreviewThumbnailImage())) {
150+
$mediaDir->delete($templateModel->getPreviewThumbnailImage());
151+
}
149152
} catch (\Exception $exception) {
150153
throw new CouldNotDeleteException(
151154
__('Could not delete the Template: %1', $exception->getMessage())

app/code/Magento/PageBuilder/Ui/Component/Listing/Columns/PreviewImage.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function prepareDataSource(array $dataSource)
5858
foreach ($dataSource['data']['items'] as & $item) {
5959
$previewImage = $item[$fieldName];
6060
$imageSrc = $this->urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]) . $previewImage;
61-
$item[$fieldName . '_src'] = $imageSrc;
61+
$item[$fieldName . '_src'] = str_replace('.jpg', '-thumb.jpg', $imageSrc);
6262
$item[$fieldName . '_alt'] = $this->getAlt($item);
6363
$item[$fieldName . '_link'] = null;
6464
$item[$fieldName . '_orig_src'] = $imageSrc;

app/code/Magento/PageBuilder/view/adminhtml/web/js/grid/columns/preview-image.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ define([
3535
return row[this.index + '_src'];
3636
},
3737

38+
/**
39+
* Retrieve the original images src to be displayed at full size in the modal
40+
*
41+
* @param {Object} row
42+
* @returns {*}
43+
*/
44+
getOrigSrc: function (row) {
45+
return row[this.index + '_orig_src'];
46+
},
47+
3848
/**
3949
* Get alternative text data per row.
4050
*
@@ -63,7 +73,7 @@ define([
6373
var modalHtml = mageTemplate(
6474
thumbnailPreviewTemplate,
6575
{
66-
src: this.getSrc(row),
76+
src: this.getOrigSrc(row),
6777
alt: this.getAlt(row)
6878
}
6979
),

dev/tests/integration/testsuite/Magento/PageBuilder/Controller/Adminhtml/Template/SaveTest.php

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88

99
namespace Magento\PageBuilder\Controller\Adminhtml\Template;
1010

11-
use Magento\PageBuilder\Api\TemplateRepositoryInterface;
12-
use Magento\TestFramework\Helper\Bootstrap;
13-
use Magento\TestFramework\ObjectManager;
1411
use Magento\Framework\App\Request\Http as HttpRequest;
15-
use Magento\Framework\Serialize\Serializer\Json;
16-
use Magento\MediaStorage\Helper\File\Storage\Database;
1712
use Magento\Framework\Filesystem;
1813
use Magento\Framework\Filesystem\Directory\Write;
14+
use Magento\Framework\Image\Adapter\Gd2;
15+
use Magento\Framework\Image\AdapterFactory;
16+
use Magento\Framework\Serialize\Serializer\Json;
17+
use Magento\MediaStorage\Helper\File\Storage\Database;
18+
use Magento\PageBuilder\Api\TemplateRepositoryInterface;
19+
use Magento\TestFramework\Helper\Bootstrap;
20+
use Magento\TestFramework\ObjectManager;
1921

2022
/**
2123
* Perform tests upon Template save controller
@@ -59,6 +61,16 @@ class SaveTest extends \Magento\TestFramework\TestCase\AbstractBackendController
5961
*/
6062
private $serializer;
6163

64+
/**
65+
* @var Gd2|\PHPUnit_Framework_MockObject_MockObject
66+
*/
67+
private $imageAdapter;
68+
69+
/**
70+
* @var AdapterFactory|\PHPUnit_Framework_MockObject_MockObject
71+
*/
72+
private $imageAdapterFactory;
73+
6274
/**
6375
* @inheritDoc
6476
*/
@@ -69,7 +81,7 @@ protected function setUp()
6981
$this->templateRepository = $this->objectManager->get(TemplateRepositoryInterface::class);
7082

7183
$this->directoryWrite = $this->getMockBuilder(Write::class)
72-
->setMethods(['writeFile'])
84+
->setMethods(['writeFile', 'getAbsolutePath'])
7385
->disableOriginalConstructor()
7486
->getMock();
7587
$this->filesystem = $this->getMockBuilder(Filesystem::class)
@@ -82,11 +94,22 @@ protected function setUp()
8294
->disableOriginalConstructor()
8395
->getMock();
8496

97+
$this->imageAdapter = $this->getMockBuilder(Gd2::class)
98+
->setMethods(['open', 'resize', 'save'])
99+
->disableOriginalConstructor()
100+
->getMock();
101+
102+
$this->imageAdapterFactory = $this->getMockBuilder(AdapterFactory::class)
103+
->setMethods(['create'])
104+
->disableOriginalConstructor()
105+
->getMock();
106+
85107
$this->saveController = $this->objectManager->create(
86108
\Magento\PageBuilder\Controller\Adminhtml\Template\Save::class,
87109
[
88110
'filesystem' => $this->filesystem,
89-
'mediaStorage' => $this->mediaStorage
111+
'mediaStorage' => $this->mediaStorage,
112+
'imageAdapterFactory' => $this->imageAdapterFactory
90113
]
91114
);
92115

@@ -113,6 +136,16 @@ public function testSaveAction()
113136
$this->anything()
114137
);
115138

139+
$this->imageAdapterFactory->expects($this->once())
140+
->method('create')
141+
->willReturn($this->imageAdapter);
142+
143+
$this->imageAdapter->expects($this->once())
144+
->method('save')
145+
->with(
146+
$this->stringContains('-thumb.jpg')
147+
);
148+
116149
$this->filesystem->expects($this->once())
117150
->method('getDirectoryWrite')
118151
->willReturn($this->directoryWrite);

0 commit comments

Comments
 (0)