/** * Метод возвращает массив операций, которые указанный пользователь может совершить, если документ находится в указанных состояниях. * Если среди состояний нет ни одного рабочего потока типа конечных автоматов, то возвращается null. * Если пользователь не может выполнить ни одной операции, то возвращается array(). * Иначе возвращается массив доступных для пользователя операций в виде array(операция, ...). * * @param int $userId - код пользователя. * @param array $arGroups - массив групп пользователя. * @param array $arStates - массив состояний рабочих потоков документа. * @param bool $extendedGroups - use extended groups mode * @return mixed - массив доступных операций или null. */ public static function GetAllowableOperations($userId, $arGroups, $arStates, $extendedGroups = false) { if (!is_array($arStates)) { throw new Exception("arStates"); } if (!is_array($arGroups)) { throw new Exception("arGroups"); } if (!$extendedGroups && !in_array("user_" . $userId, $arGroups)) { $arGroups[] = "user_" . $userId; } if ($extendedGroups && !in_array("group_u" . $userId, $arGroups)) { $arGroups[] = "group_u" . $userId; } if ($extendedGroups) { $arGroups = array_merge($arGroups, CBPHelper::getUserExtendedGroups($userId)); } $arGroups = array_map('strtolower', $arGroups); $result = null; foreach ($arStates as $arState) { if (is_array($arState["STATE_PERMISSIONS"]) && count($arState["STATE_PERMISSIONS"]) > 0) { if ($result == null) { $result = array(); } foreach ($arState["STATE_PERMISSIONS"] as $operation => $arOperationGroups) { $arOperationGroups = $extendedGroups ? CBPHelper::convertToExtendedGroups($arOperationGroups) : CBPHelper::convertToSimpleGroups($arOperationGroups, true); $arOperationGroups = array_map('strtolower', $arOperationGroups); if (count(array_intersect($arGroups, $arOperationGroups)) > 0) { $result[] = strtolower($operation); } // foreach ($arOperationGroups as $operationGroup) // { // if (is_array($operationGroup) && count($operationGroup) == 2 // || !is_array($operationGroup) && in_array($operationGroup, $arGroups)) // { // $result[] = strtolower($operation); // break; // } // } } } } return $result; }