Skip to content

Commit 497e94a

Browse files
authored
Merge pull request #3922 from magento-trigger/MC-5784
- Fixed MC-5784: Image fields using imageUploader UIComponent cannot use gallery image
2 parents 77297a1 + 094dc81 commit 497e94a

File tree

4 files changed

+172
-17
lines changed

4 files changed

+172
-17
lines changed

app/code/Magento/Theme/Model/Design/Backend/File.php

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
use Magento\Theme\Model\Design\Config\FileUploader\FileProcessor;
2323

2424
/**
25+
* File Backend
26+
*
2527
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2628
*/
2729
class File extends BackendFile
@@ -88,36 +90,29 @@ public function beforeSave()
8890
{
8991
$values = $this->getValue();
9092
$value = reset($values) ?: [];
91-
if (!isset($value['file'])) {
93+
94+
// Need to check name when it is uploaded in the media gallary
95+
$file = $value['file'] ?? $value['name'] ?? null;
96+
if (!isset($file)) {
9297
throw new LocalizedException(
9398
__('%1 does not contain field \'file\'', $this->getData('field_config/field'))
9499
);
95100
}
96101
if (isset($value['exists'])) {
97-
$this->setValue($value['file']);
102+
$this->setValue($file);
98103
return $this;
99104
}
100105

101-
$filename = basename($value['file']);
102-
$result = $this->_mediaDirectory->copyFile(
103-
$this->getTmpMediaPath($filename),
104-
$this->_getUploadDir() . '/' . $filename
105-
);
106-
if ($result) {
107-
$this->_mediaDirectory->delete($this->getTmpMediaPath($filename));
108-
if ($this->_addWhetherScopeInfo()) {
109-
$filename = $this->_prependScopeInfo($filename);
110-
}
111-
$this->setValue($filename);
112-
} else {
113-
$this->unsValue();
114-
}
106+
$this->updateMediaDirectory(basename($file), $value['url']);
115107

116108
return $this;
117109
}
118110

119111
/**
120-
* @return array
112+
* After Load
113+
*
114+
* @return File
115+
* @throws LocalizedException
121116
*/
122117
public function afterLoad()
123118
{
@@ -166,6 +161,8 @@ protected function getUploadDirPath($uploadDir)
166161
}
167162

168163
/**
164+
* Get Value
165+
*
169166
* @return array
170167
*/
171168
public function getValue()
@@ -231,4 +228,49 @@ private function getMime()
231228
}
232229
return $this->mime;
233230
}
231+
232+
/**
233+
* Get Relative Media Path
234+
*
235+
* @param string $path
236+
* @return string
237+
*/
238+
private function getRelativeMediaPath(string $path): string
239+
{
240+
return str_replace('/pub/media/', '', $path);
241+
}
242+
243+
/**
244+
* Move file to the correct media directory
245+
*
246+
* @param string $filename
247+
* @param string $url
248+
* @throws LocalizedException
249+
*/
250+
private function updateMediaDirectory(string $filename, string $url)
251+
{
252+
$relativeMediaPath = $this->getRelativeMediaPath($url);
253+
$tmpMediaPath = $this->getTmpMediaPath($filename);
254+
$mediaPath = $this->_mediaDirectory->isFile($relativeMediaPath) ? $relativeMediaPath : $tmpMediaPath;
255+
$destinationMediaPath = $this->_getUploadDir() . '/' . $filename;
256+
257+
$result = $mediaPath === $destinationMediaPath;
258+
if (!$result) {
259+
$result = $this->_mediaDirectory->copyFile(
260+
$mediaPath,
261+
$destinationMediaPath
262+
);
263+
}
264+
if ($result) {
265+
if ($mediaPath === $tmpMediaPath) {
266+
$this->_mediaDirectory->delete($mediaPath);
267+
}
268+
if ($this->_addWhetherScopeInfo()) {
269+
$filename = $this->_prependScopeInfo($filename);
270+
}
271+
$this->setValue($filename);
272+
} else {
273+
$this->unsValue();
274+
}
275+
}
234276
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="NavigateToFaviconMediaFolderActionGroup">
11+
<arguments>
12+
<argument name="StoreFolder" type="string"/>
13+
</arguments>
14+
<conditionalClick selector="{{MediaGallerySection.StorageRootArrow}}" dependentSelector="{{MediaGallerySection.checkIfArrowExpand}}" stepKey="clickArrowIfClosed" visible="true"/>
15+
<waitForElement selector="{{AdminDesignConfigSection.faviconArrow}}" stepKey="waitForFaviconFolder"/>
16+
<conditionalClick selector="{{AdminDesignConfigSection.faviconArrow}}" dependentSelector="{{AdminDesignConfigSection.checkIfFaviconArrowExpand}}" stepKey="clickFaviconArrowIfClosed" visible="true"/>
17+
<waitForElement selector="{{AdminDesignConfigSection.storesArrow}}" stepKey="waitForStoresFolder"/>
18+
<conditionalClick selector="{{AdminDesignConfigSection.storesArrow}}" dependentSelector="{{AdminDesignConfigSection.checkIfStoresArrowExpand}}" stepKey="clickStoresArrowIfClosed" visible="true"/>
19+
<waitForElement selector="{{StoreFolder}}" stepKey="waitForStoreFolder"/>
20+
<click selector="{{StoreFolder}}" stepKey="clickOnCreatedFolder"/>
21+
<waitForLoadingMaskToDisappear stepKey="waitForLoading"/>
22+
</actionGroup>
23+
</actionGroups>

