} $cacheDir = SITE_ID . '/intranet/user_info/'; $obUserCache = new CPHPCache(); if ($obUserCache->InitCache($cacheTtl, $cacheID, $cacheDir)) { $cacheData = $obUserCache->GetVars(); $arResult['CURRENT_USER'] = $cacheData['CURRENT_USER']; $arResult['ONLY_MINE'] = $cacheData['ONLY_MINE']; unset($cacheData); } else { global $CACHE_MANAGER; $CACHE_MANAGER->StartTagCache($cacheDir); if ($arParams['bShowFilter']) { $dbCurrentUser = CUser::GetByID($GLOBALS['USER']->GetID()); $arResult['CURRENT_USER'] = $dbCurrentUser->Fetch(); if ($arParams['bShowFilter'] = !!$arResult['CURRENT_USER']['UF_DEPARTMENT']) { $arResult['CURRENT_USER']['DEPARTMENT_TOP'] = CIntranetUtils::GetIBlockTopSection($arResult['CURRENT_USER']['UF_DEPARTMENT']); if (intval($arResult['DEPARTMENT']) == $arResult['CURRENT_USER']['DEPARTMENT_TOP']) { $arResult['ONLY_MINE'] = 'Y'; } } } $CACHE_MANAGER->RegisterTag('bx_user_intranet_info_' . $arResult['CURRENT_USER']['ID']); $CACHE_MANAGER->EndTagCache(); } if ($obUserCache->StartDataCache()) { $obUserCache->EndDataCache(array('CURRENT_USER' => $arResult['CURRENT_USER'], 'ONLY_MINE' => $arResult['ONLY_MINE'])); } foreach ($arResult['USERS'] as $key => $arUser) { if ($arUser['PERSONAL_PHOTO']) { $imageFile = CFile::GetFileArray($arUser['PERSONAL_PHOTO']); if ($imageFile !== false) {
function GetListItemChangesSinceToken($listName, $viewFields = '', $query = '', $rowLimit = 0, $changeToken = '') { global $APPLICATION, $USER; if (!($listName_original = CIntranetUtils::checkGUID($listName))) { return new CSoapFault('Data error', 'Wrong GUID - ' . $listName); } if (!$USER->IsAdmin() && (!defined("IS_EXTRANET") || IS_EXTRANET != "Y")) { $rsUsers = CUser::GetList($by = "id", $order = "asc", array("ID" => $USER->GetID()), array("SELECT" => array("UF_DEPARTMENT"))); if ($arUser = $rsUsers->Fetch()) { if (intval($arUser["UF_DEPARTMENT"][0]) > 0) { $bUserIntranet = true; } } if (!$bUserIntranet) { return new CSoapFault('Data error', 'User has no permissions to read intranet contacts'); } } $listName = ToUpper(CIntranetUtils::makeGUID($listName_original)); $arFilter = array('ACTIVE' => 'Y'); $page = 1; $bUpdateFields = false; $tsLastFieldsChange = COption::GetOptionString('intranet', 'ws_contacts_last_fields_change', false); $this->bGetImages = COption::GetOptionString('intranet', 'ws_contacts_get_images', 'Y') == 'Y'; if (strlen($changeToken) > 0) { if ($pos = strpos($changeToken, ';')) { list($newChangeToken, $page, $last_change) = explode(';', $changeToken); $page++; $changeToken = $newChangeToken; } $arFilter['TIMESTAMP_X_1'] = ConvertTimeStamp($changeToken, 'FULL'); if (!$arFilter['TIMESTAMP_X_1']) { return new CSoapFault('Params error', 'Wrong changeToken: ' . $changeToken); } if ($tsLastFieldsChange !== false && $tsLastFieldsChange > $changeToken) { $bUpdateFields = true; } } if (CModule::IncludeModule('extranet') && defined("IS_EXTRANET") && IS_EXTRANET == "Y") { $arFilter["GROUPS_ID"] = array(COption::GetOptionInt("extranet", "extranet_group")); } if (!CModule::IncludeModule('extranet') || defined("IS_EXTRANET") && IS_EXTRANET == "Y" && defined("IS_EMPLOYEES") && IS_EMPLOYEES == "Y" || (!defined("IS_EXTRANET") || IS_EXTRANET != "Y")) { $arFilter["!UF_DEPARTMENT"] = false; } else { $arFilter["UF_DEPARTMENT"] = false; } // it's needed to check is current user an intranet user if he requested intranet script $arListParams = array("SELECT" => array("UF_DEPARTMENT")); if ($rowLimit > 0) { $arListParams["NAV_PARAMS"] = array("nPageSize" => $rowLimit, "bShowAll" => false, "iNumPage" => $page); } $obUsers = CUser::GetList($by = 'id', $order = 'asc', $arFilter, $arListParams); if (!isset($last_change)) { $last_change = 0; } $data = new CXMLCreator('listitems'); $data->setAttribute('MinTimeBetweenSyncs', 0); $data->setAttribute('RecommendedTimeBetweenSyncs', 180); $data->setAttribute('TimeStamp', $this->__makeDateTime()); $data->setAttribute('EffectivePermMask', 'FullMask'); $data->addChild($obChanges = new CXMLCreator('Changes')); if ((!$changeToken || $bUpdateFields) && $page <= 1) { $arGetListResult = $this->GetList($listName); $obChanges->addChild($arGetListResult['GetListResult']); } //TODO: the next thing is to do something like this for all deleted events. //$obChanges->addChild($obId = new CXMLCreator('Id')); //$obId->setAttribute('ChangeType', 'Delete'); //$obId->setData('702'); //<Id ChangeType="Delete">14</Id> $data->addChild($obData = new CXMLCreator('rs:data')); $counter = 0; if (CModule::IncludeModule('extranet') && defined("IS_EXTRANET") && IS_EXTRANET == "Y") { $arUsersInMyGroupsID = CExtranet::GetMyGroupsUsers(CExtranet::GetExtranetSiteID()); $arPublicUsersID = CExtranet::GetPublicUsers(); } while ($arUser = $obUsers->Fetch()) { if (CModule::IncludeModule('extranet') && !CExtranet::IsExtranetAdmin()) { if (defined("IS_EXTRANET") && IS_EXTRANET == "Y" && (!in_array($arUser["ID"], $arUsersInMyGroupsID) && !in_array($arUser["ID"], $arPublicUsersID) || $arUser["ID"] == $USER->GetID())) { continue; } } if (is_array($arUser['UF_DEPARTMENT']) && count($arUser['UF_DEPARTMENT']) > 0) { if ($this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]]) { $arUser['WORK_COMPANY'] = $this->arDepartmentsTopCache[$arUser['UF_DEPARTMENT'][0]]; $arUser['UF_DEPARTMENT'] = $this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]]; } else { $dbRes = CIBlockSection::GetByID($arUser['UF_DEPARTMENT'][0]); if ($arRes = $dbRes->Fetch()) { if (!defined("IS_EXTRANET") || IS_EXTRANET != "Y" || defined("IS_EMPLOYEES") && IS_EMPLOYEES == "Y") { $arUser['DEPARTMENT'] = $this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]] = $arRes['NAME']; } // this case crashes inner cache of top departments //if (!$arUser['WORK_COMPANY']) //{ if ($top_section = CIntranetUtils::GetIBlockTopSection($arUser['UF_DEPARTMENT'])) { $dbRes = CIBlockSection::GetByID($top_section); if ($arRes = $dbRes->Fetch()) { $arUser['WORK_COMPANY'] = $this->arDepartmentsTopCache[$arUser['UF_DEPARTMENT'][0]] = $arRes['NAME']; } } //} if (!defined("IS_EXTRANET") || IS_EXTRANET != "Y" || defined("IS_EMPLOYEES") && IS_EMPLOYEES == "Y") { $arUser['UF_DEPARTMENT'] = $arUser['DEPARTMENT']; } } } } // if (!$bGetImages) // $arUser['PERSONAL_PHOTO'] = 0; $counter++; $obData->addChild($this->__getRow($arUser, $listName, $last_change)); } //$last_change = time(); $obData->setAttribute('ItemCount', $counter); $data->setAttribute('xmlns:rs', 'urn:schemas-microsoft-com:rowset'); $data->setAttribute('xmlns:z', '#RowsetSchema'); if ($bUpdateFields && $tsLastFieldsChange) { $last_change = $tsLastFieldsChange; } if ($last_change > 0) { if ($rowLimit && $obUsers->NavPageCount > 1 && $obUsers->NavPageCount > $page) { $last_change = intval($changeToken) . ';' . $page . ';' . $last_change; $obChanges->setAttribute('MoreChanges', 'TRUE'); } else { $last_change += 1; } $obChanges->setAttribute('LastChangeToken', $last_change); } return array('GetListItemChangesSinceTokenResult' => $data); }