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() { /** @var FileProcessor $fileProcessor */ $fileProcessor = $this->fileProcessorFactory->create([ 'entityTypeCode' => $this->entityTypeCode, 'allowedExtensions' => $this->getAllowedExtensions(), ]); $result = $fileProcessor->saveTemporaryFile($this->scope . '[' . $this->getAttributeCode() . ']'); // 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() { return key($_FILES[$this->scope]['name']); } /** * Retrieve data from global $_FILES array * * @return array */ private function getData() { $data = []; $fileAttributes = $_FILES[$this->scope]; foreach ($fileAttributes as $attributeName => $attributeValue) { $data[$attributeName] = $attributeValue[$this->getAttributeCode()]; } 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; } }