function Add($arFields, $bCheckUserType = true)
{
global $DB, $APPLICATION, $USER_FIELD_MANAGER, $CACHE_MANAGER;
if(!$this->CheckFields(0, $arFields, $bCheckUserType))
return false;
$rs = CUserTypeEntity::GetList(array(), array(
"ENTITY_ID" => $arFields["ENTITY_ID"],
"FIELD_NAME" => $arFields["FIELD_NAME"],
));
if($rs->Fetch())
{
$aMsg = array();
$aMsg[] = array(
"id" => "FIELD_NAME",
"text" => GetMessage("USER_TYPE_ADD_ALREADY_ERROR", array(
"#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
"#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
)),
);
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
unset($arFields["ID"]);
if(!isset($arFields["SORT"]) || intval($arFields["SORT"]) <= 0)
$arFields["SORT"] = 100;
if(!isset($arFields["MULTIPLE"]) || $arFields["MULTIPLE"] !== "Y")
$arFields["MULTIPLE"] = "N";
if(!isset($arFields["MANDATORY"]) || $arFields["MANDATORY"] !== "Y")
$arFields["MANDATORY"] = "N";
$arFields["SHOW_FILTER"] = mb_substr($arFields["SHOW_FILTER"] ?? '', 0, 1);
if($arFields["SHOW_FILTER"] == '' || mb_strpos("NIES", $arFields["SHOW_FILTER"]) === false)
$arFields["SHOW_FILTER"] = "N";
if(!isset($arFields["SHOW_IN_LIST"]) || $arFields["SHOW_IN_LIST"] !== "N")
$arFields["SHOW_IN_LIST"] = "Y";
if(!isset($arFields["EDIT_IN_LIST"]) || $arFields["EDIT_IN_LIST"] !== "N")
$arFields["EDIT_IN_LIST"] = "Y";
if(!isset($arFields["IS_SEARCHABLE"]) || $arFields["IS_SEARCHABLE"] !== "Y")
$arFields["IS_SEARCHABLE"] = "N";
if(!array_key_exists("SETTINGS", $arFields))
$arFields["SETTINGS"] = array();
$arFields["SETTINGS"] = serialize($USER_FIELD_MANAGER->PrepareSettings(0, $arFields, $bCheckUserType));
/**
* events
* PROVIDE_STORAGE - use own uf subsystem to store data (uts/utm tables)
*/
$commonEventResult = array('PROVIDE_STORAGE' => true);
foreach(GetModuleEvents("main", "OnBeforeUserTypeAdd", true) as $arEvent)
{
$eventResult = ExecuteModuleEventEx($arEvent, array(&$arFields));
if($eventResult === false)
{
if($e = $APPLICATION->GetException())
{
return false;
}
$aMsg = array();
$aMsg[] = array(
"id" => "FIELD_NAME",
"text" => GetMessage("USER_TYPE_ADD_ERROR", array(
"#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
"#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
))
);
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
elseif(is_array($eventResult))
{
$commonEventResult = array_merge($commonEventResult, $eventResult);
}
}
if(is_object($USER_FIELD_MANAGER))
$USER_FIELD_MANAGER->CleanCache();
if($commonEventResult['PROVIDE_STORAGE'])
{
if(!$this->CreatePropertyTables($arFields["ENTITY_ID"]))
return false;
$strType = $USER_FIELD_MANAGER->getUtsDBColumnType($arFields);
if(!$strType)
{
$aMsg = array();
$aMsg[] = array(
"id" => "FIELD_NAME",
"text" => GetMessage("USER_TYPE_ADD_ERROR", array(
"#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
"#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
)),
);
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
$tableName = 'b_uts_' . mb_strtolower($arFields['ENTITY_ID']);
$tableFields = $DB->GetTableFields($tableName);
if (!array_key_exists($arFields['FIELD_NAME'], $tableFields))
{
$ddl = 'ALTER TABLE ' . $tableName . ' ADD ' . $arFields['FIELD_NAME'] . ' ' . $strType;
if (!$DB->DDL($ddl, true, "FILE: " . __FILE__ . "
LINE: " . __LINE__))
{
$aMsg = array();
$aMsg[] = array(
"id" => "FIELD_NAME",
"text" => GetMessage("USER_TYPE_ADD_ERROR", array(
"#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
"#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
))
);
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
}
}
if($ID = $DB->Add("b_user_field", $arFields, array("SETTINGS")))
{
if(CACHED_b_user_field !== false)
$CACHE_MANAGER->CleanDir("b_user_field");
$arLabels = array("EDIT_FORM_LABEL", "LIST_COLUMN_LABEL", "LIST_FILTER_LABEL", "ERROR_MESSAGE", "HELP_MESSAGE");
$arLangs = array();
foreach($arLabels as $label)
{
if(isset($arFields[$label]) && is_array($arFields[$label]))
{
foreach($arFields[$label] as $lang => $value)
{
$arLangs[$lang][$label] = $value;
}
}
}
foreach($arLangs as $lang => $arLangFields)
{
$arLangFields["USER_FIELD_ID"] = $ID;
$arLangFields["LANGUAGE_ID"] = $lang;
$arInsert = $DB->PrepareInsert("b_user_field_lang", $arLangFields);
$DB->Query("INSERT INTO b_user_field_lang (".$arInsert[0].") VALUES (".$arInsert[1].")");
}
}
// post event
$arFields['ID'] = $ID;
foreach(GetModuleEvents("main", "OnAfterUserTypeAdd", true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($arFields));
}
return $ID;
}