123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Theme\Model\Design\Backend;
- use Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface;
- use Magento\Config\Model\Config\Backend\File as BackendFile;
- use Magento\Framework\App\Cache\TypeListInterface;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\App\ObjectManager;
- use Magento\Framework\Data\Collection\AbstractDb;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\File\Mime;
- 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\FileProcessor;
- /**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class File extends BackendFile
- {
- /**
- * @var UrlInterface
- */
- protected $urlBuilder;
- /**
- * @var Mime
- */
- private $mime;
- /**
- * @param Context $context
- * @param Registry $registry
- * @param ScopeConfigInterface $config
- * @param TypeListInterface $cacheTypeList
- * @param UploaderFactory $uploaderFactory
- * @param RequestDataInterface $requestData
- * @param Filesystem $filesystem
- * @param UrlInterface $urlBuilder
- * @param AbstractResource|null $resource
- * @param AbstractDb|null $resourceCollection
- * @param array $data
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- Context $context,
- Registry $registry,
- ScopeConfigInterface $config,
- TypeListInterface $cacheTypeList,
- UploaderFactory $uploaderFactory,
- RequestDataInterface $requestData,
- Filesystem $filesystem,
- UrlInterface $urlBuilder,
- AbstractResource $resource = null,
- AbstractDb $resourceCollection = null,
- array $data = []
- ) {
- parent::__construct(
- $context,
- $registry,
- $config,
- $cacheTypeList,
- $uploaderFactory,
- $requestData,
- $filesystem,
- $resource,
- $resourceCollection,
- $data
- );
- $this->urlBuilder = $urlBuilder;
- }
- /**
- * Save uploaded file and remote temporary file before saving config value
- *
- * @return $this
- * @throws LocalizedException
- */
- public function beforeSave()
- {
- $values = $this->getValue();
- $value = reset($values) ?: [];
- if (!isset($value['file'])) {
- throw new LocalizedException(
- __('%1 does not contain field \'file\'', $this->getData('field_config/field'))
- );
- }
- if (isset($value['exists'])) {
- $this->setValue($value['file']);
- return $this;
- }
- $filename = basename($value['file']);
- $result = $this->_mediaDirectory->copyFile(
- $this->getTmpMediaPath($filename),
- $this->_getUploadDir() . '/' . $filename
- );
- if ($result) {
- $this->_mediaDirectory->delete($this->getTmpMediaPath($filename));
- if ($this->_addWhetherScopeInfo()) {
- $filename = $this->_prependScopeInfo($filename);
- }
- $this->setValue($filename);
- } else {
- $this->unsValue();
- }
- return $this;
- }
- /**
- * @return array
- */
- public function afterLoad()
- {
- $value = $this->getValue();
- if ($value && !is_array($value)) {
- $fileName = $this->_getUploadDir() . '/' . basename($value);
- $fileInfo = null;
- 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,
- 'name' => basename($value),
- 'type' => $this->getMimeType($fileName),
- 'exists' => true,
- ]
- ];
- }
- $this->setValue($fileInfo);
- }
- return $this;
- }
- /**
- * Getter for allowed extensions of uploaded files
- *
- * @return array
- */
- public function getAllowedExtensions()
- {
- return [];
- }
- /**
- * Retrieve upload directory path
- *
- * @param string $uploadDir
- * @return string
- */
- protected function getUploadDirPath($uploadDir)
- {
- return $this->_mediaDirectory->getRelativePath($uploadDir);
- }
- /**
- * @return array
- */
- public function getValue()
- {
- return $this->getData('value') ?: [];
- }
- /**
- * Retrieve store media url
- *
- * @param string $fileName
- * @return mixed
- */
- protected function getStoreMediaUrl($fileName)
- {
- $fieldConfig = $this->getFieldConfig();
- $baseUrl = '';
- $urlType = ['_type' => UrlInterface::URL_TYPE_MEDIA];
- if (isset($fieldConfig['base_url'])) {
- $baseUrl = $fieldConfig['base_url'];
- $urlType = ['_type' => empty($baseUrl['type']) ? 'link' : (string)$baseUrl['type']];
- $baseUrl = $baseUrl['value'] . '/';
- }
- return $this->urlBuilder->getBaseUrl($urlType) . $baseUrl . $fileName;
- }
- /**
- * Retrieve temp media path
- *
- * @param string $filename
- * @return string
- */
- protected function getTmpMediaPath($filename)
- {
- return 'tmp/' . FileProcessor::FILE_DIR . '/' . $filename;
- }
- /**
- * Retrieve MIME type of requested file
- *
- * @param string $fileName
- * @return string
- */
- private function getMimeType($fileName)
- {
- $absoluteFilePath = $this->_mediaDirectory->getAbsolutePath($fileName);
- $result = $this->getMime()->getMimeType($absoluteFilePath);
- return $result;
- }
- /**
- * Get Mime instance
- *
- * @return Mime
- *
- * @deprecated 100.2.0
- */
- private function getMime()
- {
- if ($this->mime === null) {
- $this->mime = ObjectManager::getInstance()->get(Mime::class);
- }
- return $this->mime;
- }
- }
|