![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-theme/Helper/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** * Theme storage helper */ namespace Magento\Theme\Helper; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\ObjectManager; use Magento\Framework\Filesystem\DriverInterface; /** * Handles the storage of media files like images and fonts. * * @api * @since 100.0.2 * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Storage extends \Magento\Framework\App\Helper\AbstractHelper { /** * Parameter name of node */ public const PARAM_NODE = 'node'; /** * Parameter name of content type */ public const PARAM_CONTENT_TYPE = 'content_type'; /** * Parameter name of theme identification number */ public const PARAM_THEME_ID = 'theme_id'; /** * Parameter name of filename */ public const PARAM_FILENAME = 'filename'; /** * Root node value identification number */ public const NODE_ROOT = 'root'; /** * Display name for images storage type */ public const IMAGES = 'Images'; /** * Display name for fonts storage type */ public const FONTS = 'Fonts'; /** * Current directory path * * @var string */ protected $_currentPath; /** * Current storage root path * * @var string */ protected $_storageRoot; /** * Magento filesystem * * @var \Magento\Framework\Filesystem */ protected $filesystem; /** * @var \Magento\Backend\Model\Session */ protected $_session; /** * @var \Magento\Framework\View\Design\Theme\FlyweightFactory */ protected $_themeFactory; /** * @var \Magento\Framework\Filesystem\Directory\Write */ protected $mediaDirectoryWrite; /** * @var \Magento\Framework\Filesystem\Io\File */ private $file; /** * @var DriverInterface */ private $filesystemDriver; /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\Backend\Model\Session $session * @param \Magento\Framework\View\Design\Theme\FlyweightFactory $themeFactory * @param \Magento\Framework\Filesystem\Io\File|null $file * * @param DriverInterface|null $filesystemDriver * @throws \Magento\Framework\Exception\FileSystemException * @throws \Magento\Framework\Exception\ValidatorException */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\Framework\Filesystem $filesystem, \Magento\Backend\Model\Session $session, \Magento\Framework\View\Design\Theme\FlyweightFactory $themeFactory, \Magento\Framework\Filesystem\Io\File $file = null, DriverInterface $filesystemDriver = null ) { parent::__construct($context); $this->filesystem = $filesystem; $this->_session = $session; $this->_themeFactory = $themeFactory; $this->mediaDirectoryWrite = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA); $this->mediaDirectoryWrite->create($this->mediaDirectoryWrite->getRelativePath($this->getStorageRoot())); $this->file = $file ?: ObjectManager::getInstance()->get( \Magento\Framework\Filesystem\Io\File::class ); $this->filesystemDriver = $filesystemDriver ?: ObjectManager::getInstance()->get(DriverInterface::class); } /** * Convert path to id * * @param string $path * @return string */ public function convertPathToId($path) { $path = str_replace($this->getStorageRoot(), '', $path); return $this->urlEncoder->encode($path); } /** * Convert id to path * * @param string $value * @return string */ public function convertIdToPath($value) { $path = $this->urlDecoder->decode($value); if (!strstr($path, (string) $this->getStorageRoot())) { $path = $this->getStorageRoot() . $path; } return $path; } /** * Get short file name * * @param string $filename * @param int $maxLength * @return string */ public function getShortFilename($filename, $maxLength = 20) { return strlen($filename) <= $maxLength ? $filename : substr($filename, 0, $maxLength) . '...'; } /** * Get storage root directory * * @return string */ public function getStorageRoot() { if (null === $this->_storageRoot) { $this->_storageRoot = implode( '/', [$this->_getTheme()->getCustomization()->getCustomizationPath(), $this->getStorageType()] ); } return $this->_storageRoot; } /** * Get theme module for custom static files * * @return \Magento\Theme\Model\Theme * @throws \InvalidArgumentException */ protected function _getTheme() { $themeId = $this->_getRequest()->getParam(self::PARAM_THEME_ID); $theme = $this->_themeFactory->create($themeId); if (!$themeId || !$theme) { throw new \InvalidArgumentException('Theme was not found.'); } return $theme; } /** * Get storage type * * @return string * @throws \Magento\Framework\Exception\LocalizedException */ public function getStorageType() { $allowedTypes = [ \Magento\Theme\Model\Wysiwyg\Storage::TYPE_FONT, \Magento\Theme\Model\Wysiwyg\Storage::TYPE_IMAGE, ]; $type = (string)$this->_getRequest()->getParam(self::PARAM_CONTENT_TYPE); if (!in_array($type, $allowedTypes)) { throw new \Magento\Framework\Exception\LocalizedException(__('Invalid type')); } return $type; } /** * Relative url to static content * * @return string */ public function getRelativeUrl() { $pathPieces = ['..', $this->getStorageType()]; $node = $this->_getRequest()->getParam(self::PARAM_NODE, ''); if ($node !== self::NODE_ROOT) { $node = $this->urlDecoder->decode($node); $nodes = explode('/', trim($node, '/')); $pathPieces = array_merge($pathPieces, $nodes); } $pathPieces[] = $this->urlDecoder->decode($this->_getRequest()->getParam(self::PARAM_FILENAME)); return implode('/', $pathPieces); } /** * Get current path * * @return string */ public function getCurrentPath() { if (!$this->_currentPath) { $currentPath = $this->getStorageRoot(); $path = $this->_getRequest()->getParam(self::PARAM_NODE); if ($path && $path !== self::NODE_ROOT) { $path = $this->convertIdToPath($path); $path = $this->filesystemDriver->getRealPathSafety($path); if (strpos($path, $currentPath) !== 0) { $path = $currentPath; } if ($this->mediaDirectoryWrite->isDirectory($path) && strpos($path, $currentPath) === 0 && $path !== $currentPath ) { $currentPath = $this->mediaDirectoryWrite->getRelativePath($path); } } $this->_currentPath = $currentPath; } return $this->_currentPath; } /** * Get thumbnail directory for path * * @param string $path * @return string */ public function getThumbnailDirectory($path) { return sprintf( "%s/%s", $this->file->getPathInfo($path)['dirname'], \Magento\Theme\Model\Wysiwyg\Storage::THUMBNAIL_DIRECTORY ); } /** * Get thumbnail path in current directory by image name * * @param string $imageName * @return string * @throws \InvalidArgumentException */ public function getThumbnailPath($imageName) { $imagePath = $this->getCurrentPath() . '/' . $imageName; if (!$this->mediaDirectoryWrite->isExist($imagePath) || 0 !== strpos($imagePath, (string) $this->getStorageRoot()) ) { throw new \InvalidArgumentException('The image not found.'); } return sprintf( "%s/%s", $this->getThumbnailDirectory($imagePath), $this->file->getPathInfo($imageName)['basename'] ); } /** * Request params for selected theme * * @return array */ public function getRequestParams() { $themeId = $this->_getRequest()->getParam(self::PARAM_THEME_ID); $contentType = $this->_getRequest()->getParam(self::PARAM_CONTENT_TYPE); $node = $this->_getRequest()->getParam(self::PARAM_NODE); return [ self::PARAM_THEME_ID => $themeId, self::PARAM_CONTENT_TYPE => $contentType, self::PARAM_NODE => $node ]; } /** * Get allowed extensions by type * * @return string[] * @throws \Magento\Framework\Exception\LocalizedException */ public function getAllowedExtensionsByType() { return $this->getStorageType() == \Magento\Theme\Model\Wysiwyg\Storage::TYPE_FONT ? ['ttf', 'otf', 'eot', 'svg', 'woff'] : ['jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp']; } /** * Get storage type name for display. * * @return string * @throws \Magento\Framework\Exception\LocalizedException */ public function getStorageTypeName() { return $this->getStorageType() == \Magento\Theme\Model\Wysiwyg\Storage::TYPE_FONT ? self::FONTS : self::IMAGES; } /** * Get session model * * @return \Magento\Backend\Model\Session */ public function getSession() { return $this->_session; } }