• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock.php
  • Класс: CAllIBlock
  • Вызов: CAllIBlock::SetFields
static function SetFields($ID, $arFields)
{
	/** @global CDatabase $DB */
	global $DB;
	$ID = (int)$ID;
	if ($ID > 0)
	{
		$fields = CIBlock::GetFieldsDefaults();
		$defaultValues = static::getFieldsDefaultValues();

		foreach (array_keys($arFields) as $fieldId)
		{
			if (!is_array($arFields[$fieldId]))
			{
				unset($arFields[$fieldId]);
			}
			if (isset($fields[$fieldId]['IS_REQUIRED']))
			{
				$arFields[$fieldId]['IS_REQUIRED'] ??= $fields[$fieldId]['IS_REQUIRED'];
			}
			if (isset($defaultValues[$fieldId]))
			{
				if (is_array($defaultValues[$fieldId]))
				{
					$value = $arFields[$fieldId]['DEFAULT_VALUE'] ?? [];
					if (!is_array($value))
					{
						$value = [];
					}
					$value = array_intersect_key($value, $defaultValues[$fieldId]);
					$value = array_merge($defaultValues[$fieldId], $value);
					$arFields[$fieldId]['DEFAULT_VALUE'] = $value;
				}
				elseif ($defaultValues[$fieldId] === false)
				{
					$arFields[$fieldId]['DEFAULT_VALUE'] ??= $defaultValues[$fieldId];
				}
			}
		}

		if (isset($arFields['PREVIEW_PICTURE']))
		{
			$arFields['PREVIEW_PICTURE']['DEFAULT_VALUE'] = serialize(static::preparePreviewPictureFieldSettings(
				$arFields['PREVIEW_PICTURE']['DEFAULT_VALUE']
			));
		}

		if (isset($arFields['DETAIL_PICTURE']))
		{
			$arFields['DETAIL_PICTURE']['DEFAULT_VALUE'] = serialize(static::prepareDetailPictureFieldSettings(
				$arFields['DETAIL_PICTURE']['DEFAULT_VALUE']
			));
		}

		if (isset($arFields['CODE']))
		{
			$arFields['CODE']['DEFAULT_VALUE'] = serialize(static::prepareCodeFieldSettings(
				$arFields['CODE']['DEFAULT_VALUE']
			));
		}

		if (isset($arFields['SECTION_PICTURE']))
		{
			$arFields['SECTION_PICTURE']['DEFAULT_VALUE'] = serialize(static::preparePreviewPictureFieldSettings(
				$arFields['SECTION_PICTURE']['DEFAULT_VALUE']
			));
		}

		if (isset($arFields['SECTION_DETAIL_PICTURE']))
		{
			$arFields['SECTION_DETAIL_PICTURE']['DEFAULT_VALUE'] = serialize(static::prepareDetailPictureFieldSettings(
				$arFields['SECTION_DETAIL_PICTURE']['DEFAULT_VALUE']
			));
		}
		if (isset($arFields['SECTION_CODE']))
		{
			$arFields['SECTION_CODE']['DEFAULT_VALUE'] = serialize(static::prepareCodeFieldSettings(
				$arFields['SECTION_CODE']['DEFAULT_VALUE']
			));
		}
		if (isset($arFields['SORT']))
		{
			$arFields['SORT']['DEFAULT_VALUE'] = (int)($arFields['SORT']['DEFAULT_VALUE'] ?? 500);
		}
		if (isset($arFields['IBLOCK_SECTION']))
		{
			$arFields['IBLOCK_SECTION']['DEFAULT_VALUE'] = serialize([
				'KEEP_IBLOCK_SECTION_ID' =>
					$arFields['IBLOCK_SECTION']['DEFAULT_VALUE']['KEEP_IBLOCK_SECTION_ID'] === 'Y'
						? 'Y'
						: 'N'
				,
			]);
		}

		$res = $DB->Query("
			SELECT * FROM b_iblock_fields
			WHERE IBLOCK_ID = " . $ID . "
		");
		while ($ar = $res->Fetch())
		{
			$arUpdate = [];
			$fieldId = $ar['FIELD_ID'];
			if (isset($arFields[$fieldId]) && isset($fields[$fieldId]))
			{
				if ($fields[$fieldId]["IS_REQUIRED"] === false)
				{
					$IS_REQUIRED = ($arFields[$fieldId]["IS_REQUIRED"] ?? 'N');
				}
				else
				{
					$IS_REQUIRED = $fields[$fieldId]["IS_REQUIRED"];
				}
				$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
				if ($ar["IS_REQUIRED"] !== $IS_REQUIRED)
				{
					$arUpdate['IS_REQUIRED'] = $IS_REQUIRED;
				}
				if (
					isset($arFields[$fieldId]["DEFAULT_VALUE"])
					&& $ar["DEFAULT_VALUE"] !== $arFields[$fieldId]["DEFAULT_VALUE"]
				)
				{
					$arUpdate['DEFAULT_VALUE'] = $arFields[$fieldId]["DEFAULT_VALUE"];
				}
				unset($fields[$fieldId]);
			}
			elseif (isset($fields[$fieldId]))
			{
				$IS_REQUIRED = $fields[$fieldId]["IS_REQUIRED"];
				$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
				if ($ar["IS_REQUIRED"] !== $IS_REQUIRED)
				{
					$arUpdate = [
						"IS_REQUIRED" => $IS_REQUIRED,
						"DEFAULT_VALUE" => "",
					];
				}
				unset($fields[$fieldId]);
			}
			else
			{
				$DB->Query("DELETE FROM b_iblock_fields WHERE IBLOCK_ID = ".$ID." AND FIELD_ID = '".$DB->ForSQL($fieldId)."'");
			}

			if (!empty($arUpdate))
			{
				$strUpdate = $DB->PrepareUpdate("b_iblock_fields", $arUpdate);
				if ($strUpdate != "")
				{
					$strSql = "UPDATE b_iblock_fields SET " . $strUpdate
						. " WHERE IBLOCK_ID = " . $ID
						. " AND FIELD_ID = '" . $DB->ForSQL($fieldId) . "'";
					$arBinds = [];
					if (isset($arUpdate["DEFAULT_VALUE"]))
					{
						$arBinds["DEFAULT_VALUE"] = $arUpdate["DEFAULT_VALUE"];
					}
					$DB->QueryBind($strSql, $arBinds);
				}
			}
		}
		foreach($fields as $FIELD_ID => $arDefaults)
		{
			if(array_key_exists($FIELD_ID, $arFields))
			{
				if($arDefaults["IS_REQUIRED"] === false)
					$IS_REQUIRED = $arFields[$FIELD_ID]["IS_REQUIRED"];
				else
					$IS_REQUIRED = $arDefaults["IS_REQUIRED"];
				$DEFAULT_VALUE = $arFields[$FIELD_ID]["DEFAULT_VALUE"];
			}
			else
			{
				$IS_REQUIRED = $arDefaults["IS_REQUIRED"];
				$DEFAULT_VALUE = false;
			}
			$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
			$arAdd = [
				"IBLOCK_ID" => $ID,
				"FIELD_ID" => $FIELD_ID,
				"IS_REQUIRED" => $IS_REQUIRED,
				"DEFAULT_VALUE" => $DEFAULT_VALUE,
			];
			$arInsert = $DB->PrepareInsert("b_iblock_fields", $arAdd);
			$DB->Query("INSERT INTO b_iblock_fields (".$arInsert[0].") VALUES (".$arInsert[1].")");
		}

		CIBlock::CleanCache($ID);
	}
}