- Модуль: 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);
}
}