Компонент BX.UI.AccessRights
Из коробки предоставляется компонент, обеспечивающий отрисовку таблицы с настройкой прав доступа: BX.UI.AccessRights.
Для работы этого компонента требуется инициализация системного компонента bitrix:main.ui.selector, который обеспечивает выбор сотрудников для привязки к ролям.
Компонент обеспечивает решение двух проблем:
- Отрисовку существующих настроек;
- Сохранение изменений в настройках.
Для отрисовки необходимо передать два параметра:
- userGroups - роли, разрешения и привязанные пользователи
[ 'id' => 1, // id роли, для новых - 0 'title' => 'Менеджер', // название роли 'accessRights' => [ // список прав и значений 0 => [ 'id' => 1, // id, соответствует константам в PermissionDictionary 'value' => 0 ] ], 'members' => [ // список участников в роли 'U2' => [ // access code участника 'type' => 'users', // тип для JS, доступные описаны в main/install/components/bitrix/main.ui.selector/templates/.default/script.js 'id' => 2, 'name' => 'Test User', 'url' => '', 'avatar' => null ] ] ]
- accessRights - настройки, разбитые по секциям
[ 0 => [ 'sectionTitle' => 'Задачи', // название секции 'rights' => [ // список прав 0 => [ 'id' => 1, // id, соответствует PermissionDictionary 'type' => 'toggler', // тип, на текущий момент только toggler - переключатель 'title' => 'Редактирование', // название 'hint' => null // если задано, то будет выведена иконка с подсказкой ] ] ] ]
Для сохранения изменений компонент формирует стандартный ajax запрос с данными. В качестве адреса использует имя целевого компонента и название действия (по умолчанию используются save, delete, load).
Целиком вызов компонента будет выглядеть следующим образом:
<?php
\Bitrix\Main\Loader::includeModule('ui');
\Bitrix\Main\UI\Extension::load(['ui.buttons', 'ui.icons', 'ui.notification', 'ui.accessrights']);
?>
<span id="bx-access-group"></span>
<?
$APPLICATION->IncludeComponent(
"bitrix:main.ui.selector",
".default",
[
'API_VERSION' => 3,
'ID' => 'bx-access-group', // заменить на свое
'BIND_ID' => 'bx-access-group', // заменить на свое
'ITEMS_SELECTED' => [],
'CALLBACK' => [
'select' => "AccessRights.onMemberSelect",
'unSelect' => "AccessRights.onMemberUnselect",
'openDialog' => 'function(){}',
'closeDialog' => 'function(){}',
],
'OPTIONS' => [
'eventInit' => 'tasks:onComponentLoad', // заменить на свое
'eventOpen' => 'tasks:onComponentOpen', // заменить на свое
'useContainer' => 'Y',
'lazyLoad' => 'Y',
'context' => 'TASKS_PERMISSION',
'contextCode' => '',
'useSearch' => 'Y',
'useClientDatabase' => 'Y',
'allowEmailInvitation' => 'N',
'enableAll' => 'N',
'enableUsers' => 'Y',
'enableDepartments' => 'Y',
'enableGroups' => 'Y',
'departmentSelectDisable' => 'N',
'allowAddUser' => 'Y',
'allowAddCrmContact' => 'N',
'allowAddSocNetGroup' => 'N',
'allowSearchEmailUsers' => 'N',
'allowSearchCrmEmailUsers' => 'N',
'allowSearchNetworkUsers' => 'N',
'useNewCallback' => 'Y',
'multiple' => 'Y',
'enableSonetgroups' => 'Y',
'showVacations' => 'Y',
]
],
false,
["HIDE_ICONS" => "Y"]
);
?>
<div id="bx-config-permissions"></div>
<script>
let AccessRights = new BX.UI.AccessRights({
component: 'bitrix:tasks.config.permissions',
actionSave: 'save',
actionDelete: 'delete',
renderTo: document.getElementById('bx-config-permissions'),
userGroups: <?= CUtil::PhpToJSObject($arResult['USER_GROUPS']) ?>,
accessRights: <?= CUtil::PhpToJSObject($arResult['ACCESS_RIGHTS']); ?>,
initPopupEvent: '<?= $initPopupEvent ?>',
openPopupEvent: '<?= $openPopupEvent ?>',
popupContainer: '<?= $componentId ?>',
});
AccessRights.draw();
setTimeout(function(){
BX.onCustomEvent('<?= $initPopupEvent ?>', [{openDialogWhenInit: false}])
}, 1000);
</script>
<?php
$APPLICATION->IncludeComponent('bitrix:ui.button.panel', '', [
'HIDE' => true,
'BUTTONS' => [
[
'TYPE' => 'save',
'ONCLICK' => 'AccessRights.sendActionRequest()',
],
[
'TYPE' => 'cancel',
'ONCLICK' => 'AccessRights.fireEventReset()'
],
],
]);
?>
Отрисовка иконок, причастных к ролям
Для отрисовки иконок пользователей, групп и тд, привязанных к конкретной роли используется класс \Bitrix\Main\UI\AccessRights\DataProvider.
(new DataProvider())→getEntity($type, $id); - вернет всю необходимую для UI информацию по указанному типу и id сущности.