From 03d43a6fd517adb3f580b1da4995dc5d36c10c10 Mon Sep 17 00:00:00 2001
From: Oleksandr Karpenko <okarpenko@ebay.com>
Date: Thu, 7 Apr 2016 14:52:24 +0300
Subject: [PATCH] MAGETWO-51604: [TD] Add functionality to save image in custom
 folder

---
 .../Theme/Model/Design/Backend/File.php       |  62 ++++++--
 .../Design/Config/FileUploader/Config.php     | 147 ------------------
 .../Config/FileUploader/FileProcessor.php     |  75 +++++++--
 3 files changed, 112 insertions(+), 172 deletions(-)
 delete mode 100644 app/code/Magento/Theme/Model/Design/Config/FileUploader/Config.php

diff --git a/app/code/Magento/Theme/Model/Design/Backend/File.php b/app/code/Magento/Theme/Model/Design/Backend/File.php
index 52e4b3a35e6..5cfce8dc64b 100644
--- a/app/code/Magento/Theme/Model/Design/Backend/File.php
+++ b/app/code/Magento/Theme/Model/Design/Backend/File.php
@@ -15,15 +15,16 @@ use Magento\Framework\Filesystem;
 use Magento\Framework\Model\Context;
 use Magento\Framework\Model\ResourceModel\AbstractResource;
 use Magento\Framework\Registry;
+use Magento\Framework\UrlInterface;
 use Magento\MediaStorage\Model\File\UploaderFactory;
-use Magento\Theme\Model\Design\Config\FileUploader\Config;
+use Magento\Theme\Model\Design\Config\FileUploader\FileProcessor;
 
 class File extends BackendFile
 {
     /**
-     * @var Config
+     * @var UrlInterface
      */
-    protected $fileConfig;
+    protected $urlBuilder;
 
     /**
      * @param Context $context
@@ -33,10 +34,11 @@ class File extends BackendFile
      * @param UploaderFactory $uploaderFactory
      * @param RequestDataInterface $requestData
      * @param Filesystem $filesystem
-     * @param Config $fileConfig
+     * @param UrlInterface $urlBuilder
      * @param AbstractResource|null $resource
      * @param AbstractDb|null $resourceCollection
      * @param array $data
+     * @internal param Config $fileConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -47,7 +49,7 @@ class File extends BackendFile
         UploaderFactory $uploaderFactory,
         RequestDataInterface $requestData,
         Filesystem $filesystem,
-        Config $fileConfig,
+        UrlInterface $urlBuilder,
         AbstractResource $resource = null,
         AbstractDb $resourceCollection = null,
         array $data = []
@@ -64,7 +66,7 @@ class File extends BackendFile
             $resourceCollection,
             $data
         );
-        $this->fileConfig = $fileConfig;
+        $this->urlBuilder = $urlBuilder;
     }
 
     /**
@@ -88,11 +90,11 @@ class File extends BackendFile
         }
         $filename = $value['file'];
         $result = $this->_mediaDirectory->copyFile(
-            $this->fileConfig->getTmpMediaPath($filename),
+            $this->getTmpMediaPath($filename),
             $this->_getUploadDir() . '/' . $filename
         );
         if ($result) {
-            $this->_mediaDirectory->delete($this->fileConfig->getTmpMediaPath($filename));
+            $this->_mediaDirectory->delete($this->getTmpMediaPath($filename));
             if ($this->_addWhetherScopeInfo()) {
                 $filename = $this->_prependScopeInfo($filename);
             }
@@ -112,15 +114,19 @@ class File extends BackendFile
         $value = $this->getValue();
         if ($value && !is_array($value)) {
             $fileName = $this->_getUploadDir() . '/' . basename($value);
-            $stat = $this->_mediaDirectory->stat($fileName);
-            $this->setValue([
-                [
-                    'url' => $this->fileConfig->getStoreMediaUrl() .  $fileName,
+            $fileInfo = [];
+            if ($this->_mediaDirectory->isExist($fileName)) {
+                $stat = $this->_mediaDirectory->stat($fileName);
+                $url = $this->getStoreMediaUrl($value);
+
+                $fileInfo = [
+                    'url' => $url,
                     'file' => $value,
                     'size' => is_array($stat) ? $stat['size'] : 0,
                     'exists' => true
-                ]
-            ]);
+                ];
+            }
+            $this->setValue([$fileInfo]);
         }
         return $this;
     }
@@ -153,4 +159,32 @@ class File extends BackendFile
     {
         return $this->getData('value') ?: [];
     }
+
+    /**
+     * Retrieve store media url
+     *
+     * @param string $fileName
+     * @return mixed
+     */
+    public function getStoreMediaUrl($fileName)
+    {
+        $fieldConfig = $this->getFieldConfig();
+        if (isset($fieldConfig['base_url'])) {
+            $baseUrl = $fieldConfig['base_url'];
+            $urlType = empty($baseUrl['type']) ? 'link' : (string)$baseUrl['type'];
+            $fileName = $this->urlBuilder->getBaseUrl(['_type' => $urlType]) . $baseUrl['value'] . '/' . $fileName;
+        }
+        return $fileName;
+    }
+
+    /**
+     * Retrieve temp media path
+     *
+     * @param string $filename
+     * @return string
+     */
+    public function getTmpMediaPath($filename)
+    {
+        return 'tmp/' . FileProcessor::FILE_DIR . '/' . $filename;
+    }
 }
