• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/usertypemanager.php
  • Класс: CUserTypeManager
  • Вызов: CUserTypeManager::CheckFields
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;
}