123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- <?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 ?? '',
- '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 = [
- '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;
- }
- }
|