diff --git a/app/code/Magento/Theme/Model/Design/Config/FileUploader/Config.php b/app/code/Magento/Theme/Model/Design/Config/FileUploader/Config.php
deleted file mode 100644
index 3d3e29e39d2..00000000000
--- a/app/code/Magento/Theme/Model/Design/Config/FileUploader/Config.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Theme\Model\Design\Config\FileUploader;
-
-use Magento\Framework\App\Helper\AbstractHelper;
-use Magento\Framework\App\Helper\Context;
-use Magento\Framework\Filesystem\Directory\WriteInterface;
-use Magento\Framework\UrlInterface;
-use Magento\Store\Model\StoreManagerInterface;
-use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\Filesystem;
-
-class Config extends AbstractHelper
-{
-    /**
-     * @var StoreManagerInterface
-     */
-    protected $storeManager;
-
-    /**
-     * Media Directory object (writable).
-     *
-     * @var WriteInterface
-     */
-    protected $mediaDirectory;
-
-    /**
-     * @var string
-     */
-    protected $imageDir;
-
-    /**
-     * @param Context $context
-     * @param StoreManagerInterface $storeManager
-     * @param Filesystem $filesystem
-     * @param string $imageDir
-     */
-    public function __construct(
-        Context $context,
-        StoreManagerInterface $storeManager,
-        Filesystem $filesystem,
-        $imageDir = 'design/image'
-    ) {
-        parent::__construct($context);
-        $this->storeManager = $storeManager;
-        $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
-        $this->imageDir = $imageDir;
-    }
-
-    /**
-     * Retrieve absolute temp media path
-     *
-     * @return string
-     */
-    public function getAbsoluteTmpMediaPath()
-    {
-        return $this->mediaDirectory->getAbsolutePath($this->getBaseTmpMediaPath());
-    }
-
-    /**
-     * Retrieve base temp media url
-     *
-     * @return string
-     */
-    public function getBaseTmpMediaUrl()
-    {
-        return $this->getStoreMediaUrl() . 'tmp/' . $this->imageDir;
-    }
-
-    /**
-     * Retrieve temp media url
-     *
-     * @param string $file
-     * @return string
-     */
-    public function getTmpMediaUrl($file)
-    {
-        return $this->getBaseTmpMediaUrl() . '/' . $this->prepareFile($file);
-    }
-
-    /**
-     * Retrieve store media url
-     *
-     * @return mixed
-     */
-    public function getStoreMediaUrl()
-    {
-        return $this->storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA);
-    }
-
-    /**
-     * Retrieve base media url
-     *
-     * @return string
-     */
-    public function getBaseMediaUrl()
-    {
-        return $this->getStoreMediaUrl() . $this->imageDir;
-    }
-
-    /**
-     * Retrieve media url
-     *
-     * @param string $file
-     * @return string
-     */
-    public function getMediaUrl($file)
-    {
-        return $this->getBaseMediaUrl() . '/' . $this->prepareFile($file);
-    }
-
-    /**
-     * Filesystem directory path of temporary images
-     * relatively to media folder
-     *
-     * @return string
-     */
-    public function getBaseTmpMediaPath()
-    {
-        return 'tmp/' . $this->imageDir;
-    }
-
-    /**
-     * Retrieve temp media path
-     *
-     * @param string $filename
-     * @return string
-     */
-    public function getTmpMediaPath($filename)
-    {
-        return $this->getBaseTmpMediaPath() . '/' . $filename;
-    }
-
-    /**
-     * Prepare file
-     *
-     * @param string $file
-     * @return string
-     */
-    protected function prepareFile($file)
-    {
-        return ltrim(str_replace('\\', '/', $file), '/');
-    }
-}
diff --git a/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
index 3bb27e0c168..349021a2129 100644
--- a/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
+++ b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
@@ -6,10 +6,15 @@
 namespace Magento\Theme\Model\Design\Config\FileUploader;
 
 use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Filesystem;
 use Magento\MediaStorage\Model\File\UploaderFactory;
 use Magento\Theme\Model\Design\Backend\File;
 use Magento\Theme\Model\Design\BackendModelFactory;
 use Magento\Theme\Model\Design\Config\MetadataProvider;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+use Magento\Framework\UrlInterface;
