Magento 2 | Override Magento_Downloadable
-
19-01-2021 - |
Domanda
I want to override this file in my module:
/var/www/magento2-dev/vendor/magento/module-downloadable/Helper/Download.php
to
/var/www/magento2-dev/app/code/My/Module/Helper/Download.php
How can I do that?
Thanks!
Soluzione
please add preference in di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Downloadable\Helper\Download" type="My\Module\Helper\Download"/>
</config>
and make your helper
namespace My\Module\Helper;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Framework\Exception\LocalizedException as CoreException;
class Download extends Magento\Downloadable\Helper
{
/**
* Link type url
*/
const LINK_TYPE_URL = 'url';
/**
* Link type file
*/
const LINK_TYPE_FILE = 'file';
/**
* Config path to content disposition
*/
const XML_PATH_CONTENT_DISPOSITION = 'catalog/downloadable/content_disposition';
/**
* Type of link
*
* @var string
*/
protected $_linkType = self::LINK_TYPE_FILE;
/**
* Resource file
*
* @var string
*/
protected $_resourceFile = null;
/**
* Resource open handle
*
* @var \Magento\Framework\Filesystem\File\ReadInterface
*/
protected $_handle = null;
/**
* Remote server headers
*
* @var array
*/
protected $_urlHeaders = [];
/**
* MIME Content-type for a file
*
* @var string
*/
protected $_contentType = 'application/octet-stream';
/**
* File name
*
* @var string
*/
protected $_fileName = 'download';
/**
* Core file storage database
*
* @var \Magento\MediaStorage\Helper\File\Storage\Database
*/
protected $_coreFileStorageDb;
/**
* Downloadable file
*
* @var \Magento\Downloadable\Helper\File
*/
protected $_downloadableFile;
/**
* @var \Magento\Framework\Filesystem
*/
protected $_filesystem;
/**
* @var \Magento\Framework\Filesystem\File\ReadFactory
*/
protected $fileReadFactory;
/**
* Working Directory (valid for LINK_TYPE_FILE only).
* @var \Magento\Framework\Filesystem\Directory\Read
*/
protected $_workingDirectory;
/**
* @var \Magento\Framework\Session\SessionManagerInterface
*/
protected $_session;
/**
* @param \Magento\Framework\App\Helper\Context $context
* @param File $downloadableFile
* @param \Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDb
* @param Filesystem $filesystem
* @param \Magento\Framework\Session\SessionManagerInterface $session
* @param Filesystem\File\ReadFactory $fileReadFactory
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Downloadable\Helper\File $downloadableFile,
\Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDb,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\Session\SessionManagerInterface $session,
\Magento\Framework\Filesystem\File\ReadFactory $fileReadFactory
) {
parent::__construct($context,$downloadableFile,$coreFileStorageDb,$filesystem,$session,$fileReadFactory);
$this->_downloadableFile = $downloadableFile;
$this->_coreFileStorageDb = $coreFileStorageDb;
$this->_filesystem = $filesystem;
$this->_session = $session;
$this->fileReadFactory = $fileReadFactory;
}
/**
* Retrieve Resource file handle (socket, file pointer etc)
*
* @return \Magento\Framework\Filesystem\File\ReadInterface
* @throws CoreException|\Exception
*/
protected function _getHandle()
{
if (!$this->_resourceFile) {
throw new CoreException(__('Please set resource file and link type.'));
}
if (is_null($this->_handle)) {
if ($this->_linkType == self::LINK_TYPE_URL) {
$path = $this->_resourceFile;
$protocol = strtolower(parse_url($path, PHP_URL_SCHEME));
if ($protocol) {
// Strip down protocol from path
$path = preg_replace('#.+://#', '', $path);
}
$this->_handle = $this->fileReadFactory->create($path, $protocol);
} elseif ($this->_linkType == self::LINK_TYPE_FILE) {
$this->_workingDirectory = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA);
$fileExists = $this->_downloadableFile->ensureFileInFilesystem($this->_resourceFile);
if ($fileExists) {
$this->_handle = $this->_workingDirectory->openFile($this->_resourceFile);
} else {
throw new CoreException(__('Invalid download link type.'));
}
} else {
throw new CoreException(__('Invalid download link type.'));
}
}
return $this->_handle;
}
/**
* Retrieve file size in bytes
*
* @return int
*/
public function getFileSize()
{
return $this->_getHandle()->stat($this->_resourceFile)['size'];
}
/**
* Return MIME type of a file.
*
* @return string
*/
public function getContentType()
{
$this->_getHandle();
if ($this->_linkType == self::LINK_TYPE_FILE) {
if (function_exists(
'mime_content_type'
) && ($contentType = mime_content_type(
$this->_workingDirectory->getAbsolutePath($this->_resourceFile)
))
) {
return $contentType;
} else {
return $this->_downloadableFile->getFileType($this->_resourceFile);
}
} elseif ($this->_linkType == self::LINK_TYPE_URL) {
return $this->_handle->stat($this->_resourceFile)['type'];
}
return $this->_contentType;
}
/**
* Return name of the file
*
* @return string
*/
public function getFilename()
{
$this->_getHandle();
if ($this->_linkType == self::LINK_TYPE_FILE) {
return pathinfo($this->_resourceFile, PATHINFO_BASENAME);
} elseif ($this->_linkType == self::LINK_TYPE_URL) {
$stat = $this->_handle->stat($this->_resourceFile);
if (isset($stat['disposition'])) {
$contentDisposition = explode('; ', $stat['disposition']);
if (!empty($contentDisposition[1]) && preg_match(
'/filename=([^ ]+)/',
$contentDisposition[1],
$matches
)
) {
return $matches[1];
}
}
$fileName = @pathinfo($this->_resourceFile, PATHINFO_BASENAME);
if ($fileName) {
return $fileName;
}
}
return $this->_fileName;
}
/**
* Set resource file for download
*
* @param string $resourceFile
* @param string $linkType
* @return $this
* @throws \InvalidArgumentException
*/
public function setResource($resourceFile, $linkType = self::LINK_TYPE_FILE)
{
if (self::LINK_TYPE_FILE == $linkType) {
//check LFI protection
if (preg_match('#\.\.[\\\/]#', $resourceFile)) {
throw new \InvalidArgumentException(
'Requested file may not include parent directory traversal ("../", "..\\" notation)'
);
}
}
$this->_resourceFile = $resourceFile;
$this->_linkType = $linkType;
return $this;
}
/**
* Output file contents
*
* @return void
*/
public function output()
{
$handle = $this->_getHandle();
$this->_session->writeClose();
while (true == ($buffer = $handle->read(1024))) {
echo $buffer;
}
}
/**
* Use Content-Disposition: attachment
*
* @param mixed $store
* @return bool
* @SuppressWarnings(PHPMD.BooleanGetMethodName)
*/
public function getContentDisposition($store = null)
{
return $this->scopeConfig->getValue(self::XML_PATH_CONTENT_DISPOSITION, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store);
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange