/** * Метод возвращает массив операций, которые указанный пользователь может совершить, если документ находится в указанных состояниях. * Если среди состояний нет ни одного рабочего потока типа конечных автоматов, то возвращается null. * Если пользователь не может выполнить ни одной операции, то возвращается array(). * Иначе возвращается массив доступных для пользователя операций в виде array(операция, ...). * * @param int $userId - код пользователя. * @param array $arGroups - массив групп пользователя. * @param array $arStates - массив состояний рабочих потоков документа. * @param bool $appendExtendedGroups - use extended groups mode * @return mixed - массив доступных операций или null. */ public static function GetAllowableOperations($userId, $arGroups, $arStates, $appendExtendedGroups = false) { if (!is_array($arStates)) { throw new Exception("arStates"); } if (!is_array($arGroups)) { throw new Exception("arGroups"); } $arGroups = CBPHelper::convertToExtendedGroups($arGroups); if ($appendExtendedGroups) { $arGroups = array_merge($arGroups, CBPHelper::getUserExtendedGroups($userId)); } if (!in_array("group_u" . $userId, $arGroups)) { $arGroups[] = "group_u" . $userId; } $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 = CBPHelper::convertToExtendedGroups($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; }