+use Magento\Store\Model\StoreManagerInterface;
 
 class FileProcessor
 {
@@ -18,11 +23,6 @@ class FileProcessor
      */
     protected $uploaderFactory;
 
-    /**
-     * @var Config
-     */
-    protected $fileConfig;
-
     /**
      * @var BackendModelFactory
      */
@@ -33,22 +33,42 @@ class FileProcessor
      */
     protected $metadataProvider;
 
+    /**
+     * Media Directory object (writable).
+     *
+     * @var WriteInterface
+     */
+    protected $mediaDirectory;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var string
+     */
+    const FILE_DIR = 'design/file';
+
     /**
      * @param UploaderFactory $uploaderFactory
-     * @param Config $fileConfig
      * @param BackendModelFactory $backendModelFactory
      * @param MetadataProvider $metadataProvider
+     * @param Filesystem $filesystem
+     * @param StoreManagerInterface $storeManager
      */
     public function __construct(
         UploaderFactory $uploaderFactory,
-        Config $fileConfig,
         BackendModelFactory $backendModelFactory,
-        MetadataProvider $metadataProvider
+        MetadataProvider $metadataProvider,
+        Filesystem $filesystem,
+        StoreManagerInterface $storeManager
     ) {
         $this->uploaderFactory = $uploaderFactory;
-        $this->fileConfig = $fileConfig;
         $this->backendModelFactory = $backendModelFactory;
         $this->metadataProvider = $metadataProvider;
+        $this->storeManager = $storeManager;
+        $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
     }
 
     /**
@@ -61,14 +81,47 @@ class FileProcessor
     public function saveToTmp($fileId)
     {
         try {
-            $result = $this->save($fileId, $this->fileConfig->getAbsoluteTmpMediaPath());
-            $result['url'] = $this->fileConfig->getTmpMediaUrl($result['file']);
+            $result = $this->save($fileId, $this->getAbsoluteTmpMediaPath());
+            $result['url'] = $this->getTmpMediaUrl($result['file']);
         } catch (\Exception $e) {
             $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
         }
         return $result;
     }
 
+    /**
+     * Retrieve temp media url
+     *
+     * @param string $file
+     * @return string
+     */
+    protected function getTmpMediaUrl($file)
+    {
+        return $this->storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA)
+            . 'tmp/' . self::FILE_DIR . '/' . $this->prepareFile($file);
+    }
+
+    /**
+     * Prepare file
+     *
+     * @param string $file
+     * @return string
+     */
+    protected function prepareFile($file)
+    {
+        return ltrim(str_replace('\\', '/', $file), '/');
+    }
+
+    /**
+     * Retrieve absolute temp media path
+     *
+     * @return string
+     */
+    protected function getAbsoluteTmpMediaPath()
+    {
+        return $this->mediaDirectory->getAbsolutePath('tmp/' . self::FILE_DIR);
+    }
+
     /**
      * Save image
      *
-- 
GitLab