Skip to content
Snippets Groups Projects
Commit 03d43a6f authored by Oleksandr Karpenko's avatar Oleksandr Karpenko
Browse files

MAGETWO-51604: [TD] Add functionality to save image in custom folder

parent 3c2c494e
Branches
No related merge requests found
......@@ -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;
}
}
<?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), '/');
}
}
......@@ -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
*
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment