Расширенные права инфоблоков CIBlockElementRights

916c2c3b

 
$arTasks = CIBlockRights::GetRightsList();   // получаем массив уровней доступа

$object = new CIBlockElementRights($iblockID, $elementID); // создаём объект прав, передав в него id инфоблока и id элемента
$arRights = $object->GetRights(); // получим права для элемента
$object->SetRights($arRights); // установим права для

<?
Array(
   [1] => Array (
     [GROUP_CODE] => G2 // группа с id 2
     [DO_INHERIT] => Y // наследовать права
     [IS_INHERITED] => Y // права унаследованы
     [OVERWRITED] => 0 // признак перезаписи
     [TASK_ID] => 29 //id уровня доступа
     [XML_ID] => // дополнительный ID, не обязательный параметр. Можно использовать для фильтрации
     [ENTITY_TYPE] => iblock // тип сущности инфоблок
     [ENTITY_ID] => 4 //id сущности
)
   [2] => Array (
     [GROUP_CODE] => U1 // пользователь с id 1
     [DO_INHERIT] => Y
     [IS_INHERITED] => N
     [OVERWRITED] => 0
     [TASK_ID] => 28
     [XML_ID] =>
     [ENTITY_TYPE] => element // тип сущности элемент
     [ENTITY_ID] => 43 //id сущности
)
)
?>

Коды групп [GROUP_CODE]:

U1 - User (пользователь с ID = 1);
G1 - Group (группа пользователей с ID = 1);
D1 - Department (сотрудники отдела с ID = 1);
DR2 - Department Recursive (сотрудники отдела с ID = 2 и его подотделов);
SG3_A - Sonet Group (админ (владелец) группы соцсети с ID = 3);
SG3_E - Sonet Group (модераторы группы соцсети с ID = 3);
SG3_K - Sonet Group (все члены группы соцсети с ID = 3);
CR - Creator (создатель (автор) элемента);
AU - Authorized Users (все авторизованные пользователи);

Если вы желаете только дополнить набор прав, то необходимо передать не только новые значения, но и старые, т.е. в полученный массив $arRights добавить еще 1 элемент с ключем n0. Примерно такого содержания:

<?
Array (
[n0] => Array ( // "n".$i - это важно, по "n" метод определяет, что нужно создать новый набор прав
   [GROUP_CODE] => U22 // пользователь с id 22
   [TASK_ID] => 34 // уровень доступа
)
)
?>

Если новых прав будет больше чем 1, то остальные ключи будут n1, n2 ,n3 и т.д.

Ну и для примера рабочий вариант:

<?
$blockID = 4;
$elementID = 43;
$UserID = 13;
$GroupID = 3;

$object = new CIBlockElementRights($blockID, $elementID); // создаём объект прав для нужного элемента
$arRights = $object->GetRights(); // получаем текущие права

$arRights["n0"] = array(
   "GROUP_CODE" =>"U".$UserID,
   "TASK_ID" => 35
);
$arRights["n1"] = array(
   "GROUP_CODE" =>"G".$GroupID,
   "TASK_ID" => 34
);

$object->SetRights($arRights); // устанавливаем права элемента
?>

Как, программно узнать, может ли пользователь читать секцию, или писать в нее, или писать в конкретный элемент, или удалять конкретный элемент?

Все просто, за это отвечают два метода:

CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, $permission);
CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, $permission);

Они возвращают для текущего авторизованного пользователя булево значение — true/false. На входе принимает три параметра: ID инфоблока, ID секции/элемента (если ноль, то подразумевается проверка прав на добавление), и, собственно, уровень доступа, который мы проверяем на «имеет ли».