public static function GetSuperposedList($Params = array()) { global $DB; $checkPermissions = $Params['checkPermissions'] !== false; $checkSocnetPermissions = $Params['checkSocnetPermissions'] !== false; $userId = isset($Params['userId']) ? intVal($Params['userId']) : self::$userId; $arResult = array(); $arSectionIds = array(); $sqlSearch = ""; // Common types $strTypes = ""; if (isset($Params['TYPES']) && is_array($Params['TYPES'])) { foreach ($Params['TYPES'] as $type) { $strTypes .= ",'" . CDatabase::ForSql($type) . "'"; } $strTypes = trim($strTypes, ", "); if ($strTypes != "") { $sqlSearch .= "(CS.CAL_TYPE in (" . $strTypes . "))"; } } // Group's calendars $strGroups = "0"; if (is_array($Params['GROUPS']) && count($Params['GROUPS']) > 0) { foreach ($Params['GROUPS'] as $ownerId) { if (IntVal($ownerId) > 0) { $strGroups .= "," . IntVal($ownerId); } } if ($strGroups != "0") { if ($sqlSearch != "") { $sqlSearch .= " OR "; } $sqlSearch .= "(CS.OWNER_ID in (" . $strGroups . ") AND CS.CAL_TYPE='group')"; } } if ($sqlSearch != "") { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tCS.*,\n\t\t\t\t\tCT.NAME AS TYPE_NAME, CT.DESCRIPTION AS TYPE_DESC\n\t\t\t\tFROM\n\t\t\t\t\tb_calendar_section CS\n\t\t\t\t\tLEFT JOIN b_calendar_type CT ON (CS.CAL_TYPE=CT.XML_ID)\n\t\t\t\tWHERE\n\t\t\t\t\t(\n\t\t\t\t\t\tCT.ACTIVE='Y'\n\t\t\t\t\tAND\n\t\t\t\t\t\tCS.ACTIVE='Y'\n\t\t\t\t\tAND\n\t\t\t\t\t(\n\t\t\t\t\t\t{$sqlSearch}\n\t\t\t\t\t))"; $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); while ($arRes = $res->Fetch()) { $arSectionIds[] = $arRes['ID']; $arResult[] = $arRes; } } // User's calendars $strUsers = "0"; if (is_array($Params['USERS']) && count($Params['USERS']) > 0) { foreach ($Params['USERS'] as $ownerId) { if (IntVal($ownerId) > 0) { $strUsers .= "," . IntVal($ownerId); } } if ($strUsers != "0") { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tCS.*,\n\t\t\t\t\tU.LOGIN AS USER_LOGIN, U.NAME AS USER_NAME, U.LAST_NAME AS USER_LAST_NAME, U.SECOND_NAME AS USER_SECOND_NAME\n\t\t\t\tFROM\n\t\t\t\t\tb_calendar_section CS\n\t\t\t\t\tLEFT JOIN b_user U ON (CS.OWNER_ID=U.ID)\n\t\t\t\tWHERE\n\t\t\t\t\t(\n\t\t\t\t\t\tCS.ACTIVE='Y'\n\t\t\t\t\tAND\n\t\t\t\t\t\tCS.OWNER_ID in (" . $strUsers . ")\n\t\t\t\t\tAND\n\t\t\t\t\t\tCS.CAL_TYPE='user'\n\t\t\t\t\t)"; $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } while ($arRes = $res->Fetch()) { $arSectionIds[] = $arRes['ID']; $arResult[] = $arRes; } } if ($checkPermissions && count($arSectionIds) > 0) { if ($checkSocnetPermissions) { if (isset($Params['USERS']) && count($Params['USERS']) > 0) { $arFeaturesU = CSocNetFeatures::IsActiveFeature(SONET_ENTITY_USER, $Params['USERS'], "calendar"); $arViewU = CSocNetFeaturesPerms::CanPerformOperation($userId, SONET_ENTITY_USER, $Params['USERS'], "calendar", 'view'); $arWriteU = CSocNetFeaturesPerms::CanPerformOperation($userId, SONET_ENTITY_GROUP, $Params['USERS'], "calendar", 'write'); } if (isset($Params['GROUPS']) && count($Params['GROUPS']) > 0) { $arFeaturesG = CSocNetFeatures::IsActiveFeature(SONET_ENTITY_GROUP, $Params['GROUPS'], "calendar"); $arViewG = CSocNetFeaturesPerms::CanPerformOperation($userId, SONET_ENTITY_GROUP, $Params['GROUPS'], "calendar", 'view'); $arWriteG = CSocNetFeaturesPerms::CanPerformOperation($userId, SONET_ENTITY_GROUP, $Params['GROUPS'], "calendar", 'write'); } } CCalendarSect::GetArrayPermissions($arSectionIds); $res = array(); $sectIds = array(); foreach ($arResult as $sect) { $sectId = $sect['ID']; $ownerId = $sect['OWNER_ID']; if (self::CanDo('calendar_view_time', $sectId) && !in_array($sectId, $sectIds)) { if ($checkSocnetPermissions) { // Disabled in socialnetwork if ($sect['CAL_TYPE'] == 'group' && (!$arFeaturesG[$ownerId] || !$arViewG[$ownerId]) || $sect['CAL_TYPE'] == 'user' && (!$arFeaturesU[$ownerId] || !$arViewU[$ownerId])) { continue; } } $sect['PERM'] = array('view_time' => self::CanDo('calendar_view_time', $sectId), 'view_title' => self::CanDo('calendar_view_title', $sectId), 'view_full' => self::CanDo('calendar_view_full', $sectId), 'add' => self::CanDo('calendar_add', $sectId), 'edit' => self::CanDo('calendar_edit', $sectId), 'edit_section' => self::CanDo('calendar_edit_section', $sectId), 'access' => self::CanDo('calendar_edit_access', $sectId)); if ($checkSocnetPermissions) { if ($sect['CAL_TYPE'] == 'group' && !$arWriteG[$ownerId] || $sect['CAL_TYPE'] == 'user' && !$arWriteU[$ownerId]) { $sect['PERM']['add'] = false; $sect['PERM']['edit'] = false; $sect['PERM']['edit_section'] = false; $sect['PERM']['access'] = false; } } if ($sect['CAL_TYPE'] == 'user') { if (isset($sect['USER_NAME'], $sect['USER_LAST_NAME'])) { $sect['OWNER_NAME'] = CCalendar::GetUserName(array("NAME" => $sect['USER_NAME'], "LAST_NAME" => $sect['USER_LAST_NAME'], "LOGIN" => $sect['USER_LOGIN'], "ID" => $ownerId, "SECOND_NAME" => $sect['USER_SECOND_NAME'])); unset($sect['USER_LOGIN']); unset($sect['USER_LAST_NAME']); unset($sect['USER_SECOND_NAME']); unset($sect['USER_NAME']); } else { $sect['OWNER_NAME'] = CCalendar::GetUserName($ownerId); } } elseif ($sect['CAL_TYPE'] == 'group' && isset($Params['arGroups'])) { $sect['OWNER_NAME'] = $Params['arGroups'][$ownerId]['NAME']; } $res[] = $sect; $sectIds[] = $sectId; } } $arResult = $res; } return $arResult; }