• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/mysql/user.php
  • Класс: CUser
  • Вызов: CUser::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"]);

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

		if($arFields["PERSONAL_GENDER"]=="NOT_REF" || ($arFields["PERSONAL_GENDER"]!="M" && $arFields["PERSONAL_GENDER"]!="F"))
			$arFields["PERSONAL_GENDER"] = "";

		$original_pass = $arFields["PASSWORD"];
		$salt = randString(8);
		$arFields["PASSWORD"] = $salt.md5($salt.$arFields["PASSWORD"]);
		unset($arFields["STORED_HASH"]);

		$salt =  randString(8);
		$checkword = ($arFields["CHECKWORD"] == ''? md5(CMain::GetServerUniqID().uniqid()) : $arFields["CHECKWORD"]);
		$arFields["CHECKWORD"] = $salt.md5($salt.$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"))
			CUser::SetUserGroup($ID, $arFields["GROUP_ID"], true);

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

		//update digest hash for http digest authorization
		if(COption::GetOptionString('main', 'use_digest_auth', 'N') == 'Y')
			CUser::UpdateDigest($ID, $original_pass);

		if(MainConfigOption::get("main", "user_profile_history") === "Y")
		{
			MainUserProfileHistoryTable::addHistory($ID, MainUserProfileHistoryTable::TYPE_ADD);
		}

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

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

	foreach (GetModuleEvents("main", "OnAfterUserAdd", true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array(&$arFields));

	if($ID > 0 && defined("BX_COMP_MANAGED_CACHE"))
	{
		$isRealUser = !$arFields['EXTERNAL_AUTH_ID'] || !in_array($arFields['EXTERNAL_AUTH_ID'], BitrixMainUserTable::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");
	}

	BitrixMainUserTable::indexRecord($ID);

	return $Result;
}