function CheckFields($entity_id, $ID, $arFields, $user_id = false, $checkRequired = true, array $requiredFields = null, array $filteredFields = null)
{
global $APPLICATION;
$requiredFieldMap = is_array($requiredFields) ? array_fill_keys($requiredFields, true) : null;
$aMsg = array();
//1 Get user typed fields list for entity
$arUserFields = $this->GetUserFields($entity_id, $ID, LANGUAGE_ID);
//2 Filter user typed fields
if (isset($filteredFields))
{
$arUserFields = array_filter($arUserFields, static function ($fieldName) use ($filteredFields) {
return in_array($fieldName, $filteredFields);
}, ARRAY_FILTER_USE_KEY);
}
//3 For each field
foreach($arUserFields as $FIELD_NAME => $arUserField)
{
$enableRequiredFieldCheck = $arUserField["MANDATORY"] === "Y"
? $checkRequired : ($requiredFieldMap && isset($requiredFieldMap[$FIELD_NAME]));
//common Check for all fields
$isSingleValue = ($arUserField["MULTIPLE"] === "N");
if (
$enableRequiredFieldCheck
&& (
(isset($ID) && $ID <= 0)
|| array_key_exists($FIELD_NAME, $arFields)
)
)
{
$EDIT_FORM_LABEL = $arUserField["EDIT_FORM_LABEL"] <> '' ? $arUserField["EDIT_FORM_LABEL"] : $arUserField["FIELD_NAME"];
if($arUserField["USER_TYPE"]["BASE_TYPE"] === "file")
{
$isNewFilePresent = false;
$files = [];
if(is_array($arUserField["VALUE"]))
{
$files = array_flip($arUserField["VALUE"]);
}
elseif($arUserField["VALUE"] > 0)
{
$files = [$arUserField["VALUE"] => 0];
}
elseif(is_numeric($arFields[$FIELD_NAME]))
{
$files = [$arFields[$FIELD_NAME] => 0];
}
if ($isSingleValue)
{
$value = $arFields[$FIELD_NAME];
if(is_array($value) && array_key_exists("tmp_name", $value))
{
if(array_key_exists("del", $value) && $value["del"])
{
unset($files[$value["old_id"]]);
}
elseif(array_key_exists("size", $value) && $value["size"] > 0)
{
$isNewFilePresent = true;
}
}
elseif($value > 0)
{
$isNewFilePresent = true;
$files[$value] = $value;
}
}
else
{
if(is_array($arFields[$FIELD_NAME]))
{
foreach($arFields[$FIELD_NAME] as $value)
{
if(is_array($value) && array_key_exists("tmp_name", $value))
{
if(array_key_exists("del", $value) && $value["del"])
{
unset($files[$value["old_id"]]);
}
elseif(array_key_exists("size", $value) && $value["size"] > 0)
{
$isNewFilePresent = true;
}
}
elseif($value > 0)
{
$isNewFilePresent = true;
$files[$value] = $value;
}
}
}
}
if(!$isNewFilePresent && empty($files))
{
$aMsg[] = array("id" => $FIELD_NAME, "text" => str_replace("#FIELD_NAME#", $EDIT_FORM_LABEL, GetMessage("USER_TYPE_FIELD_VALUE_IS_MISSING")));
}
}
elseif ($isSingleValue)
{
if ($this->isValueEmpty($arUserField, $arFields[$FIELD_NAME]))
{
$aMsg[] = array("id" => $FIELD_NAME, "text" => str_replace("#FIELD_NAME#", $EDIT_FORM_LABEL, GetMessage("USER_TYPE_FIELD_VALUE_IS_MISSING")));
}
}
else
{
if(!is_array($arFields[$FIELD_NAME]))
{
$aMsg[] = array("id" => $FIELD_NAME, "text" => str_replace("#FIELD_NAME#", $EDIT_FORM_LABEL, GetMessage("USER_TYPE_FIELD_VALUE_IS_MISSING")));
}
else
{
$bFound = false;
foreach($arFields[$FIELD_NAME] as $value)
{
if(
(
is_array($value)
&& (implode("", $value) <> '')
)
||
(
!is_array($value)
&& !$this->isValueEmpty($arUserField, $value)
)
)
{
$bFound = true;
break;
}
}
if(!$bFound)
{
$aMsg[] = array("id" => $FIELD_NAME, "text" => str_replace("#FIELD_NAME#", $EDIT_FORM_LABEL, GetMessage("USER_TYPE_FIELD_VALUE_IS_MISSING")));
}
}
}
}
//identify user type
if($arUserField["USER_TYPE"])
{
$CLASS_NAME = $arUserField["USER_TYPE"]["CLASS_NAME"];
if(array_key_exists($FIELD_NAME, $arFields) && is_callable(array($CLASS_NAME, "checkfields")))
{
if($isSingleValue)
{
if (!($arFields[$FIELD_NAME] instanceof SqlExpression))
{
$canUseArrayValueForSingleField = false;
if (
is_callable([$CLASS_NAME, 'canUseArrayValueForSingleField'])
&& $CLASS_NAME::canUseArrayValueForSingleField()
)
{
$canUseArrayValueForSingleField = true;
}
if (is_array($arFields[$FIELD_NAME]) && !$canUseArrayValueForSingleField)
{
$fieldName = HtmlFilter::encode(
empty($arUserField['EDIT_FORM_LABEL'])
? $arUserField['FIELD_NAME']
: $arUserField['EDIT_FORM_LABEL']
);
$messages = [
[
'id' => $arUserField['FIELD_NAME'],
'text' => Loc::getMessage('USER_TYPE_FIELD_VALUE_IS_MULTIPLE', [
'#FIELD_NAME#' => $fieldName,
]),
],
];
}
else
{
//apply appropriate check function
$messages = call_user_func_array(
[
$CLASS_NAME,
'checkfields',
],
[
$arUserField,
$arFields[$FIELD_NAME],
$user_id,
]
);
}
$aMsg = array_merge($aMsg, $messages);
}
}
elseif(is_array($arFields[$FIELD_NAME]))
{
foreach($arFields[$FIELD_NAME] as $value)
{
if(!empty($value))
{
if ($value instanceof SqlExpression)
{
$aMsg[] = [
'id' => $FIELD_NAME,
'text' => "Multiple field "#FIELD_NAME#" can't handle SqlExpression because of serialized uts cache"
];
}
else
{
//apply appropriate check function
$ar = call_user_func_array(
array($CLASS_NAME, "checkfields"),
array($arUserField, $value, $user_id)
);
$aMsg = array_merge($aMsg, $ar);
}
}
}
}
}
}
}
//3 Return succsess/fail flag
if(!empty($aMsg))
{
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
return true;
}