| Current Path : /home/rtorresani/www/vendor/magento/module-eav/Model/Attribute/Data/ |
| Current File : //home/rtorresani/www/vendor/magento/module-eav/Model/Attribute/Data/File.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Eav\Model\Attribute\Data;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Filesystem\Io\File as FileIo;
/**
* EAV Entity Attribute File Data Model
*
* @api
* @since 100.0.2
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class File extends \Magento\Eav\Model\Attribute\Data\AbstractData
{
/**
* Validator for check not protected extensions
*
* @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension
*/
protected $_validatorNotProtectedExtensions;
/**
* @var \Magento\Framework\Url\EncoderInterface
*/
protected $urlEncoder;
/**
* @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension
*/
protected $_fileValidator;
/**
* @var \Magento\Framework\Filesystem\Directory\Write
*/
protected $_directory;
/**
* @var FileIo
*/
private $fileIo;
/**
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Framework\Locale\ResolverInterface $localeResolver
* @param \Magento\Framework\Url\EncoderInterface $urlEncoder
* @param \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator
* @param \Magento\Framework\Filesystem $filesystem
* @param FileIo $fileIo
* @codeCoverageIgnore
*/
public function __construct(
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Locale\ResolverInterface $localeResolver,
\Magento\Framework\Url\EncoderInterface $urlEncoder,
\Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator,
\Magento\Framework\Filesystem $filesystem,
FileIo $fileIo
) {
parent::__construct($localeDate, $logger, $localeResolver);
$this->urlEncoder = $urlEncoder;
$this->_fileValidator = $fileValidator;
$this->_directory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->fileIo = $fileIo;
}
/**
* Extract data from request and return value
*
* @param RequestInterface $request
* @return array|string|bool
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function extractValue(RequestInterface $request)
{
if ($this->getIsAjaxRequest()) {
return false;
}
$extend = $this->_getRequestValue($request);
$attrCode = $this->getAttribute()->getAttributeCode();
if ($this->_requestScope) {
$value = [];
if (strpos($this->_requestScope, '/') !== false) {
$scopes = explode('/', $this->_requestScope);
$mainScope = array_shift($scopes);
} else {
$mainScope = $this->_requestScope;
$scopes = [];
}
// phpcs:disable Magento2.Security.Superglobal
if (!empty($_FILES[$mainScope])) {
foreach ($_FILES[$mainScope] as $fileKey => $scopeData) {
foreach ($scopes as $scopeName) {
if (isset($scopeData[$scopeName])) {
$scopeData = $scopeData[$scopeName];
} else {
$scopeData[$scopeName] = [];
}
}
if (isset($scopeData[$attrCode])) {
$value[$fileKey] = $scopeData[$attrCode];
}
}
} else {
$value = [];
}
// phpcs:enable Magento2.Security.Superglobal
} else {
// phpcs:disable Magento2.Security.Superglobal
if (isset($_FILES[$attrCode])) {
$value = $_FILES[$attrCode];
} else {
$value = [];
}
// phpcs:enable Magento2.Security.Superglobal
}
if (!empty($extend['delete'])) {
$value['delete'] = true;
}
return $value;
}
/**
* Validate file by attribute validate rules and return array of errors
*
* @param array $value
* @return string[]
*/
protected function _validateByRules($value)
{
$label = $this->getAttribute()->getStoreLabel();
$rules = $this->getAttribute()->getValidateRules();
$extension = $this->fileIo->getPathInfo($value['name'])['extension'];
if (!empty($rules['file_extensions'])) {
$extensions = explode(',', $rules['file_extensions']);
$extensions = array_map('trim', $extensions);
if (!in_array($extension, $extensions)) {
return [__('"%1" is not a valid file extension.', $label)];
}
}
/**
* Check protected file extension
*/
if (!$this->_fileValidator->isValid($extension)) {
return $this->_fileValidator->getMessages();
}
if (!empty($value['tmp_name'])
&& !$this->_directory->getDriver()->isExists($value['tmp_name'])
) {
return [__('"%1" is not a valid file.', $label)];
}
if (!empty($rules['max_file_size'])) {
$size = $value['size'];
if ($rules['max_file_size'] < $size) {
return [__('"%1" exceeds the allowed file size.', $label)];
}
}
return [];
}
/**
* Validate data
*
* @param array|string $value
* @return bool
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function validateValue($value)
{
if ($this->getIsAjaxRequest()) {
return true;
}
$fileData = $value;
if (is_string($value) && !empty($value)) {
$dir = $this->_directory->getAbsolutePath($this->getAttribute()->getEntityType()->getEntityTypeCode());
$stat = $this->_directory->getDriver()->stat($dir . $value);
$fileData = [
'size' => $stat['size'],
'name' => $value,
'tmp_name' => $dir . $value
];
}
$errors = [];
$attribute = $this->getAttribute();
$toDelete = !empty($value['delete']) ? true : false;
$toUpload = !empty($value['tmp_name']) || is_string($value) && !empty($value) ? true : false;
if (!$toUpload && !$toDelete && $this->getEntity()->getData($attribute->getAttributeCode())) {
return true;
}
if (!$attribute->getIsRequired() && !$toUpload) {
return true;
}
if ($attribute->getIsRequired() && !$toUpload) {
$label = __($attribute->getStoreLabel());
$errors[] = __('"%1" is a required value.', $label);
}
if ($toUpload) {
$errors = array_merge($errors, $this->_validateByRules($fileData));
}
if (count($errors) == 0) {
return true;
}
return $errors;
}
/**
* Export attribute value to entity model
*
* @param array|string $value
* @return $this
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function compactValue($value)
{
if ($this->getIsAjaxRequest()) {
return $this;
}
$attribute = $this->getAttribute();
$original = $this->getEntity()->getData($attribute->getAttributeCode());
$toDelete = false;
if ($original) {
if (!$attribute->getIsRequired() && !empty($value['delete'])) {
$toDelete = true;
}
if (!empty($value['tmp_name'])) {
$toDelete = true;
}
}
$destinationFolder = $attribute->getEntityType()->getEntityTypeCode();
// unlink entity file
if ($toDelete) {
$this->getEntity()->setData($attribute->getAttributeCode(), '');
$file = $destinationFolder . $original;
if ($this->_directory->isExist($file)) {
$this->_directory->delete($file);
}
}
if (!empty($value['tmp_name'])) {
try {
$uploader = new \Magento\Framework\File\Uploader($value);
$uploader->setFilesDispersion(true);
$uploader->setFilenamesCaseSensitivity(false);
$uploader->setAllowRenameFiles(true);
$uploader->save($this->_directory->getAbsolutePath($destinationFolder), $value['name']);
$fileName = $uploader->getUploadedFileName();
$this->getEntity()->setData($attribute->getAttributeCode(), $fileName);
} catch (\Exception $e) {
$this->_logger->critical($e);
}
}
return $this;
}
/**
* Restore attribute value from SESSION to entity model
*
* @param array|string $value
* @return $this
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function restoreValue($value)
{
return $this;
}
/**
* Return formatted attribute value from entity model
*
* @param string $format
* @return string|array
*/
public function outputValue($format = \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT)
{
$output = '';
$value = $this->getEntity()->getData($this->getAttribute()->getAttributeCode());
if ($value) {
switch ($format) {
case \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON:
$output = ['value' => $value, 'url_key' => $this->urlEncoder->encode($value)];
break;
}
}
return $output;
}
}