app/code/Magento/Theme/Test/Mftf/Section/AdminDesignConfigSection.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,22 @@
1414
<element name="watermarkSection" type="text" selector="[data-index='watermark'] .admin__fieldset-wrapper-content"/>
1515
<element name="imageUploadInputByFieldsetName" type="input" selector="//*[contains(@class,'fieldset-wrapper')][child::*[contains(@class,'fieldset-wrapper-title')]//*[contains(text(),'{{arg1}}')]]//*[contains(@class,'file-uploader')]//input" parameterized="true"/>
1616
<element name="imageUploadPreviewByFieldsetName" type="input" selector="//*[contains(@class,'fieldset-wrapper')][child::*[contains(@class,'fieldset-wrapper-title')]//*[contains(text(),'{{arg1}}')]]//*[contains(@class,'file-uploader-preview')]//img" parameterized="true"/>
17+
<element name="addSelectedFromMediaGallery" type="input" selector="//button[contains(@title,'Add Selected')]"/>
18+
<element name="htmlHeaderSection" type="text" selector="[data-index='head']"/>
19+
<element name="selectFromGalleryByFieldsetName" type="input" selector="//*[contains(@class,'fieldset-wrapper')][child::*[contains(@class,'fieldset-wrapper-title')]//*[contains(text(),'{{arg1}}')]]//*[contains(@class,'file-uploader')]//label[contains(text(), 'Select from Gallery')]" parameterized="true"/>
20+
<element name="imageUploadFromMediaGallery" type="input" selector="//input[contains(@class,'fileupload')]" />
21+
<element name="saveConfiguration" type="input" selector="//button[contains(@title, 'Save Configuration')]" />
22+
<element name="successNotification" type="text" selector="//div[contains(@data-ui-id, 'messages-message-success')]" />
23+
<element name="useDefaultByFieldsetName" type="input" selector="//*[contains(@class,'fieldset-wrapper')][child::*[contains(@class,'fieldset-wrapper-title')]//*[contains(text(),'{{arg1}}')]]//*[contains(@class,'file-uploader')]//span[contains(text(), 'Use Default Value')]" parameterized="true" />
1724
<element name="logoSectionHeader" type="text" selector="[data-index='email']"/>
1825
<element name="logoSection" type="text" selector="[data-index='email'] .admin__fieldset-wrapper-content"/>
1926
<element name="logoUpload" type ="input" selector="[name='email_logo']" />
2027
<element name="logoWrapperOpen" type ="text" selector="[data-index='email'] [data-state-collapsible ='closed']"/>
2128
<element name="logoPreview" type ="text" selector="[alt ='magento-logo.png']"/>
29+
<element name="faviconArrow" type="button" selector="#ZmF2aWNvbg-- > .jstree-icon" />
30+
<element name="checkIfFaviconArrowExpand" type="button" selector="//li[@id='ZmF2aWNvbg--' and contains(@class,'jstree-closed')]" />
31+
<element name="storesArrow" type="button" selector="#ZmF2aWNvbi9zdG9yZXM- > .jstree-icon" />
32+
<element name="checkIfStoresArrowExpand" type="button" selector="//li[@id='ZmF2aWNvbi9zdG9yZXM-' and contains(@class,'jstree-closed')]" />
33+
<element name="storeLink" type="button" selector="#ZmF2aWNvbi9zdG9yZXMvMQ-- > a"/>
2234
</section>
2335
</sections>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="AdminDesignConfigMediaGalleryImageUploadTest">
12+
<annotations>
13+
<features value="Content"/>
14+
<stories value="Content"/>
15+
<title value="MC-5784: Image fields using imageUploader UIComponent cannot use gallery image"/>
16+
<description value="Admin should be able to use Image Uploader to add Gallery Images"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="MC-13832"/>
19+
<group value="Content"/>
20+
</annotations>
21+
<before>
22+
<actionGroup ref="LoginAsAdmin" stepKey="loginToAdminArea"/>
23+
</before>
24+
<after>
25+
<actionGroup ref="logout" stepKey="logoutOfAdmin"/>
26+
</after>
27+
<!--Edit Store View-->
28+
<comment userInput="Edit Store View" stepKey="editStoreViewComment"/>
29+
<amOnPage url="{{DesignConfigPage.url}}" stepKey="navigateToDesignConfigPage" />
30+
<waitForPageLoad stepKey="waitForPageload1"/>
31+
<click selector="{{AdminDesignConfigSection.scopeRow('3')}}" stepKey="editStoreView"/>
32+
<waitForPageLoad stepKey="waitForPageload2"/>
33+
<scrollTo selector="{{AdminDesignConfigSection.htmlHeaderSection}}" stepKey="scrollToHtmlHeadSection"/>
34+
<click selector="{{AdminDesignConfigSection.htmlHeaderSection}}" stepKey="openHtmlHeadSection"/>
35+
<!--Upload Image-->
36+
<comment userInput="Upload Image" stepKey="uploadImageComment"/>
37+
<click selector="{{AdminDesignConfigSection.selectFromGalleryByFieldsetName('Head')}}" stepKey="openMediaGallery"/>
38+
<actionGroup ref="VerifyMediaGalleryStorageActions" stepKey="verifyMediaGalleryStorageBtn"/>
39+
<actionGroup ref="NavigateToMediaFolderActionGroup" stepKey="navigateToFolder">
40+
<argument name="FolderName" value="Storage Root"/>
41+
</actionGroup>
42+
<actionGroup ref="attachImage" stepKey="selectImageFromMediaStorage">
43+
<argument name="Image" value="ImageUpload3"/>
44+
</actionGroup>
45+
<actionGroup ref="saveImage" stepKey="insertImage"/>
46+
<click selector="{{AdminDesignConfigSection.saveConfiguration}}" stepKey="saveConfiguration"/>
47+
<waitForElementVisible selector="{{AdminDesignConfigSection.successNotification}}" stepKey="waitForSuccessNotification"/>
48+
<waitForPageLoad stepKey="waitForPageloadSuccess"/>
49+
<!--Edit Store View-->
50+
<comment userInput="Edit Store View" stepKey="editStoreViewComment2"/>
51+
<click selector="{{AdminDesignConfigSection.scopeRow('3')}}" stepKey="editStoreView2"/>
52+
<waitForPageLoad stepKey="waitForPageload3"/>
53+
<scrollTo selector="{{AdminDesignConfigSection.htmlHeaderSection}}" stepKey="scrollToHtmlHeadSection2"/>
54+
<click selector="{{AdminDesignConfigSection.htmlHeaderSection}}" stepKey="openHtmlHeadSection2"/>
55+
<!--Save Default Configuration-->
56+
<comment userInput="Save Default Configuration" stepKey="saveDefaultConfigurationComment"/>
57+
<click selector="{{AdminDesignConfigSection.useDefaultByFieldsetName('Head')}}" stepKey="clickUseDefault"/>
58+
<waitForElementVisible selector="{{AdminDesignConfigSection.saveConfiguration}}" stepKey="waitForWrapperToClose2"/>
59+
<click selector="{{AdminDesignConfigSection.saveConfiguration}}" stepKey="saveConfiguration2"/>
60+
<waitForElementVisible selector="{{AdminDesignConfigSection.successNotification}}" stepKey="waitForSuccessNotification2"/>
61+
<waitForPageLoad stepKey="waitForPageloadSuccess2"/>
62+
<!--Delete Image: will be in both root and favicon-->
63+
<comment userInput="Delete Image" stepKey="deleteImageComment"/>
64+
<actionGroup ref="navigateToMediaGallery" stepKey="navigateToMediaGallery"/>
65+
<actionGroup ref="NavigateToMediaFolderActionGroup" stepKey="navigateToFolder2">
66+
<argument name="FolderName" value="Storage Root"/>
67+
</actionGroup>
68+
<actionGroup ref="DeleteImageFromStorageActionGroup" stepKey="deleteImageFromStorage">
69+
<argument name="Image" value="ImageUpload3"/>
70+
</actionGroup>
71+
<actionGroup ref="NavigateToFaviconMediaFolderActionGroup" stepKey="navigateToFolder3">
72+
<argument name="StoreFolder" value="{{AdminDesignConfigSection.storeLink}}"/>
73+
</actionGroup>
74+
<actionGroup ref="DeleteImageFromStorageActionGroup" stepKey="deleteImageFromStorage2">
75+
<argument name="Image" value="ImageUpload3"/>
76+
</actionGroup>
77+
</test>
78+
</tests>

0 commit comments

Comments
 (0)