• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock_rights.php
  • Класс: CIBlockSectionRights
  • Вызов: CIBlockSectionRights::GetRights
function GetRights($arOptions = array())
{
	global $DB;
	$arResult = array();

	if($this->id <= 0)
		return parent::GetRights($arOptions);

	if(
		!isset($arOptions["operations"])
		|| !is_array($arOptions["operations"])
		|| empty($arOptions["operations"])
	)
	{
		$rs = $DB->Query("
			SELECT
				BR.ID
				,BR.GROUP_CODE
				,BR.TASK_ID
				,BR.DO_INHERIT
				,SR.IS_INHERITED
				,BR.XML_ID
				,BR.ENTITY_TYPE
				,BR.ENTITY_ID
			FROM
				b_iblock_section_right SR
				INNER JOIN b_iblock_right BR ON BR.ID = SR.RIGHT_ID
			WHERE
				SR.IBLOCK_ID = ".$this->IBLOCK_ID."
				AND SR.SECTION_ID = ".$this->id."
			ORDER BY
				BR.ID
		");
	}
	elseif(
		isset($arOptions["operations_mode"])
		&& $arOptions["operations_mode"] == CIBlockRights::ALL_OPERATIONS
		&& count($arOptions["operations"]) > 1
	)
	{
		$arOperations = array_map(array($DB, "ForSQL"), $arOptions["operations"]);
		$rs = $DB->Query("
			SELECT
				BR.ID, BR.GROUP_CODE, BR.TASK_ID, BR.DO_INHERIT, SR.IS_INHERITED, BR.XML_ID
			FROM
				b_iblock_section_right SR
				INNER JOIN b_iblock_right BR ON BR.ID = SR.RIGHT_ID
				INNER JOIN b_task_operation T ON T.TASK_ID = BR.TASK_ID
				INNER JOIN b_operation O ON O.ID = T.OPERATION_ID
			WHERE
				SR.IBLOCK_ID = ".$this->IBLOCK_ID."
				AND SR.SECTION_ID = ".$this->id."
				AND O.NAME IN ('".implode("', '", $arOperations)."')
			GROUP BY
				BR.ID, BR.GROUP_CODE, BR.TASK_ID, BR.DO_INHERIT, SR.IS_INHERITED
			HAVING
				COUNT(DISTINCT O.ID) = ".count($arOperations)."
			ORDER BY
				BR.ID
		");
	}
	else//if($opMode == CIBlockRights::ANY_OPERATION)
	{
		$arOperations = array_map(array($DB, "ForSQL"), $arOptions["operations"]);
		$rs = $DB->Query("
			SELECT DISTINCT
				BR.ID, BR.GROUP_CODE, BR.TASK_ID, BR.DO_INHERIT, SR.IS_INHERITED, BR.XML_ID
			FROM
				b_iblock_section_right SR
				INNER JOIN b_iblock_right BR ON BR.ID = SR.RIGHT_ID
				INNER JOIN b_task_operation T ON T.TASK_ID = BR.TASK_ID
				INNER JOIN b_operation O ON O.ID = T.OPERATION_ID
			WHERE
				SR.IBLOCK_ID = ".$this->IBLOCK_ID."
				AND SR.SECTION_ID = ".$this->id."
				AND O.NAME IN ('".implode("', '", $arOperations)."')
			ORDER BY
				BR.ID
		");
	}

	if(isset($arOptions["parent"]))
	{
		$obParentRights = new CIBlockSectionRights($this->IBLOCK_ID, $arOptions["parent"]);
		$arParentRights = $obParentRights->GetRights();
		foreach($arParentRights as $RIGHT_ID => $arRight)
		{
			$arResult[$RIGHT_ID] = array(
				"GROUP_CODE" => $arRight["GROUP_CODE"],
				"DO_INHERIT" => $arRight["DO_INHERIT"],
				"IS_INHERITED" => "Y",
				"IS_OVERWRITED" => "Y",
				"TASK_ID" => $arRight["TASK_ID"],
				"XML_ID" => $arRight["XML_ID"],
			);
			if(isset($arRight["ENTITY_TYPE"]))
				$arResult[$RIGHT_ID]["ENTITY_TYPE"] = $arRight["ENTITY_TYPE"];
			if(isset($arRight["ENTITY_ID"]))
				$arResult[$RIGHT_ID]["ENTITY_ID"] = $arRight["ENTITY_ID"];
		}
	}

	$obStorage = $this->_storage_object();
	while($ar = $rs->Fetch())
	{
		$arResult[$ar["ID"]] = array(
			"GROUP_CODE" => $ar["GROUP_CODE"],
			"DO_INHERIT" => $ar["DO_INHERIT"],
			"IS_INHERITED" => $ar["IS_INHERITED"],
			"OVERWRITED" => isset($arOptions["count_overwrited"]) && $arOptions["count_overwrited"]? $obStorage->CountOverWrited($ar["GROUP_CODE"]): 0,
			"TASK_ID" => $ar["TASK_ID"],
			"XML_ID" => $ar["XML_ID"],
		);
		if(isset($ar["ENTITY_TYPE"]))
			$arResult[$ar["ID"]]["ENTITY_TYPE"] = $ar["ENTITY_TYPE"];
		if(isset($ar["ENTITY_ID"]))
			$arResult[$ar["ID"]]["ENTITY_ID"] = $ar["ENTITY_ID"];
	}

	return $arResult;
}