123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Config\Model\Config\Backend;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\App\Filesystem\DirectoryList;
- use Magento\Framework\Filesystem;
- use Magento\MediaStorage\Model\File\Uploader;
- /**
- * System config file field backend model
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- * @api
- * @since 100.0.2
- */
- class File extends \Magento\Framework\App\Config\Value
- {
- /**
- * @var \Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface
- */
- protected $_requestData;
- /**
- * Upload max file size in kilobytes
- *
- * @var int
- */
- protected $_maxFileSize = 0;
- /**
- * @var Filesystem
- */
- protected $_filesystem;
- /**
- * @var \Magento\Framework\Filesystem\Directory\WriteInterface
- */
- protected $_mediaDirectory;
- /**
- * @var \Magento\MediaStorage\Model\File\UploaderFactory
- */
- protected $_uploaderFactory;
- /**
- * @param \Magento\Framework\Model\Context $context
- * @param \Magento\Framework\Registry $registry
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
- * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
- * @param \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory
- * @param \Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface $requestData
- * @param Filesystem $filesystem
- * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
- * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
- * @param array $data
- */
- public function __construct(
- \Magento\Framework\Model\Context $context,
- \Magento\Framework\Registry $registry,
- \Magento\Framework\App\Config\ScopeConfigInterface $config,
- \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList,
- \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
- \Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface $requestData,
- Filesystem $filesystem,
- \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
- \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
- array $data = []
- ) {
- $this->_uploaderFactory = $uploaderFactory;
- $this->_requestData = $requestData;
- $this->_filesystem = $filesystem;
- $this->_mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
- parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
- }
- /**
- * Save uploaded file before saving config value
- *
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function beforeSave()
- {
- $value = $this->getValue();
- $file = $this->getFileData();
- if (!empty($file)) {
- $uploadDir = $this->_getUploadDir();
- try {
- /** @var Uploader $uploader */
- $uploader = $this->_uploaderFactory->create(['fileId' => $file]);
- $uploader->setAllowedExtensions($this->_getAllowedExtensions());
- $uploader->setAllowRenameFiles(true);
- $uploader->addValidateCallback('size', $this, 'validateMaxSize');
- $result = $uploader->save($uploadDir);
- } catch (\Exception $e) {
- throw new \Magento\Framework\Exception\LocalizedException(__('%1', $e->getMessage()));
- }
- $filename = $result['file'];
- if ($filename) {
- if ($this->_addWhetherScopeInfo()) {
- $filename = $this->_prependScopeInfo($filename);
- }
- $this->setValue($filename);
- }
- } else {
- if (is_array($value) && !empty($value['delete'])) {
- $this->setValue('');
- } elseif (is_array($value) && !empty($value['value'])) {
- $this->setValue($value['value']);
- } else {
- $this->unsValue();
- }
- }
- return $this;
- }
- /**
- * Receiving uploaded file data
- *
- * @return array
- * @since 100.1.0
- */
- protected function getFileData()
- {
- $file = [];
- $value = $this->getValue();
- $tmpName = $this->_requestData->getTmpName($this->getPath());
- if ($tmpName) {
- $file['tmp_name'] = $tmpName;
- $file['name'] = $this->_requestData->getName($this->getPath());
- } elseif (!empty($value['tmp_name'])) {
- $file['tmp_name'] = $value['tmp_name'];
- $file['name'] = isset($value['value']) ? $value['value'] : $value['name'];
- }
- return $file;
- }
- /**
- * Validation callback for checking max file size
- *
- * @param string $filePath Path to temporary uploaded file
- * @return void
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function validateMaxSize($filePath)
- {
- $directory = $this->_filesystem->getDirectoryRead(DirectoryList::SYS_TMP);
- if ($this->_maxFileSize > 0 && $directory->stat(
- $directory->getRelativePath($filePath)
- )['size'] > $this->_maxFileSize * 1024
- ) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The file you\'re uploading exceeds the server size limit of %1 kilobytes.', $this->_maxFileSize)
- );
- }
- }
- /**
- * Makes a decision about whether to add info about the scope.
- *
- * @return boolean
- */
- protected function _addWhetherScopeInfo()
- {
- $fieldConfig = $this->getFieldConfig();
- $dirParams = array_key_exists('upload_dir', $fieldConfig) ? $fieldConfig['upload_dir'] : [];
- return is_array($dirParams) && array_key_exists('scope_info', $dirParams) && $dirParams['scope_info'];
- }
- /**
- * Return path to directory for upload file
- *
- * @return string
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function _getUploadDir()
- {
- $fieldConfig = $this->getFieldConfig();
- if (!array_key_exists('upload_dir', $fieldConfig)) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The base directory to upload file is not specified.')
- );
- }
- if (is_array($fieldConfig['upload_dir'])) {
- $uploadDir = $fieldConfig['upload_dir']['value'];
- if (array_key_exists('scope_info', $fieldConfig['upload_dir'])
- && $fieldConfig['upload_dir']['scope_info']
- ) {
- $uploadDir = $this->_appendScopeInfo($uploadDir);
- }
- if (array_key_exists('config', $fieldConfig['upload_dir'])) {
- $uploadDir = $this->getUploadDirPath($uploadDir);
- }
- } else {
- $uploadDir = (string)$fieldConfig['upload_dir'];
- }
- return $uploadDir;
- }
- /**
- * Retrieve upload directory path
- *
- * @param string $uploadDir
- * @return string
- * @since 100.1.0
- */
- protected function getUploadDirPath($uploadDir)
- {
- return $this->_mediaDirectory->getAbsolutePath($uploadDir);
- }
- /**
- * Prepend path with scope info
- *
- * E.g. 'stores/2/path' , 'websites/3/path', 'default/path'
- *
- * @param string $path
- * @return string
- */
- protected function _prependScopeInfo($path)
- {
- $scopeInfo = $this->getScope();
- if (ScopeConfigInterface::SCOPE_TYPE_DEFAULT != $this->getScope()) {
- $scopeInfo .= '/' . $this->getScopeId();
- }
- return $scopeInfo . '/' . $path;
- }
- /**
- * Add scope info to path
- *
- * E.g. 'path/stores/2' , 'path/websites/3', 'path/default'
- *
- * @param string $path
- * @return string
- */
- protected function _appendScopeInfo($path)
- {
- $path .= '/' . $this->getScope();
- if (ScopeConfigInterface::SCOPE_TYPE_DEFAULT != $this->getScope()) {
- $path .= '/' . $this->getScopeId();
- }
- return $path;
- }
- /**
- * Getter for allowed extensions of uploaded files
- *
- * @return array
- */
- protected function _getAllowedExtensions()
- {
- return [];
- }
- }
|