![]() |
#7 |
Участник
|
Я правильно понял, что необходим код, которому передаем форму и AccessType, а он запустит каскадно установку этого AccessType для этой формы?
У меня была такая задача. Причем не только для форм. Насколько я понял, методы, которые раздают права каскадно, работают только для дерева прав. Тоже сначала думал эмулировать построение дерева и запускать существующие методы, но в итоге сделал так: вырвал кусками код, который используется при построении дерева, чтобы бегать по объектам формы и давал права на эти объекты. Вот методы на SysSecurityUserGroup (): Этот бегает по объектам формы (таблицы и MenuItem) и устанавливает им права: X++: void grantSubAccessForForm( FormName _formName, AccessType _access) { SysDictMenu sysDictMenu; TreeNodePath treeNodePath; MenuFunction menuFunction; FormName formName; List list; Map map; ListEnumerator enumerator; MapEnumerator mapEnumerator; SysDictTable dictTable; MenuFunction menu; ; treeNodePath = strFmt("\\Menu Items\\%1\\%2", enum2str(MenuItemType::Display), _formName); sysDictMenu = SysDictMenu::newTreeNodePath(treeNodePath); if (sysDictMenu) { menuFunction = sysDictMenu.menuItem(); if (menuFunction && SysSecurity::potentialChildren(menuFunction)) { switch (menuFunction.objectType()) { case UtilElementType::Form: formName = menuFunction.object(); list = SysSecurity::getFormDatasources(formName); map = SysSecurity::getFormDisplayMethods(menuFunction); if (list.elements()) { enumerator = list.getEnumerator(); while (enumerator.moveNext()) { dictTable = new SysDictTable(enumerator.current()); this.accessChangedForTable(dictTable.name(), _access); } } list = SysSecurity::getFormMenuItems(formName); if (list.elements()) { enumerator = list.getEnumerator(); while (enumerator.moveNext()) { switch (classidget(enumerator.current())) { case classnum(Map): map = enumerator.current(); mapEnumerator = map.getEnumerator(); mapEnumerator.moveNext(); switch (classidget(mapEnumerator.currentValue())) { case classnum(MenuFunction): menu = mapEnumerator.currentValue(); this.accessChangedForMenuItem(menu.name(), menu.type(), _access); break; } } } } break; } } } } для установки прав для таблицы: X++: void accessChangedForTable(TableName name, AccessType access) { DictTable dictTable; TableId tableId; ; if (access != AccessType::NoAccess) { tableId = tableName2Id(name); dictTable = new DictTable(tableId); if (access > dictTable.maxAccessMode()) access = dictTable.maxAccessMode(); } EePersonalDataAccessLogging::logTableAccessChange( tableId, securitySet.tableAccess(tableId), access, this.parmUserGroupId()); securitySet.tableAccess(tableId, access); origtableAccess.insert(tableId, access); } для установки прав на MenuItems X++: void accessChangedForMenuItem( MenuItemName name,
MenuItemType type,
AccessType access)
{
;
securitySet.secureNodeAccess(name, SysSecurity::menuItemType2UtilElementType(type), access);
} На всякий случай приблизительный вариант как работать с SysSecurityUserGroup: X++: SysSecurityUserGroup sysSecurity = SysSecurityUserGroup::construct();
sysSecurity.parmUserGroupId(userGroupId);
sysSecurity.parmDomainId(domainId);
sysSecurity.load();
sysSecurity. grantSubAccessForForm("SalesTable", AccessType::Delete);
sysSecurity.save(); |
|