1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
filetype.php
См. документацию.
1<?php
2
3namespace Bitrix\Main\UserField\Types;
4
5use Bitrix\Main\Loader;
6use Bitrix\Main\Localization\Loc;
7use Bitrix\Main\Text\HtmlFilter;
8use Bitrix\Main\UI\FileInputUtility;
9use Bitrix\Main\UserField\File\ManualUploadRegistry;
10use Bitrix\Main\UserField\File\UploadedFilesRegistry;
11use Bitrix\UI\FileUploader\Uploader;
12use CUserTypeManager;
13
14Loc::loadMessages(__FILE__);
15
20class FileType extends BaseType
21{
22 public const USER_TYPE_ID = 'file';
23 public const RENDER_COMPONENT = 'bitrix:main.field.file';
24
25 private const AVAILABLE_VIEWS = [
26 'tile',
27 'list',
28 'adaptive',
29 ];
30
34 public static function getDescription(): array
35 {
36 return [
37 'DESCRIPTION' => Loc::getMessage('USER_TYPE_FILE_DESCRIPTION'),
38 'BASE_TYPE' => CUserTypeManager::BASE_TYPE_FILE,
39 ];
40 }
41
45 public static function getDbColumnType(): string
46 {
48 $helper = $connection->getSqlHelper();
49 return $helper->getColumnTypeByField(new \Bitrix\Main\ORM\Fields\IntegerField('x'));
50 }
51
56 public static function prepareSettings(array $userField): array
57 {
58 $size = (int)($userField['SETTINGS']['SIZE'] ?? 0);
59 $resultExtensions = [];
60
61 $extensions = [];
62 if (isset($userField['SETTINGS']['EXTENSIONS']))
63 {
64 if(is_array($userField['SETTINGS']['EXTENSIONS']))
65 {
66 $extensions = $userField['SETTINGS']['EXTENSIONS'];
67 }
68 else
69 {
70 $extensions = explode(',', $userField['SETTINGS']['EXTENSIONS']);
71 }
72 }
73
74 foreach($extensions as $key => $extension)
75 {
76 if($extension === true)
77 {
78 $extension = trim($key);
79 }
80 else
81 {
82 $extension = trim($extension);
83 }
84
85 if(!empty($extension))
86 {
87 $resultExtensions[$extension] = true;
88 }
89 }
90
91 $targetBlank = (($userField['SETTINGS']['TARGET_BLANK'] ?? 'Y') === 'N' ? 'N' : 'Y');
92
93 $defaultView = $userField['SETTINGS']['DEFAULT_VIEW'] ?? null;
94 $defaultView = self::isAvailableDefaultView($defaultView) ? $defaultView : null;
95
96 return [
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,
105 ];
106 }
107
108 public static function getFilterHtml(array $userField, ?array $additionalParameters): string
109 {
110 return '&nbsp;';
111 }
112
118 public static function checkFields(array $userField, $value): array
119 {
120 if(!is_array($value) && $value)
121 {
122 $fileInfo = \CFile::GetFileArray($value);
123 if($fileInfo)
124 {
125 $value = \CFile::MakeFileArray($fileInfo['SRC']);
126 }
127 }
128
129 $fieldName = HtmlFilter::encode(
130 empty($userField['EDIT_FORM_LABEL'])
131 ? $userField['FIELD_NAME']
132 : $userField['EDIT_FORM_LABEL']
133 );
134
135 if(
136 is_array($value)
137 && (!isset($value['tmp_name']) && !isset($value['old_id']) && !isset($value['type']))
138 )
139 {
140 return [
141 [
142 'id' => $userField['FIELD_NAME'],
143 'text' => Loc::getMessage('USER_TYPE_FILE_VALUE_IS_MULTIPLE', [
144 '#FIELD_NAME#' => $fieldName,
145 ]),
146 ],
147 ];
148 }
149
150 $msg = [];
151
152 if(is_array($value))
153 {
154 if(
155 $userField['SETTINGS']['MAX_ALLOWED_SIZE'] > 0
156 &&
157 $value['size'] > $userField['SETTINGS']['MAX_ALLOWED_SIZE']
158 )
159 {
160 $msg[] = [
161 'id' => $userField['FIELD_NAME'],
162 'text' => Loc::getMessage('USER_TYPE_FILE_MAX_SIZE_ERROR',
163 [
164 '#FIELD_NAME#' => $fieldName,
165 '#MAX_ALLOWED_SIZE#' => $userField['SETTINGS']['MAX_ALLOWED_SIZE']
166 ]
167 ),
168 ];
169 }
170
171 //Extention check
172 if(
173 is_array($userField['SETTINGS']['EXTENSIONS'])
174 &&
175 count($userField['SETTINGS']['EXTENSIONS'])
176 )
177 {
178 foreach($userField['SETTINGS']['EXTENSIONS'] as $ext => $tmp_val)
179 {
180 $userField['SETTINGS']['EXTENSIONS'][$ext] = $ext;
181 }
182 $error = \CFile::CheckFile(
183 $value,
184 0,
185 false,
186 implode(',', $userField['SETTINGS']['EXTENSIONS'])
187 );
188 }
189 else
190 {
191 $error = '';
192 }
193
194 if($error)
195 {
196 $msg[] = [
197 'id' => $userField['FIELD_NAME'],
198 'text' => $error,
199 ];
200 }
201
202 //For user without edit php permissions we allow only pictures upload
203 global $USER;
204 if(!is_object($USER) || !$USER->IsAdmin())
205 {
206 if(HasScriptExtension($value['name']))
207 {
208 $msg[] = [
209 'id' => $userField['FIELD_NAME'],
210 'text' => Loc::getMessage('FILE_BAD_TYPE') . ' (' . $value['name'] . ').'
211 ];
212 }
213 }
214 }
215
216 return $msg;
217 }
218
219 public static function onBeforeSave(array $userField, $value)
220 {
221 // old mechanism
222 if(is_array($value))
223 {
224 return self::prepareUploadedFileViaOldMechanism($userField, $value);
225 }
226
227 if($value > 0)
228 {
229 $value = (int)$value;
230
231 // new mechanism - mail.file.input
232 $isValid = self::validateUploadedFileViaFileInputUtility($userField, $value);
233 if ($isValid !== null)
234 {
235 return $isValid ? $value : false;
236 }
237
238 $isValid = self::validateUploadedFileViaCurrentUserFieldValue($userField, $value);
239 if ($isValid !== null)
240 {
241 return $isValid ? $value : false;
242 }
243
244 $isValid = self::validateUploadedFileViaManualUploadRegistry($userField, $value);
245 if ($isValid !== null)
246 {
247 return $isValid ? $value : false;
248 }
249 }
250
251 return false;
252 }
253
254 private static function prepareUploadedFileViaOldMechanism(array $userField, array $value): mixed
255 {
256 $userFieldValues = (is_array($userField['VALUE']) ? $userField['VALUE'] : [$userField['VALUE']]);
257 $valueHasOldId = !empty($value['old_id']);
258
259 //Protect from user manipulation
260 if($valueHasOldId)
261 {
262 $value['old_id'] = (is_array($value['old_id']) ? $value['old_id'] : [$value['old_id']]);
263 foreach ($value['old_id'] as $key => $oldId)
264 {
265 if(!in_array($oldId, $userFieldValues))
266 {
267 unset($value['old_id'][$key]);
268 }
269 }
270
271 if ($value['del'])
272 {
273 foreach ($value['old_id'] as $oldId)
274 {
275 \CFile::Delete($oldId);
276 }
277 $value['old_id'] = false;
278 }
279 }
280
281 if($value['error'])
282 {
283 return (is_array($value['old_id']) ? $value['old_id'][0] : $value['old_id']);
284 }
285
286 $value['MODULE_ID'] = 'main';
287
288 if ($valueHasOldId && is_array($value['old_id']))
289 {
290 foreach ($value['old_id'] as $oldId)
291 {
292 if (!isset($value['ID']) || !in_array($value['ID'], $value['old_id']))
293 {
294 \CFile::Delete($oldId);
295 }
296 }
297 }
298
299 if (!empty($value['name']))
300 {
301 if (
302 $valueHasOldId
303 && is_array($value['old_id'])
304 && isset($value['ID'])
305 && in_array($value['ID'], $value['old_id'])
306 )
307 {
308 return $value['ID'];
309 }
310
311 return \CFile::SaveFile($value, 'uf');
312 }
313
314 return false;
315 }
316
317 private static function validateUploadedFileViaFileInputUtility(array $userField, int $value): ?bool
318 {
319 $fileInputUtility = FileInputUtility::instance();
320 if (!$fileInputUtility->isAccessible())
321 {
322 return null;
323 }
324
325 $controlId = $fileInputUtility->getUserFieldCid($userField);
326
327 $delResult = $fileInputUtility->checkDeletedFiles($controlId);
328 if (in_array($value, $delResult))
329 {
330 return false;
331 }
332
333 $checkResult = $fileInputUtility->checkFiles($controlId, [$value]);
334 if (in_array($value, $checkResult))
335 {
336 return self::tryMakeFilePersistent($userField, $value);
337 }
338
339 return null;
340 }
341
342 private static function validateUploadedFileViaCurrentUserFieldValue(array $userField, int $value): ?bool
343 {
344 if (is_array($userField['VALUE']) && in_array($value, $userField['VALUE']))
345 {
346 return true;
347 }
348
349 if (!is_array($userField['VALUE']) && (int)$userField['VALUE'] === $value)
350 {
351 return true;
352 }
353
354 return null;
355 }
356
357 private static function validateUploadedFileViaManualUploadRegistry(array $userField, int $value): ?bool
358 {
360 if ($registry->isFileRegistered($userField, $value))
361 {
362 return true;
363 }
364
365 return null;
366 }
367
368 public static function onSearchIndex(array $userField): ?string
369 {
370 static $max_file_size = null;
371 $result = '';
372
373 if(is_array($userField['VALUE']))
374 {
375 $value = $userField['VALUE'];
376 }
377 else
378 {
379 $value = [$userField['VALUE']];
380 }
381
382 $value = array_filter($value, 'strlen');
383 if(!empty($value))
384 {
385 $value = array_map([static::class, 'getFileContent'], $value);
386 $result = implode('\r\n', $value);
387 }
388
389 return $result;
390 }
391
392 public static function getFileContent($fileId)
393 {
394 static $maxFileSize = null;
395
396 $file = \CFile::MakeFileArray($fileId);
397 if($file && isset($file['tmp_name']))
398 {
399 if(!isset($maxFileSize))
400 {
401 $optionInt = \COption::GetOptionInt(
402 'search',
403 'max_file_size',
404 0
405 );
406 $maxFileSize = $optionInt * 1024;
407 }
408
409 if($maxFileSize > 0 && $file['size'] > $maxFileSize)
410 {
411 return '';
412 }
413
414 $files = false;
415 $events = GetModuleEvents(
416 'search',
417 'OnSearchGetFileContent',
418 true
419 );
420 foreach($events as $event)
421 {
422 if($files = ExecuteModuleEventEx($event, [$file['tmp_name']]))
423 {
424 break;
425 }
426 }
427
428 if(is_array($files))
429 {
430 return $files['CONTENT'];
431 }
432 }
433
434 return '';
435 }
436
437 public static function getPublicEditMultiple(array $userField, ?array $additionalParameters = []): string
438 {
439 return parent::getPublicEdit($userField, $additionalParameters);
440 }
441
442 public static function canUseArrayValueForSingleField(): bool
443 {
444 return true;
445 }
446
447 private static function tryMakeFilePersistent(array $userField, int $fileId): bool
448 {
449 $uploaderContextGenerator = (new \Bitrix\Main\UserField\File\UploaderContextGenerator(FileInputUtility::instance(), $userField));
450 $controlId = $uploaderContextGenerator->getControlId();
451
452 $uploadedFilesRegistry = UploadedFilesRegistry::getInstance();
453 $tempFileToken = $uploadedFilesRegistry->getTokenByFileId($controlId, $fileId);
454 if ($tempFileToken) // if token found, assume file was uploaded via \Bitrix\Main\FileUploader\FieldFileUploaderController
455 {
456 $cid = $uploadedFilesRegistry->getCidByFileId($controlId, $fileId);
457
458 if (!FileInputUtility::instance()->isCidRegistered($cid)) // cid not found, so $fileId cannot be made persistent. This case is not allowed to save due to possible data loss.
459 {
460 return false;
461 }
462
463 if (!Loader::includeModule('ui'))
464 {
465 return false;
466 }
467
468 $uploader = new Uploader(
469 new \Bitrix\Main\FileUploader\FieldFileUploaderController($uploaderContextGenerator->getContextInEditMode($cid))
470 );
471 $uploader->getPendingFiles([$tempFileToken])->makePersistent();
472
473 $uploadedFilesRegistry->unregisterFile($controlId, $fileId);
474 }
475
476 return true;
477 }
478
479 public static function isAvailableDefaultView(mixed $view): bool
480 {
481 return in_array($view, self::AVAILABLE_VIEWS, true);
482 }
483}
$connection
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
static includeModule($moduleName)
Определения loader.php:67
static isAvailableDefaultView(mixed $view)
Определения filetype.php:479
static getFileContent($fileId)
Определения filetype.php:392
static onBeforeSave(array $userField, $value)
Определения filetype.php:219
static canUseArrayValueForSingleField()
Определения filetype.php:442
static getDescription()
Определения filetype.php:34
static getFilterHtml(array $userField, ?array $additionalParameters)
Определения filetype.php:108
static onSearchIndex(array $userField)
Определения filetype.php:368
static getDbColumnType()
Определения filetype.php:45
static checkFields(array $userField, $value)
Определения filetype.php:118
static prepareSettings(array $userField)
Определения filetype.php:56
static getPublicEditMultiple(array $userField, ?array $additionalParameters=[])
Определения filetype.php:437
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
global $USER
Определения csv_new_run.php:40
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
HasScriptExtension($check_name)
Определения tools.php:2956
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
$value
Определения Param.php:39
$files
Определения mysql_to_pgsql.php:30
$event
Определения prolog_after.php:141
if(empty($signedUserToken)) $key
Определения quickway.php:257
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$error
Определения subscription_card_product.php:20