• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/user.php
  • Класс: CAllUser
  • Вызов: CAllUser::Add
public function Add($arFields)
{
	/** @global CUserTypeManager $USER_FIELD_MANAGER */
	global $DB, $USER_FIELD_MANAGER, $CACHE_MANAGER;

	$ID = 0;
	if (!$this->CheckFields($arFields))
	{
		$Result = false;
		$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
	}
	else
	{
		unset($arFields["ID"]);
		unset($arFields["STORED_HASH"]);

		$arFields['ACTIVE'] = (is_set($arFields, 'ACTIVE') && $arFields['ACTIVE'] != 'Y' ? 'N' : 'Y');
		$arFields['BLOCKED'] = (is_set($arFields, 'BLOCKED') && $arFields['BLOCKED'] == 'Y' ? 'Y' : 'N');
		$arFields['PASSWORD_EXPIRED'] = (is_set($arFields, 'PASSWORD_EXPIRED') && $arFields['PASSWORD_EXPIRED'] == 'Y' ? 'Y' : 'N');

		if (
			!isset($arFields["PERSONAL_GENDER"])
			|| ($arFields["PERSONAL_GENDER"] != "M" && $arFields["PERSONAL_GENDER"] != "F")
		)
		{
			$arFields["PERSONAL_GENDER"] = '';
		}

		$originalPassword = $arFields["PASSWORD"];
		$arFields["PASSWORD"] = Password::hash($arFields["PASSWORD"]);

		$checkword = empty($arFields["CHECKWORD"]) ? Random::getString(32) : $arFields["CHECKWORD"];
		$arFields["CHECKWORD"] = Password::hash($checkword);

		$arFields["~CHECKWORD_TIME"] = $DB->CurrentTimeFunction();

		if (is_set($arFields, "WORK_COUNTRY"))
		{
			$arFields["WORK_COUNTRY"] = intval($arFields["WORK_COUNTRY"]);
		}

		if (is_set($arFields, "PERSONAL_COUNTRY"))
		{
			$arFields["PERSONAL_COUNTRY"] = intval($arFields["PERSONAL_COUNTRY"]);
		}

		if (
			array_key_exists("PERSONAL_PHOTO", $arFields)
			&& is_array($arFields["PERSONAL_PHOTO"])
			&& (
				!array_key_exists("MODULE_ID", $arFields["PERSONAL_PHOTO"])
				|| $arFields["PERSONAL_PHOTO"]["MODULE_ID"] == ''
			)
		)
		{
			$arFields["PERSONAL_PHOTO"]["MODULE_ID"] = 'main';
		}

		CFile::SaveForDB($arFields, "PERSONAL_PHOTO", 'main');

		if (
			array_key_exists("WORK_LOGO", $arFields)
			&& is_array($arFields["WORK_LOGO"])
			&& (
				!array_key_exists("MODULE_ID", $arFields["WORK_LOGO"])
				|| $arFields["WORK_LOGO"]["MODULE_ID"] == ''
			)
		)
		{
			$arFields["WORK_LOGO"]["MODULE_ID"] = 'main';
		}

		CFile::SaveForDB($arFields, "WORK_LOGO", 'main');

		$arInsert = $DB->PrepareInsert("b_user", $arFields);

		if (!is_set($arFields, "DATE_REGISTER"))
		{
			$arInsert[0] .= ", DATE_REGISTER";
			$arInsert[1] .= ", " . $DB->GetNowFunction();
		}

		$strSql = "
			INSERT INTO b_user (
				" . $arInsert[0] . "
			) VALUES (
				" . $arInsert[1] . "
			)
		";
		$DB->Query($strSql);
		$ID = $DB->LastID();

		$USER_FIELD_MANAGER->Update("USER", $ID, $arFields);

		CAccess::RecalculateForUser($ID, CUserAuthProvider::ID);

		if (is_set($arFields, "GROUP_ID"))
		{
			static::SetUserGroup($ID, $arFields["GROUP_ID"], true);
		}

		if (isset($arFields["PHONE_NUMBER"]) && $arFields["PHONE_NUMBER"] != '')
		{
			MainUserPhoneAuthTable::add([
				"USER_ID" => $ID,
				"PHONE_NUMBER" => $arFields["PHONE_NUMBER"],
			]);
		}

		//update digest hash for http digest authorization
		if (Option::get('main', 'use_digest_auth', 'N') == 'Y')
		{
			static::UpdateDigest($ID, $originalPassword);
		}

		//history of passwords
		UserPasswordTable::add([
			"USER_ID" => $ID,
			"PASSWORD" => $arFields["PASSWORD"],
			"DATE_CHANGE" => new MainTypeDateTime(),
		]);

		if (Option::get('main', 'user_profile_history') === 'Y')
		{
			UserProfileHistoryTable::addHistory($ID, UserProfileHistoryTable::TYPE_ADD);
		}

		$Result = $ID;
		$arFields["ID"] = &$ID;
		$arFields["CHECKWORD"] = $checkword;
	}

	$arFields["RESULT"] = &$Result;

	foreach (GetModuleEvents('main', 'OnAfterUserAdd', true) as $arEvent)
	{
		ExecuteModuleEventEx($arEvent, [&$arFields]);
	}

	if ($ID > 0 && defined("BX_COMP_MANAGED_CACHE"))
	{
		$isRealUser = empty($arFields['EXTERNAL_AUTH_ID']) || !in_array($arFields['EXTERNAL_AUTH_ID'], MainUserTable::getExternalUserTypes());

		$CACHE_MANAGER->ClearByTag("USER_CARD_" . intval($ID / TAGGED_user_card_size));
		$CACHE_MANAGER->ClearByTag($isRealUser ? "USER_CARD" : "EXTERNAL_USER_CARD");

		$CACHE_MANAGER->ClearByTag("USER_NAME_" . $ID);
		$CACHE_MANAGER->ClearByTag($isRealUser ? "USER_NAME" : "EXTERNAL_USER_NAME");
	}

	MainUserTable::indexRecord($ID);

	return $Result;
}