- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock_rights.php
- Класс: CIBlockRightsStorage
- Вызов: CIBlockRightsStorage::Recalculate
function Recalculate()
{
global $DB;
$DB->Query("DELETE FROM b_iblock_element_right WHERE IBLOCK_ID = ".$this->IBLOCK_ID);
$DB->Query("DELETE FROM b_iblock_section_right WHERE IBLOCK_ID = ".$this->IBLOCK_ID);
//Elements
$DB->Query("
INSERT INTO b_iblock_element_right (IBLOCK_ID, SECTION_ID, ELEMENT_ID, RIGHT_ID, IS_INHERITED)
SELECT BE.IBLOCK_ID, 0, BE.ID, BR.ID, 'N'
FROM
b_iblock_right BR
INNER JOIN b_iblock_element BE ON BE.ID = BR.ENTITY_ID and BE.IBLOCK_ID = BR.IBLOCK_ID
WHERE
BR.IBLOCK_ID = ".$this->IBLOCK_ID."
AND BR.ENTITY_TYPE = 'element'
AND BE.ID NOT IN (
SELECT ER0.ELEMENT_ID
FROM
b_iblock_right BR0
INNER JOIN b_iblock_element_right ER0 ON ER0.RIGHT_ID = BR0.ID
WHERE
BR0.IBLOCK_ID = ".$this->IBLOCK_ID."
AND BR0.ENTITY_TYPE = 'element'
)
");
//Sections
$rs = $DB->Query("
SELECT BR.ID RIGHT_ID, BS.ID SECTION_ID, BR.GROUP_CODE
FROM
b_iblock_right BR
INNER JOIN b_iblock_section BS ON BS.ID = BR.ENTITY_ID and BS.IBLOCK_ID = BR.IBLOCK_ID
WHERE
BR.IBLOCK_ID = ".$this->IBLOCK_ID."
AND BR.ENTITY_TYPE = 'section'
ORDER BY
BS.DEPTH_LEVEL DESC
");
while($ar = $rs->Fetch())
{
$this->_set_section($ar["SECTION_ID"]);
$this->AddSelfSet($ar["RIGHT_ID"]);
$this->AddChildrenSet($ar["RIGHT_ID"], $ar["GROUP_CODE"], /*$bInherited=*/true);
}
//IBlock
$this->_set_section(0);
$rs = $DB->Query("
SELECT BR.ID RIGHT_ID, BR.GROUP_CODE
FROM
b_iblock_right BR
WHERE
BR.IBLOCK_ID = ".$this->IBLOCK_ID."
AND BR.ENTITY_TYPE = 'iblock'
");
while($ar = $rs->Fetch())
{
$this->AddChildrenSet($ar["RIGHT_ID"], $ar["GROUP_CODE"], /*$bInherited=*/true);
}
}