mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
208 lines
5.5 KiB
PHP
208 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Customer\Model;
|
|
|
|
use Magento\Customer\Api\AddressMetadataInterface;
|
|
use Magento\Customer\Api\CustomerMetadataInterface;
|
|
use Magento\Customer\Api\Data\AttributeMetadataInterface;
|
|
use Magento\Customer\Model\FileProcessorFactory;
|
|
use Magento\Customer\Model\Metadata\ElementFactory;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
|
|
class FileUploader
|
|
{
|
|
/**
|
|
* @var CustomerMetadataInterface
|
|
*/
|
|
private $customerMetadataService;
|
|
|
|
/**
|
|
* @var AddressMetadataInterface
|
|
*/
|
|
private $addressMetadataService;
|
|
|
|
/**
|
|
* @var ElementFactory
|
|
*/
|
|
private $elementFactory;
|
|
|
|
/**
|
|
* @var FileProcessorFactory
|
|
*/
|
|
private $fileProcessorFactory;
|
|
|
|
/**
|
|
* @var AttributeMetadataInterface
|
|
*/
|
|
private $attributeMetadata;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $entityTypeCode;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $scope;
|
|
|
|
/**
|
|
* @param CustomerMetadataInterface $customerMetadataService
|
|
* @param AddressMetadataInterface $addressMetadataService
|
|
* @param ElementFactory $elementFactory
|
|
* @param FileProcessorFactory $fileProcessorFactory
|
|
* @param AttributeMetadataInterface $attributeMetadata
|
|
* @param string $entityTypeCode
|
|
* @param string $scope
|
|
*/
|
|
public function __construct(
|
|
CustomerMetadataInterface $customerMetadataService,
|
|
AddressMetadataInterface $addressMetadataService,
|
|
ElementFactory $elementFactory,
|
|
FileProcessorFactory $fileProcessorFactory,
|
|
AttributeMetadataInterface $attributeMetadata,
|
|
$entityTypeCode,
|
|
$scope
|
|
) {
|
|
$this->customerMetadataService = $customerMetadataService;
|
|
$this->addressMetadataService = $addressMetadataService;
|
|
$this->elementFactory = $elementFactory;
|
|
$this->fileProcessorFactory = $fileProcessorFactory;
|
|
$this->attributeMetadata = $attributeMetadata;
|
|
$this->entityTypeCode = $entityTypeCode;
|
|
$this->scope = $scope;
|
|
}
|
|
|
|
/**
|
|
* Validate uploaded file
|
|
*
|
|
* @return array|bool
|
|
*/
|
|
public function validate()
|
|
{
|
|
$formElement = $this->elementFactory->create(
|
|
$this->attributeMetadata,
|
|
null,
|
|
$this->entityTypeCode
|
|
);
|
|
|
|
$errors = $formElement->validateValue($this->getData());
|
|
return $errors;
|
|
}
|
|
|
|
/**
|
|
* Execute file uploading
|
|
*
|
|
* @return \string[]
|
|
* @throws LocalizedException
|
|
*/
|
|
public function upload()
|
|
{
|
|
return $this->uploadFile();
|
|
}
|
|
|
|
/**
|
|
* File uploading process
|
|
*
|
|
* @param bool $useScope
|
|
* @return string[]
|
|
* @throws LocalizedException
|
|
*/
|
|
public function uploadFile($useScope = true)
|
|
{
|
|
/** @var FileProcessor $fileProcessor */
|
|
$fileProcessor = $this->fileProcessorFactory->create(
|
|
[
|
|
'entityTypeCode' => $this->entityTypeCode,
|
|
'allowedExtensions' => $this->getAllowedExtensions(),
|
|
]
|
|
);
|
|
|
|
if ($useScope === true) {
|
|
$fileId = $this->scope . '[' . $this->getAttributeCode() . ']';
|
|
} else {
|
|
$fileId = $this->getAttributeCode();
|
|
}
|
|
$result = $fileProcessor->saveTemporaryFile($fileId);
|
|
|
|
// Update tmp_name param. Required for attribute validation!
|
|
$result['tmp_name'] = ltrim($result['file'] ?? '', '/');
|
|
|
|
$result['url'] = $fileProcessor->getViewUrl(
|
|
FileProcessor::TMP_DIR . '/' . ltrim($result['name'] ?? '', '/'),
|
|
$this->attributeMetadata->getFrontendInput()
|
|
);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get attribute code
|
|
*
|
|
* @return string
|
|
*/
|
|
private function getAttributeCode()
|
|
{
|
|
// phpcs:disable Magento2.Security.Superglobal
|
|
if (is_array($_FILES[$this->scope]['name'])) {
|
|
$code = key($_FILES[$this->scope]['name']);
|
|
} else {
|
|
$code = $this->scope;
|
|
}
|
|
// phpcs:enable Magento2.Security.Superglobal
|
|
return $code;
|
|
}
|
|
|
|
/**
|
|
* Retrieve data from global $_FILES array
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getData()
|
|
{
|
|
$data = [];
|
|
|
|
// phpcs:disable Magento2.Security.Superglobal
|
|
$fileAttributes = $_FILES[$this->scope];
|
|
foreach ($fileAttributes as $attributeName => $attributeValue) {
|
|
if (is_array($attributeValue)) {
|
|
$data[$attributeName] = $attributeValue[$this->getAttributeCode()];
|
|
} else {
|
|
$data[$attributeName] = $attributeValue;
|
|
}
|
|
}
|
|
// phpcs:enable Magento2.Security.Superglobal
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Get allowed extensions
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getAllowedExtensions()
|
|
{
|
|
$allowedExtensions = [];
|
|
|
|
$validationRules = $this->attributeMetadata->getValidationRules();
|
|
foreach ($validationRules as $validationRule) {
|
|
if ($validationRule->getName() == 'file_extensions') {
|
|
$allowedExtensions = explode(',', $validationRule->getValue() ?? '');
|
|
array_walk(
|
|
$allowedExtensions,
|
|
function (&$value) {
|
|
$value = strtolower(trim($value));
|
|
}
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $allowedExtensions;
|
|
}
|
|
}
|