| Current Path : /var/www/clients/client3/web2/web/vendor/magento/module-customer/Model/ |
| Current File : /var/www/clients/client3/web2/web/vendor/magento/module-customer/Model/FileUploaderDataResolver.php |
<?php
declare(strict_types=1);
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Customer\Model;
use Magento\Eav\Model\Entity\Type;
use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
use Magento\Customer\Api\AddressMetadataInterface;
use Magento\Customer\Api\CustomerMetadataInterface;
/**
* Class to retrieve file uploader data for customer and customer address file & image attributes
*/
class FileUploaderDataResolver
{
/**
* Maximum file size allowed for file_uploader UI component
* This constant was copied from deprecated data provider \Magento\Customer\Model\Customer\DataProvider
*/
private const MAX_FILE_SIZE = 2097152;
/**
* @var FileProcessorFactory
*/
private $fileProcessorFactory;
/**
* File types allowed for file_uploader UI component
*
* @var array
*/
private $fileUploaderTypes = [
'image',
'file',
];
/**
* @param FileProcessorFactory $fileProcessorFactory
*/
public function __construct(
FileProcessorFactory $fileProcessorFactory
) {
$this->fileProcessorFactory = $fileProcessorFactory;
}
/**
* Override file uploader UI component data
*
* Overrides data for attributes with frontend_input equal to 'image' or 'file'.
*
* @param Customer|Address $entity
* @param array $entityData
* @return void
*/
public function overrideFileUploaderData($entity, array &$entityData): void
{
$attributes = $entity->getAttributes();
foreach ($attributes as $attribute) {
/** @var Attribute $attribute */
if (\in_array($attribute->getFrontendInput(), $this->fileUploaderTypes, true)) {
$entityData[$attribute->getAttributeCode()] = $this->getFileUploaderData(
$entity->getEntityType(),
$attribute,
$entityData
);
}
}
}
/**
* Retrieve array of values required by file uploader UI component
*
* @param Type $entityType
* @param Attribute $attribute
* @param array $customerData
* @return array
*/
private function getFileUploaderData(
Type $entityType,
Attribute $attribute,
array $customerData
): array {
$attributeCode = $attribute->getAttributeCode();
$file = $customerData[$attributeCode] ?? null;
/** @var FileProcessor $fileProcessor */
$fileProcessor = $this->fileProcessorFactory->create(['entityTypeCode' => $entityType->getEntityTypeCode()]);
if (!empty($file)
&& $fileProcessor->isExist($file)
) {
$stat = $fileProcessor->getStat($file);
$viewUrl = $fileProcessor->getViewUrl($file, $attribute->getFrontendInput());
return [
[
'file' => $file,
'size' => null !== $stat ? $stat['size'] : 0,
'url' => $viewUrl ?? '',
// phpcs:ignore Magento2.Functions.DiscouragedFunction
'name' => basename($file),
'type' => $fileProcessor->getMimeType($file),
],
];
}
return [];
}
/**
* Override file uploader UI component metadata
*
* Overrides metadata for attributes with frontend_input equal to 'image' or 'file'.
*
* @param Type $entityType
* @param AbstractAttribute $attribute
* @param array $config
* @return void
*/
public function overrideFileUploaderMetadata(
Type $entityType,
AbstractAttribute $attribute,
array &$config
): void {
if (\in_array($attribute->getFrontendInput(), $this->fileUploaderTypes, true)) {
$maxFileSize = self::MAX_FILE_SIZE;
if (isset($config['validation']['max_file_size'])) {
$maxFileSize = (int)$config['validation']['max_file_size'];
}
$allowedExtensions = [];
if (isset($config['validation']['file_extensions'])) {
$allowedExtensions = explode(',', $config['validation']['file_extensions']);
array_walk(
$allowedExtensions,
function (&$value) {
$value = strtolower(trim($value));
}
);
}
$allowedExtensions = implode(' ', $allowedExtensions);
$entityTypeCode = $entityType->getEntityTypeCode();
$url = $this->getFileUploadUrl($entityTypeCode);
$config = [
'dataType' => $this->getMetadataValue($config, 'dataType'),
'formElement' => 'fileUploader',
'componentType' => 'fileUploader',
'maxFileSize' => $maxFileSize,
'allowedExtensions' => $allowedExtensions,
'uploaderConfig' => [
'url' => $url,
],
'label' => $this->getMetadataValue($config, 'label'),
'sortOrder' => $this->getMetadataValue($config, 'sortOrder'),
'required' => $this->getMetadataValue($config, 'required'),
'visible' => $this->getMetadataValue($config, 'visible'),
'validation' => $this->getMetadataValue($config, 'validation'),
];
}
}
/**
* Retrieve metadata value
*
* @param array $config
* @param string $name
* @param mixed $default
* @return mixed
*/
private function getMetadataValue($config, $name, $default = null)
{
return $config[$name] ?? $default;
}
/**
* Retrieve URL to file upload
*
* @param string $entityTypeCode
* @return string
*/
private function getFileUploadUrl($entityTypeCode): string
{
switch ($entityTypeCode) {
case CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER:
$url = 'customer/file/customer_upload';
break;
case AddressMetadataInterface::ENTITY_TYPE_ADDRESS:
$url = 'customer/file/address_upload';
break;
default:
$url = '';
break;
}
return $url;
}
}