25 private const AVAILABLE_VIEWS = [
37 'DESCRIPTION' => Loc::getMessage(
'USER_TYPE_FILE_DESCRIPTION'),
38 'BASE_TYPE' => CUserTypeManager::BASE_TYPE_FILE,
58 $size = (int)($userField[
'SETTINGS'][
'SIZE'] ?? 0);
59 $resultExtensions = [];
62 if (isset($userField[
'SETTINGS'][
'EXTENSIONS']))
64 if(is_array($userField[
'SETTINGS'][
'EXTENSIONS']))
66 $extensions = $userField[
'SETTINGS'][
'EXTENSIONS'];
70 $extensions = explode(
',', $userField[
'SETTINGS'][
'EXTENSIONS']);
74 foreach($extensions as
$key => $extension)
76 if($extension ===
true)
78 $extension = trim(
$key);
82 $extension = trim($extension);
85 if(!empty($extension))
87 $resultExtensions[$extension] =
true;
91 $targetBlank = (($userField[
'SETTINGS'][
'TARGET_BLANK'] ??
'Y') ===
'N' ?
'N' :
'Y');
93 $defaultView = $userField[
'SETTINGS'][
'DEFAULT_VIEW'] ??
null;
97 'SIZE' => ($size <= 1 ? 20 : ($size > 255 ? 225 : $size)),
98 'LIST_WIDTH' => (
int)($userField[
'SETTINGS'][
'LIST_WIDTH'] ?? 0),
99 'LIST_HEIGHT' => (
int)($userField[
'SETTINGS'][
'LIST_HEIGHT'] ?? 0),
100 'MAX_SHOW_SIZE' => (
int)($userField[
'SETTINGS'][
'MAX_SHOW_SIZE'] ?? 0),
101 'MAX_ALLOWED_SIZE' => (
int)($userField[
'SETTINGS'][
'MAX_ALLOWED_SIZE'] ?? 0),
102 'EXTENSIONS' => $resultExtensions,
103 'TARGET_BLANK' => $targetBlank,
104 'DEFAULT_VIEW' => $defaultView,
120 if(!is_array($value) && $value)
122 $fileInfo = \CFile::GetFileArray($value);
125 $value = \CFile::MakeFileArray($fileInfo[
'SRC']);
129 $fieldName = HtmlFilter::encode(
130 empty($userField[
'EDIT_FORM_LABEL'])
131 ? $userField[
'FIELD_NAME']
132 : $userField[
'EDIT_FORM_LABEL']
137 && (!isset($value[
'tmp_name']) && !isset($value[
'old_id']) && !isset($value[
'type']))
142 'id' => $userField[
'FIELD_NAME'],
143 'text' => Loc::getMessage(
'USER_TYPE_FILE_VALUE_IS_MULTIPLE', [
144 '#FIELD_NAME#' => $fieldName,
155 $userField[
'SETTINGS'][
'MAX_ALLOWED_SIZE'] > 0
157 $value[
'size'] > $userField[
'SETTINGS'][
'MAX_ALLOWED_SIZE']
161 'id' => $userField[
'FIELD_NAME'],
162 'text' => Loc::getMessage(
'USER_TYPE_FILE_MAX_SIZE_ERROR',
164 '#FIELD_NAME#' => $fieldName,
165 '#MAX_ALLOWED_SIZE#' => $userField[
'SETTINGS'][
'MAX_ALLOWED_SIZE']
173 is_array($userField[
'SETTINGS'][
'EXTENSIONS'])
175 count($userField[
'SETTINGS'][
'EXTENSIONS'])
178 foreach($userField[
'SETTINGS'][
'EXTENSIONS'] as $ext => $tmp_val)
180 $userField[
'SETTINGS'][
'EXTENSIONS'][$ext] = $ext;
182 $error = \CFile::CheckFile(
186 implode(
',', $userField[
'SETTINGS'][
'EXTENSIONS'])
197 'id' => $userField[
'FIELD_NAME'],
209 'id' => $userField[
'FIELD_NAME'],
210 'text' => Loc::getMessage(
'FILE_BAD_TYPE') .
' (' . $value[
'name'] .
').'
224 return self::prepareUploadedFileViaOldMechanism($userField, $value);
229 $value = (int)$value;
232 $isValid = self::validateUploadedFileViaFileInputUtility($userField, $value);
233 if ($isValid !==
null)
235 return $isValid ? $value :
false;
238 $isValid = self::validateUploadedFileViaCurrentUserFieldValue($userField, $value);
239 if ($isValid !==
null)
241 return $isValid ? $value :
false;
244 $isValid = self::validateUploadedFileViaManualUploadRegistry($userField, $value);
245 if ($isValid !==
null)
247 return $isValid ? $value :
false;
254 private static function prepareUploadedFileViaOldMechanism(
array $userField,
array $value): mixed
256 $userFieldValues = (is_array($userField[
'VALUE']) ? $userField[
'VALUE'] : [$userField[
'VALUE']]);
257 $valueHasOldId = !empty($value[
'old_id']);
262 $value[
'old_id'] = (is_array($value[
'old_id']) ? $value[
'old_id'] : [$value[
'old_id']]);
263 foreach ($value[
'old_id'] as
$key => $oldId)
265 if(!in_array($oldId, $userFieldValues))
267 unset($value[
'old_id'][
$key]);
273 foreach ($value[
'old_id'] as $oldId)
275 \CFile::Delete($oldId);
277 $value[
'old_id'] =
false;
283 return (is_array($value[
'old_id']) ? $value[
'old_id'][0] : $value[
'old_id']);
286 $value[
'MODULE_ID'] =
'main';
288 if ($valueHasOldId && is_array($value[
'old_id']))
290 foreach ($value[
'old_id'] as $oldId)
292 if (!isset($value[
'ID']) || !in_array($value[
'ID'], $value[
'old_id']))
294 \CFile::Delete($oldId);
299 if (!empty($value[
'name']))
303 && is_array($value[
'old_id'])
304 && isset($value[
'ID'])
305 && in_array($value[
'ID'], $value[
'old_id'])
311 return \CFile::SaveFile($value,
'uf');
317 private static function validateUploadedFileViaFileInputUtility(
array $userField,
int $value): ?bool
319 $fileInputUtility = FileInputUtility::instance();
320 if (!$fileInputUtility->isAccessible())
325 $controlId = $fileInputUtility->getUserFieldCid($userField);
327 $delResult = $fileInputUtility->checkDeletedFiles($controlId);
328 if (in_array($value, $delResult))
333 $checkResult = $fileInputUtility->checkFiles($controlId, [$value]);
334 if (in_array($value, $checkResult))
336 return self::tryMakeFilePersistent($userField, $value);
342 private static function validateUploadedFileViaCurrentUserFieldValue(
array $userField,
int $value): ?bool
344 if (is_array($userField[
'VALUE']) && in_array($value, $userField[
'VALUE']))
349 if (!is_array($userField[
'VALUE']) && (
int)$userField[
'VALUE'] === $value)
357 private static function validateUploadedFileViaManualUploadRegistry(
array $userField,
int $value): ?bool
360 if ($registry->isFileRegistered($userField, $value))
370 static $max_file_size =
null;
373 if(is_array($userField[
'VALUE']))
375 $value = $userField[
'VALUE'];
379 $value = [$userField[
'VALUE']];
382 $value = array_filter($value,
'strlen');
385 $value = array_map([static::class,
'getFileContent'], $value);
386 $result = implode(
'\r\n', $value);
394 static $maxFileSize =
null;
396 $file = \CFile::MakeFileArray($fileId);
397 if($file && isset($file[
'tmp_name']))
399 if(!isset($maxFileSize))
401 $optionInt = \COption::GetOptionInt(
406 $maxFileSize = $optionInt * 1024;
409 if($maxFileSize > 0 && $file[
'size'] > $maxFileSize)
417 'OnSearchGetFileContent',
420 foreach($events as
$event)
439 return parent::getPublicEdit($userField, $additionalParameters);
447 private static function tryMakeFilePersistent(
array $userField,
int $fileId): bool
449 $uploaderContextGenerator = (new \Bitrix\Main\UserField\File\UploaderContextGenerator(FileInputUtility::instance(), $userField));
450 $controlId = $uploaderContextGenerator->getControlId();
452 $uploadedFilesRegistry = UploadedFilesRegistry::getInstance();
453 $tempFileToken = $uploadedFilesRegistry->getTokenByFileId($controlId, $fileId);
456 $cid = $uploadedFilesRegistry->getCidByFileId($controlId, $fileId);
458 if (!FileInputUtility::instance()->isCidRegistered($cid))
468 $uploader =
new Uploader(
469 new \
Bitrix\
Main\
FileUploader\FieldFileUploaderController($uploaderContextGenerator->getContextInEditMode($cid))
471 $uploader->getPendingFiles([$tempFileToken])->makePersistent();
473 $uploadedFilesRegistry->unregisterFile($controlId, $fileId);
481 return in_array($view, self::AVAILABLE_VIEWS,
true);
static getConnection($name="")
static includeModule($moduleName)
static isAvailableDefaultView(mixed $view)
static getFileContent($fileId)
static onBeforeSave(array $userField, $value)
static canUseArrayValueForSingleField()
static getFilterHtml(array $userField, ?array $additionalParameters)
static onSearchIndex(array $userField)
static checkFields(array $userField, $value)
static prepareSettings(array $userField)
static getPublicEditMultiple(array $userField, ?array $additionalParameters=[])