55 */
66namespace Magento \Catalog \Model \Category \Attribute \Backend ;
77
8+ use Magento \Catalog \Model \ImageUploader ;
89use Magento \Framework \App \Filesystem \DirectoryList ;
10+ use Magento \Framework \App \ObjectManager ;
911use Magento \Framework \File \Uploader ;
12+ use Magento \Store \Api \Data \StoreInterface ;
13+ use Magento \Store \Model \StoreManagerInterface ;
1014
1115/**
1216 * Catalog category image attribute backend model
@@ -45,7 +49,7 @@ class Image extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
4549 protected $ _logger ;
4650
4751 /**
48- * @var \Magento\Catalog\Model\ ImageUploader
52+ * @var ImageUploader
4953 */
5054 private $ imageUploader ;
5155
@@ -54,19 +58,32 @@ class Image extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
5458 */
5559 private $ additionalData = '_additional_data_ ' ;
5660
61+ /**
62+ * @var StoreManagerInterface
63+ */
64+ private $ storeManager ;
65+
5766 /**
5867 * @param \Psr\Log\LoggerInterface $logger
5968 * @param \Magento\Framework\Filesystem $filesystem
6069 * @param \Magento\MediaStorage\Model\File\UploaderFactory $fileUploaderFactory
70+ * @param StoreManagerInterface $storeManager
71+ * @param ImageUploader $imageUploader
6172 */
6273 public function __construct (
6374 \Psr \Log \LoggerInterface $ logger ,
6475 \Magento \Framework \Filesystem $ filesystem ,
65- \Magento \MediaStorage \Model \File \UploaderFactory $ fileUploaderFactory
76+ \Magento \MediaStorage \Model \File \UploaderFactory $ fileUploaderFactory ,
77+ StoreManagerInterface $ storeManager = null ,
78+ ImageUploader $ imageUploader = null
6679 ) {
6780 $ this ->_filesystem = $ filesystem ;
6881 $ this ->_fileUploaderFactory = $ fileUploaderFactory ;
6982 $ this ->_logger = $ logger ;
83+ $ this ->storeManager = $ storeManager ??
84+ ObjectManager::getInstance ()->get (StoreManagerInterface::class);
85+ $ this ->imageUploader = $ imageUploader ??
86+ ObjectManager::getInstance ()->get (ImageUploader::class);
7087 }
7188
7289 /**
@@ -91,16 +108,17 @@ private function getUploadedImageName($value)
91108 *
92109 * @param string $imageName
93110 * @return string
111+ * @throws \Magento\Framework\Exception\FileSystemException
94112 */
95113 private function checkUniqueImageName (string $ imageName ): string
96114 {
97- $ imageUploader = $ this ->getImageUploader ();
98115 $ mediaDirectory = $ this ->_filesystem ->getDirectoryWrite (DirectoryList::MEDIA );
99116 $ imageAbsolutePath = $ mediaDirectory ->getAbsolutePath (
100- $ imageUploader ->getBasePath () . DIRECTORY_SEPARATOR . $ imageName
117+ $ this -> imageUploader ->getBasePath () . DIRECTORY_SEPARATOR . $ imageName
101118 );
102119
103- $ imageName = Uploader::getNewFilename ($ imageAbsolutePath );
120+ // phpcs:ignore Magento2.Functions.DiscouragedFunction
121+ $ imageName = call_user_func ([Uploader::class, 'getNewFilename ' ], $ imageAbsolutePath );
104122
105123 return $ imageName ;
106124 }
@@ -112,14 +130,26 @@ private function checkUniqueImageName(string $imageName): string
112130 *
113131 * @param \Magento\Framework\DataObject $object
114132 * @return $this
133+ * @throws \Magento\Framework\Exception\FileSystemException
115134 * @since 101.0.8
116135 */
117136 public function beforeSave ($ object )
118137 {
119138 $ attributeName = $ this ->getAttribute ()->getName ();
120139 $ value = $ object ->getData ($ attributeName );
121140
122- if ($ this ->fileResidesOutsideCategoryDir ($ value )) {
141+ if ($ this ->isTmpFileAvailable ($ value ) && $ imageName = $ this ->getUploadedImageName ($ value )) {
142+ try {
143+ /** @var StoreInterface $store */
144+ $ store = $ this ->storeManager ->getStore ();
145+ $ baseMediaDir = $ store ->getBaseMediaDir ();
146+ $ newImgRelativePath = $ this ->imageUploader ->moveFileFromTmp ($ imageName , true );
147+ $ value [0 ]['url ' ] = '/ ' . $ baseMediaDir . '/ ' . $ newImgRelativePath ;
148+ $ value [0 ]['name ' ] = $ value [0 ]['url ' ];
149+ } catch (\Exception $ e ) {
150+ $ this ->_logger ->critical ($ e );
151+ }
152+ } elseif ($ this ->fileResidesOutsideCategoryDir ($ value )) {
123153 // use relative path for image attribute so we know it's outside of category dir when we fetch it
124154 // phpcs:ignore Magento2.Functions.DiscouragedFunction
125155 $ value [0 ]['url ' ] = parse_url ($ value [0 ]['url ' ], PHP_URL_PATH );
@@ -139,23 +169,6 @@ public function beforeSave($object)
139169 return parent ::beforeSave ($ object );
140170 }
141171
142- /**
143- * Get Instance of Category Image Uploader.
144- *
145- * @return \Magento\Catalog\Model\ImageUploader
146- *
147- * @deprecated 101.0.0
148- */
149- private function getImageUploader ()
150- {
151- if ($ this ->imageUploader === null ) {
152- $ this ->imageUploader = \Magento \Framework \App \ObjectManager::getInstance ()
153- ->get (\Magento \Catalog \CategoryImageUpload::class);
154- }
155-
156- return $ this ->imageUploader ;
157- }
158-
159172 /**
160173 * Check if temporary file is available for new image upload.
161174 *
@@ -194,19 +207,10 @@ private function fileResidesOutsideCategoryDir($value)
194207 *
195208 * @param \Magento\Framework\DataObject $object
196209 * @return \Magento\Catalog\Model\Category\Attribute\Backend\Image
210+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
197211 */
198212 public function afterSave ($ object )
199213 {
200- $ value = $ object ->getData ($ this ->additionalData . $ this ->getAttribute ()->getName ());
201-
202- if ($ this ->isTmpFileAvailable ($ value ) && $ imageName = $ this ->getUploadedImageName ($ value )) {
203- try {
204- $ this ->getImageUploader ()->moveFileFromTmp ($ imageName );
205- } catch (\Exception $ e ) {
206- $ this ->_logger ->critical ($ e );
207- }
208- }
209-
210214 return $ this ;
211215 }
212216}
0 commit comments