19 private static $instance;
21 private function __construct()
25 private function __clone()
35 if (!isset(self::$instance))
40 return self::$instance;
75 $typeId = $factory->prepareIdentifier(
$matches[2]);
78 return [$factory, $typeId];
94 if (str_ends_with($field[
'FIELD_NAME'],
'_REF'))
102 Loc::loadLanguageFile(__DIR__.
'/highloadblock.php');
104 Loc::getMessage(
'HIGHLOADBLOCK_HIGHLOAD_BLOCK_ENTITY_FIELD_NAME_REF_RESERVED'),
111 'PROVIDE_STORAGE' =>
false,
122 public static function onAfterUserTypeAdd($field)
124 $userFieldHelper = static::getInstance();
125 $parseResult = $userFieldHelper->parseUserFieldEntityId($field[
'ENTITY_ID']);
128 [$factory, $typeId] = $parseResult;
129 $userFieldManager = $userFieldHelper->getManager();
133 $dataClass = $factory->getTypeDataClass();
135 $field[
'USER_TYPE'] = $userFieldManager->getUserType($field[
'USER_TYPE_ID']);
137 $typeData = $dataClass::getById($typeId)->fetch();
139 if (empty($typeData))
142 'Entity "%s" wasn\'t found.', $factory->getUserFieldEntityId($typeId),
149 $sql_column_type = $userFieldManager->getUtsDBColumnType($field);
158 'ALTER TABLE %s ADD %s %s',
159 $sqlHelper->quote($typeData[
'TABLE_NAME']), $sqlHelper->quote($field[
'FIELD_NAME']), $sql_column_type,
162 if ($field[
'MULTIPLE'] ==
'Y')
165 $typeEntity = $dataClass::compileEntity($typeData);
166 $utmEntity = Entity::getInstance($dataClass::getUtmEntityClassName($typeEntity, $field));
168 $utmEntity->createDbTable();
172 'CREATE INDEX %s ON %s (%s)',
173 $sqlHelper->quote(
'IX_UTM_HL'.$typeId.
'_'.$field[
'ID'].
'_ID'),
174 $sqlHelper->quote($utmEntity->getDBTableName()),
175 $sqlHelper->quote(
'ID'),
179 'CREATE INDEX %s ON %s (%s)',
180 $sqlHelper->quote(
'IX_UTM_HL'.$typeId.
'_'.$field[
'ID'].
'_VALUE'),
181 $sqlHelper->quote($utmEntity->getDBTableName()),
182 $sqlHelper->quote(
'VALUE'),
186 catch (SqlQueryException $sqlQueryException)
188 $userTypeEntity = new \CUserTypeEntity;
189 $userTypeEntity->Delete($field[
'ID']);
191 throw new InvalidOperationException(
192 'Could not create new user field ' . $field[
'FIELD_NAME'],
198 'PROVIDE_STORAGE' =>
false,
211 $userFieldHelper = static::getInstance();
212 $parseResult = $userFieldHelper->parseUserFieldEntityId($field[
'ENTITY_ID']);
219 'PROVIDE_STORAGE' =>
false,
223 public static function OnAfterUserTypeDelete($field): void
225 $userFieldHelper = static::getInstance();
226 $parseResult = $userFieldHelper->parseUserFieldEntityId($field[
'ENTITY_ID']);
234 [$factory, $typeId] = $parseResult;
236 $dataClass = $factory->getTypeDataClass();
237 $typeData = $dataClass::getById($typeId)->fetch();
239 if (empty($typeData))
245 $fieldType = $userFieldHelper->getManager()->GetUserType($field[
'USER_TYPE_ID']);
246 if ($fieldType && $fieldType[
'BASE_TYPE'] ===
'file')
248 self::deleteAllFilesFromUserField($typeData[
'TABLE_NAME'], $field[
'FIELD_NAME']);
255 $connection->dropColumn($typeData[
'TABLE_NAME'], $field[
'FIELD_NAME']);
257 catch (SqlQueryException)
262 if ($field[
'MULTIPLE'] ===
'Y')
264 $utmTableName = $dataClass::getMultipleValueTableName($typeData, $field);
272 private static function deleteAllFilesFromUserField(
string $tableName,
string $fieldName): void
275 $query =
new SqlExpression(
285 catch (SqlQueryException)
291 while ($oldData = $queryResult->fetch())
293 $value = $oldData[$fieldName];
300 if (is_numeric($value))
303 \CFile::Delete($value);
307 if (is_string($value))
313 $valueUnserialized = unserialize($value, [
'allowed_classes' =>
false,
'max_depth' => 1]);
320 if (!is_array($valueUnserialized))
325 foreach ($valueUnserialized as $singleValue)
327 if (!empty($singleValue) && is_numeric($singleValue))
329 \CFile::Delete($singleValue);
336 public static function onGetUserFieldValues(Event
$event): EventResult
338 $result =
new EventResult(EventResult::SUCCESS);
341 $userFieldHelper = static::getInstance();
342 $parseResult = $userFieldHelper->parseUserFieldEntityId(
$entityId);
345 $userFields =
$event->getParameter(
'userFields');
349 [$factory, $typeId] = $parseResult;
350 $dataClass = $factory->getTypeDataClass();
351 $typeData = $dataClass::getById($typeId)->fetch();
356 $itemDataClass = $factory->getItemDataClass($typeData);
357 $values = $itemDataClass::getUserFieldValues($value, $userFields);
364 $result =
new EventResult(EventResult::SUCCESS, [
372 public static function onUpdateUserFieldValues(Event
$event): EventResult
374 $result =
new EventResult(EventResult::UNDEFINED);
377 $userFieldHelper = static::getInstance();
378 $parseResult = $userFieldHelper->parseUserFieldEntityId(
$entityId);
382 $id =
$event->getParameter(
'id');
385 [$factory, $typeId] = $parseResult;
386 $dataClass = $factory->getTypeDataClass();
387 $typeData = $dataClass::getById($typeId)->fetch();
392 $itemDataClass = $factory->getItemDataClass($typeData);
393 $updateResult = $itemDataClass::updateUserFieldValues($id,
$fields);
394 if($updateResult->isSuccess())
396 $result =
new EventResult(EventResult::SUCCESS);
400 $result =
new EventResult(EventResult::ERROR);
407 public static function onDeleteUserFieldValues(Event
$event): EventResult
409 $result =
new EventResult(EventResult::UNDEFINED);
412 $userFieldHelper = static::getInstance();
413 $parseResult = $userFieldHelper->parseUserFieldEntityId(
$entityId);
416 $id =
$event->getParameter(
'id');
419 [$factory, $typeId] = $parseResult;
420 $dataClass = $factory->getTypeDataClass();
421 $typeData = $dataClass::getById($typeId)->fetch();
426 $itemDataClass = $factory->getItemDataClass($typeData);
427 $updateResult = $itemDataClass::deleteUserFieldValues($id);
428 if($updateResult->isSuccess())
430 $result =
new EventResult(EventResult::SUCCESS);
434 $result =
new EventResult(EventResult::ERROR);