/vendor/magento/module-customer/Model/Metadata/Form/File.php
PHP | 312 lines | 194 code | 37 blank | 81 comment | 39 complexity | 026ed5f9a2e04142acacc0eda1b7e3cb MD5 | raw file
- <?php
- /**
- * Form Element File Data Model
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model\Metadata\Form;
- use Magento\Framework\File\UploaderFactory;
- use Magento\Framework\Filesystem;
- use Magento\Framework\App\Filesystem\DirectoryList;
- use Magento\Framework\Api\ArrayObjectSearch;
- /**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class File extends AbstractData
- {
- /**
- * Validator for check not protected extensions
- *
- * @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension
- */
- protected $_validatorNotProtectedExtensions;
- /**
- * Core data
- *
- * @var \Magento\Framework\Url\EncoderInterface
- */
- protected $urlEncoder;
- /**
- * @var \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension
- */
- protected $_fileValidator;
- /**
- * @var Filesystem
- */
- protected $_fileSystem;
- /**
- * @var UploaderFactory
- */
- private $uploaderFactory;
- /**
- * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
- * @param \Psr\Log\LoggerInterface $logger
- * @param \Magento\Customer\Api\Data\AttributeMetadataInterface $attribute
- * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
- * @param null $value
- * @param string $entityTypeCode
- * @param bool $isAjax
- * @param \Magento\Framework\Url\EncoderInterface $urlEncoder
- * @param \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator
- * @param Filesystem $fileSystem
- * @param UploaderFactory $uploaderFactory
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
- \Psr\Log\LoggerInterface $logger,
- \Magento\Customer\Api\Data\AttributeMetadataInterface $attribute,
- \Magento\Framework\Locale\ResolverInterface $localeResolver,
- $value,
- $entityTypeCode,
- $isAjax,
- \Magento\Framework\Url\EncoderInterface $urlEncoder,
- \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension $fileValidator,
- Filesystem $fileSystem,
- UploaderFactory $uploaderFactory
- ) {
- parent::__construct($localeDate, $logger, $attribute, $localeResolver, $value, $entityTypeCode, $isAjax);
- $this->urlEncoder = $urlEncoder;
- $this->_fileValidator = $fileValidator;
- $this->_fileSystem = $fileSystem;
- $this->uploaderFactory = $uploaderFactory;
- }
- /**
- * {@inheritdoc}
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function extractValue(\Magento\Framework\App\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 = [];
- }
- 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 = [];
- }
- } else {
- if (isset($_FILES[$attrCode])) {
- $value = $_FILES[$attrCode];
- } else {
- $value = [];
- }
- }
- if (!empty($extend['delete'])) {
- $value['delete'] = true;
- }
- return $value;
- }
- /**
- * Validate file by attribute validate rules
- * Return array of errors
- *
- * @param array $value
- * @return string[]
- */
- protected function _validateByRules($value)
- {
- $label = $value['name'];
- $rules = $this->getAttribute()->getValidationRules();
- $extension = pathinfo($value['name'], PATHINFO_EXTENSION);
- $fileExtensions = ArrayObjectSearch::getArrayElementByName(
- $rules,
- 'file_extensions'
- );
- if ($fileExtensions !== null) {
- $extensions = explode(',', $fileExtensions);
- $extensions = array_map('trim', $extensions);
- if (!in_array($extension, $extensions)) {
- return [__('"%1" is not a valid file extension.', $extension)];
- }
- }
- /**
- * Check protected file extension
- */
- if (!$this->_fileValidator->isValid($extension)) {
- return $this->_fileValidator->getMessages();
- }
- if (!$this->_isUploadedFile($value['tmp_name'])) {
- return [__('"%1" is not a valid file.', $label)];
- }
- $maxFileSize = ArrayObjectSearch::getArrayElementByName(
- $rules,
- 'max_file_size'
- );
- if ($maxFileSize !== null) {
- $size = $value['size'];
- if ($maxFileSize < $size) {
- return [__('"%1" exceeds the allowed file size.', $label)];
- }
- }
- return [];
- }
- /**
- * Helper function that checks if the file was uploaded.
- *
- * This helper function is needed for testing.
- *
- * @param string $filename
- * @return bool
- */
- protected function _isUploadedFile($filename)
- {
- return is_uploaded_file($filename);
- }
- /**
- * {@inheritdoc}
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- */
- public function validateValue($value)
- {
- if ($this->getIsAjaxRequest()) {
- return true;
- }
- $errors = [];
- $attribute = $this->getAttribute();
- $label = $attribute->getStoreLabel();
- $toDelete = !empty($value['delete']) ? true : false;
- $toUpload = !empty($value['tmp_name']) ? true : false;
- if (!$toUpload && !$toDelete && $this->_value) {
- return true;
- }
- if (!$attribute->isRequired() && !$toUpload) {
- return true;
- }
- if ($attribute->isRequired() && !$toUpload) {
- $errors[] = __('"%1" is a required value.', $label);
- }
- if ($toUpload) {
- $errors = array_merge($errors, $this->_validateByRules($value));
- }
- if (count($errors) == 0) {
- return true;
- }
- return $errors;
- }
- /**
- * {@inheritdoc}
- *
- * @return $this|string
- */
- public function compactValue($value)
- {
- if ($this->getIsAjaxRequest()) {
- return $this;
- }
- $attribute = $this->getAttribute();
- $original = $this->_value;
- $toDelete = false;
- if ($original) {
- if (!$attribute->isRequired() && !empty($value['delete'])) {
- $toDelete = true;
- }
- if (!empty($value['tmp_name'])) {
- $toDelete = true;
- }
- }
- $mediaDir = $this->_fileSystem->getDirectoryWrite(DirectoryList::MEDIA);
- $result = $original;
- // unlink entity file
- if ($toDelete) {
- $result = '';
- $mediaDir->delete($this->_entityTypeCode . $original);
- }
- if (!empty($value['tmp_name'])) {
- try {
- $uploader = $this->uploaderFactory->create(['fileId' => $value]);
- $uploader->setFilesDispersion(true);
- $uploader->setFilenamesCaseSensitivity(false);
- $uploader->setAllowRenameFiles(true);
- $uploader->save($mediaDir->getAbsolutePath($this->_entityTypeCode), $value['name']);
- $result = $uploader->getUploadedFileName();
- } catch (\Exception $e) {
- $this->_logger->critical($e);
- }
- }
- return $result;
- }
- /**
- * {@inheritdoc}
- */
- public function restoreValue($value)
- {
- return $this->_value;
- }
- /**
- * {@inheritdoc}
- */
- public function outputValue($format = \Magento\Customer\Model\Metadata\ElementFactory::OUTPUT_FORMAT_TEXT)
- {
- $output = '';
- if ($this->_value) {
- switch ($format) {
- case \Magento\Customer\Model\Metadata\ElementFactory::OUTPUT_FORMAT_JSON:
- $output = ['value' => $this->_value, 'url_key' => $this->urlEncoder->encode($this->_value)];
- break;
- }
- }
- return $output;
- }
- }