• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/userfield/internal/userfieldhelper.php
  • Класс: BitrixMainUserFieldInternalUserFieldHelper
  • Вызов: UserFieldHelper::onAfterUserTypeAdd
static function onAfterUserTypeAdd($field)
{
	$userFieldHelper = static::getInstance();
	$parseResult = $userFieldHelper->parseUserFieldEntityId($field['ENTITY_ID']);
	if($parseResult)
	{
		[$factory, $typeId] = $parseResult;
		$userFieldManager = $userFieldHelper->getManager();
		$application = $userFieldHelper->getApplication();
		/** @var TypeFactory $factory */
		/** @var TypeDataManager $dataClass */
		$dataClass = $factory->getTypeDataClass();

		$field['USER_TYPE'] = $userFieldManager->getUserType($field['USER_TYPE_ID']);

		$typeData = $dataClass::getById($typeId)->fetch();

		if (empty($typeData))
		{
			$application->throwException(sprintf(
				'Entity "%s" wasn't found.', $factory->getUserFieldEntityId($typeId)
			));

			return false;
		}

		// get usertype info
		$sql_column_type = $userFieldManager->getUtsDBColumnType($field);

		// create field in db
		$connection = Application::getConnection();
		$sqlHelper = $connection->getSqlHelper();

		try
		{
			$connection->query(sprintf(
				'ALTER TABLE %s ADD %s %s',
				$sqlHelper->quote($typeData['TABLE_NAME']), $sqlHelper->quote($field['FIELD_NAME']), $sql_column_type
			));

			if ($field['MULTIPLE'] == 'Y')
			{
				// create table for this relation
				$typeEntity = $dataClass::compileEntity($typeData);
				$utmEntity = Entity::getInstance($dataClass::getUtmEntityClassName($typeEntity, $field));

				$utmEntity->createDbTable();

				// add indexes
				$connection->query(sprintf(
					'CREATE INDEX %s ON %s (%s)',
					$sqlHelper->quote('IX_UTM_HL'.$typeId.'_'.$field['ID'].'_ID'),
					$sqlHelper->quote($utmEntity->getDBTableName()),
					$sqlHelper->quote('ID')
				));

				$connection->query(sprintf(
					'CREATE INDEX %s ON %s (%s)',
					$sqlHelper->quote('IX_UTM_HL'.$typeId.'_'.$field['ID'].'_VALUE'),
					$sqlHelper->quote($utmEntity->getDBTableName()),
					$sqlHelper->quote('VALUE')
				));
			}
		}
		catch (SqlQueryException $sqlQueryException)
		{
			$userTypeEntity = new CUserTypeEntity;
			$userTypeEntity->Delete($field['ID']);

			throw new InvalidOperationException(
				'Could not create new user field ' . $field['FIELD_NAME'],
				$sqlQueryException
			);
		}

		return [
			'PROVIDE_STORAGE' => false
		];
	}

	return true;
}