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