- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock_rights.php
- Класс: CIBlockRights
- Вызов: CIBlockRights::SetRights
function SetRights($arRights)
{
if(!$this->_self_check())
return false;
$arDBRights = $this->GetRights();
$arTasks = $this->GetRightsList(false);
$arAddedCodes = array();
$arUniqCodes = array();
foreach($arRights as $RIGHT_ID => $arRightSet)
{
if($arRightSet["GROUP_CODE"] <> '')
{
if(isset($arUniqCodes[$arRightSet["GROUP_CODE"]]))
unset($arRights[$RIGHT_ID]);
else
$arUniqCodes[$arRightSet["GROUP_CODE"]] = true;
}
}
//Fix broken TASK_ID
foreach($arRights as $RIGHT_ID => $arRightSet)
{
if(
!is_array($arRightSet["TASK_ID"])
&& !array_key_exists($arRightSet["TASK_ID"], $arTasks)
&& array_key_exists($RIGHT_ID, $arDBRights)
)
$arRights[$RIGHT_ID]["TASK_ID"] = $arDBRights[$RIGHT_ID]["TASK_ID"];
}
$bCleanUp = false;
$obStorage = $this->_storage_object();
foreach($arRights as $RIGHT_ID => $arRightSet)
{
$ID = intval($RIGHT_ID);
$GROUP_CODE = $arRightSet["GROUP_CODE"];
$bInherit = true;//$arRightSet["DO_INHERIT"] == "Y";
$bChildrenSet = false;
if($GROUP_CODE == '' || is_array($arRightSet["TASK_ID"]))
continue;
if(!array_key_exists($arRightSet["TASK_ID"], $arTasks))
continue;
if(
array_key_exists($RIGHT_ID, $arDBRights)
&& isset($arRightSet["DO_CLEAN"])
&& $arRightSet["DO_CLEAN"] == "Y"
)
{
$obStorage->DeleteChildrenSet($GROUP_CODE, CIBlockRights::GROUP_CODE);
$bChildrenSet = true;
$bCleanUp = true;
}
if(mb_substr($RIGHT_ID, 0, 1) == "n")
{
$arAddedCodes[$GROUP_CODE] = $GROUP_CODE;
$NEW_RIGHT_ID = $this->_add(
$GROUP_CODE,
$bInherit,
$arRightSet["TASK_ID"],
$arRightSet["XML_ID"] ?? false
);
if(!isset($arRightSet["DO_CLEAN"]) || $arRightSet["DO_CLEAN"] !== "NOT")
$obStorage->DeleteSelfSet($GROUP_CODE, CIBlockRights::GROUP_CODE);
$obStorage->AddSelfSet($NEW_RIGHT_ID);
if(!isset($arRightSet["DO_CLEAN"]) || $arRightSet["DO_CLEAN"] !== "NOT")
$obStorage->DeleteChildrenSet($GROUP_CODE, CIBlockRights::GROUP_CODE);
if($bInherit)
$obStorage->AddChildrenSet($NEW_RIGHT_ID, $GROUP_CODE, /*$bInherited=*/true);
}
elseif(
array_key_exists($ID, $arDBRights)
&& $arDBRights[$ID]["IS_INHERITED"] != "Y"
)
{
$this->_update($ID, $GROUP_CODE, $bInherit, $arRightSet["TASK_ID"]);
if ($bInherit && $bChildrenSet)
{
$obStorage->AddChildrenSet($ID, $GROUP_CODE, /*$bInherited=*/true);
}
unset($arDBRights[$ID]);
}
}
foreach($arDBRights as $RIGHT_ID => $arRightSet)
{
if($arRightSet["IS_INHERITED"] == "Y")
continue;
$obStorage->DeleteSelfSet($RIGHT_ID, CIBlockRights::RIGHT_ID);
if($arRightSet["DO_INHERIT"] == "Y")
$obStorage->DeleteChildrenSet($RIGHT_ID, CIBlockRights::RIGHT_ID);
$this->_delete($RIGHT_ID);
if(!isset($arAddedCodes[$arRightSet["GROUP_CODE"]]))
{
foreach($obStorage->FindParentWithInherit($arRightSet["GROUP_CODE"]) as $SECTION_ID => $PARENT_RIGHT)
{
$obStorage->AddSelfSet($PARENT_RIGHT, /*$bInherited=*/true);
$obStorage->AddChildrenSet($PARENT_RIGHT, $arRightSet["GROUP_CODE"], /*$bInherited=*/true);
}
}
}
if ($bCleanUp)
$obStorage->CleanUp();
CIBlock::clearIblockTagCache($this->IBLOCK_ID);
return true;
}