function json_getSubGroups() { $sFilter = KTUtil::arrayGet($_REQUEST, 'filter', false); $aAllowedGroups = array('off' => _kt('-- Please filter --')); if ($sFilter && trim($sFilter)) { $iGroupID = KTUtil::arrayGet($_REQUEST, 'group_id', false); if (!$iGroupID) { return array('error' => true, 'type' => 'kt.invalid_entity', 'message' => _kt('An invalid group was selected')); } $oGroup = Group::get($iGroupID); $aMemberGroupsUnkeyed = $oGroup->getMemberGroups(); $aMemberGroups = array(); $aMemberIDs = array(); foreach ($aMemberGroupsUnkeyed as $oMemberGroup) { $aMemberIDs[] = $oMemberGroup->getID(); $aMemberGroups[$oMemberGroup->getID()] = $oMemberGroup; } $aGroupArray = GroupUtil::buildGroupArray(); $aAllowedGroupIDs = GroupUtil::filterCyclicalGroups($oGroup->getID(), $aGroupArray); $aAllowedGroupIDs = array_diff($aAllowedGroupIDs, $aMemberIDs); $aAllowedGroups = array(); foreach ($aAllowedGroupIDs as $iAllowedGroupID) { $g = Group::get($iAllowedGroupID); if (!PEAR::isError($g) && $g != false) { $aAllowedGroups[$iAllowedGroupID] = $g->getName(); } } } return $aAllowedGroups; }
function informUsersForState($oState, $aInformed, $oDocument, $oUser, $sComments) { // say no to duplicates. KTWorkflowNotification::clearNotificationsForDocument($oDocument); $aUsers = array(); $aGroups = array(); $aRoles = array(); foreach (KTUtil::arrayGet($aInformed, 'user', array()) as $iUserId) { $oU = User::get($iUserId); if (PEAR::isError($oU) || $oU == false) { continue; } else { $aUsers[$oU->getId()] = $oU; } } foreach (KTUtil::arrayGet($aInformed, 'group', array()) as $iGroupId) { $oG = Group::get($iGroupId); if (PEAR::isError($oG) || $oG == false) { continue; } else { $aGroups[$oG->getId()] = $oG; } } foreach (KTUtil::arrayGet($aInformed, 'role', array()) as $iRoleId) { $oR = Role::get($iRoleId); if (PEAR::isError($oR) || $oR == false) { continue; } else { $aRoles[] = $oR; } } // FIXME extract this into a util - I see us using this again and again. // start with roles ... roles _only_ ever contain groups. foreach ($aRoles as $oRole) { // do NOT alert anonymous or Everyone roles - that would be very scary. $iRoleId = KTUtil::getId($oRole); if ($iRoleId == -3 || $iRoleId == -4) { continue; } // first try on the document, then the folder above it. $oRoleAllocation = DocumentRoleAllocation::getAllocationsForDocumentAndRole($oDocument->getId(), $iRoleId); if (is_null($oRoleAllocation)) { // if we don't get a document role, try folder role. $oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getFolderID(), $oRole->getId()); } if (is_null($oRoleAllocation) || PEAR::isError($oRoleAllocation)) { continue; } $aRoleUsers = $oRoleAllocation->getUsers(); $aRoleGroups = $oRoleAllocation->getGroups(); foreach ($aRoleUsers as $id => $oU) { $aUsers[$id] = $oU; } foreach ($aRoleGroups as $id => $oGroup) { $aGroups[$id] = $oGroup; } } // we now have a (potentially overlapping) set of groups, which may // have subgroups. // // what we need to do _now_ is build a canonical set of groups, and then // generate the singular user-base. $aGroupMembershipSet = GroupUtil::buildGroupArray(); $aAllIds = array_keys($aGroups); foreach ($aGroups as $id => $oGroup) { $aAllIds = kt_array_merge($aGroupMembershipSet[$id], $aAllIds); } foreach ($aAllIds as $id) { if (!array_key_exists($id, $aGroups)) { $aGroups[$id] = Group::get($id); } } // now, merge this (again) into the user-set. foreach ($aGroups as $oGroup) { $aNewUsers = $oGroup->getMembers(); foreach ($aNewUsers as $oU) { $id = $oU->getId(); if (!array_key_exists($id, $aUsers)) { $aUsers[$id] = $oU; } } } // and done. foreach ($aUsers as $oU) { if (!PEAR::isError($oU)) { KTWorkflowNotification::newNotificationForDocument($oDocument, $oU, $oState, $oUser, $sComments); } } }
function do_assistance() { $sSubject = $this->oValidator->validateString($_REQUEST['subject']); $sDetails = $this->oValidator->validateString($_REQUEST['details']); $aUsers = array(); $aGroups = array(); $aRoles = array(); foreach (Group::getAdministratorGroups() as $oGroup) { $aGroups[$oGroup->getId()] =& $oGroup; } foreach (Unit::getUnitsForFolder($this->oDocument->getFolderId()) as $oUnit) { foreach (Group::getUnitAdministratorGroupsByUnit($oUnit) as $oGroup) { $aGroups[$oGroup->getId()] =& $oGroup; } } $aRoles[-2] = Role::get(-2); $oDocument =& $this->oDocument; foreach ($aRoles as $oRole) { // Ignore anonymous or Everyone roles $iRoleId = KTUtil::getId($oRole); if ($iRoleId == -3 || $iRoleId == -4) { continue; } // first try on the document, then the folder above it. $oRoleAllocation = DocumentRoleAllocation::getAllocationsForDocumentAndRole($oDocument->getId(), $iRoleId); if (is_null($oRoleAllocation)) { // if we don't get a document role, try folder role. $oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getFolderID(), $oRole->getId()); } if (is_null($oRoleAllocation) || PEAR::isError($oRoleAllocation)) { continue; } $aRoleUsers = $oRoleAllocation->getUsers(); $aRoleGroups = $oRoleAllocation->getGroups(); foreach ($aRoleUsers as $id => $oU) { $aUsers[$id] = $oU; } foreach ($aRoleGroups as $id => $oGroup) { $aGroups[$id] = $oGroup; } } $aGroupMembershipSet = GroupUtil::buildGroupArray(); $aAllIds = array_keys($aGroups); foreach ($aGroups as $id => $oGroup) { $aAllIds = kt_array_merge($aGroupMembershipSet[$id], $aAllIds); } foreach ($aAllIds as $id) { if (!array_key_exists($id, $aGroups)) { $aGroups[$id] = Group::get($id); } } // now, merge this (again) into the user-set. foreach ($aGroups as $oGroup) { $aNewUsers = $oGroup->getMembers(); foreach ($aNewUsers as $oU) { $id = $oU->getId(); if (!array_key_exists($id, $aUsers)) { $aUsers[$id] = $oU; } } } foreach ($aUsers as $oU) { if (!PEAR::isError($oU)) { KTAssistNotification::newNotificationForDocument($this->oDocument, $oU, $this->oUser, $sSubject, $sDetails); } } $this->commitTransaction(); $params = 'fDocumentId=' . $oDocument->getId(); $url = generateControllerLink('viewDocument', $params); exit(redirect($url)); }
function getMembershipReason($oUser, $oGroup) { $aGroupArray = GroupUtil::buildGroupArray(); // short circuit if ($oGroup->hasMember($oUser)) { return sprintf(_kt('%s is a direct member.'), $oUser->getName()); } $aSubgroups = (array) $aGroupArray[$oGroup->getId()]; if (empty($aSubgroups)) { return null; // not a member, no subgroups. } $sTable = KTUtil::getTableName('users_groups'); $sQuery = 'SELECT group_id FROM ' . $sTable . ' WHERE user_id = ? AND group_id IN (' . DBUtil::paramArray($aSubgroups) . ')'; $aParams = array($oUser->getId()); $aParams = kt_array_merge($aParams, $aSubgroups); $res = DBUtil::getOneResult(array($sQuery, $aParams)); if (PEAR::isError($res)) { return $res; } else { if (is_null($res)) { return null; // not a member } } // else { $oSubgroup = Group::get($res['group_id']); if (PEAR::isError($oSubgroup)) { return $oSubgroup; } return sprintf(_kt('%s is a member of %s'), $oUser->getName(), $oSubgroup->getName()); // could be error, but errors are caught. // } }
<?php require_once "../../../config/dmsDefaults.php"; require_once KT_LIB_DIR . '/groups/GroupUtil.php'; var_dump(GroupUtil::buildGroupArray());