Формирование идентификаторов в расширенной системе прав, методы для установки прав
Формирование идентификаторов в расширенной системе прав, методы для установки прав
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Расширенные права доступа: Формирование идентификаторов субъектов, программная установка прав доступа
Ряд аспектов о новых правах доступа уже описывался в презентации Максима Смирнова, в посте Евгения Жукова и в посте Антона Долганина, может кого-то упустил, пардон. Дополню эту информацию типами и способами формирования идентификаторов субъектов ("group codes" в терминологии расширенных прав битрикса):
U1 - Us er (пользователь с 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 (все авторизованные пользователи);
Имея эту информацию можно автоматизировать установку прав в своих скриптах, пользуясь методами класса CIBlockElementRights. В предыдущем моём посте был пример кода, как с помощью класса извлекаются текущие права элемента и устанавливаются новые права:
$ob = new CIBlockElementRights($iblockId, $elementId); // создаём объект прав и инициализируем нашим элементом
$ar = $ob->GetRights(); // получаем массив текущих прав элемента
$ob->SetRights($ar); // устанавливаем права элемента
Пример возвращаемого массива прав элемента:
Array
(
[230] => Array // ID набора прав
(
[GROUP_CODE] => G37 // описанный выше группкод
[DO_INHERIT] => Y // производить наследование
[IS_INHERITED] => Y // признак наследованных прав
[OVERWRITED] => 0 // признак перезаписи
[TASK_ID] => 46 // ID уровня доступа
[XML_ID] => // дополнительный произвольный ID, по которому потом, например, можно фильтровать установленные вами права
[ENTITY_TYPE] => iblock // тип сущности
[ENTITY_ID] => 74 // ID сущности
)
)
Пример массива для установки новых прав на объект:
Array
(
[n0] => Array // "n".$i - это важно, по "n" метод определяет, что нужно создать новый набор прав
(
[GROUP_CODE] => CR // группкод "Автор"
[TASK_ID] => 29 // уровень доступа
[XML_ID] => blablabla // наш произвольный ид
)
)
Следует отметить, что если вы хотите не заменить, а дополнить существующие права элемента, то в метод SetRights() нужно передавать массив не только с новыми правами, но и со старыми, иначе метод удалит все права, которых нет в переданном ему массиве. Важный момент - ключи массива старых прав должны быть сохранены, так как они являются идентификаторами существующих прав, осторожней с array_merge(), для склеивания массивов с сохранением ключей юзайте $array1+$array2. Таким образом, чтобы зачистить все права элемента, можно в SetRights() передать просто пустой массив. Другой способ зачистки ненужных существующих прав - это модификация массива существующих прав с добавлением к ненужным правам элемента "DO_CLEAN" => "Y". Хотя первый способ, просто не передавать ставшие ненужными права, проще. Можно не только добавлять новые права и удалять старые, но и изменять существующие. Для этого нужно передать в SetRights() массив с уже существующими идентификаторами, но с новыми параметрами этих прав.