%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/classes/general/ |
Current File : //home/bitrix/www/bitrix/modules/socialnetwork/classes/general/log_destination.php |
<? use Bitrix\Main\ModuleManager; class CSocNetLogDestination { const LIST_USER_LIMIT = 11; /** * Retrieves last used users from socialnetwork/log_destination UserOption * @deprecated */ public static function GetLastUser() { global $USER; static $resultCache = array(); $userId = intval($USER->GetID()); if(!isset($resultCache[$userId])) { $arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array()); $arLastSelected = ( is_array($arLastSelected) && strlen($arLastSelected['users']) > 0 && $arLastSelected['users'] != '"{}"' ? array_reverse(CUtil::JsObjectToPhp($arLastSelected['users'])) : array() ); if (is_array($arLastSelected)) { if (!isset($arLastSelected[$userId])) { $arLastSelected['U'.$userId] = 'U'.$userId; } } else { $arLastSelected['U'.$userId] = 'U'.$userId; } $count = 0; $arUsers = Array(); foreach ($arLastSelected as $userId) { if ($count < 5) { $count++; } else { break; } $arUsers[$userId] = $userId; } $resultCache[$userId] = array_reverse($arUsers); } return $resultCache[$userId]; } /** * Retrieves last used sonet groups from socialnetwork/log_destination UserOption * @deprecated */ public static function GetLastSocnetGroup() { $arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array()); $arLastSelected = ( is_array($arLastSelected) && strlen($arLastSelected['sonetgroups']) > 0 && $arLastSelected['sonetgroups'] != '"{}"' ? array_reverse(CUtil::JsObjectToPhp($arLastSelected['sonetgroups'])) : array() ); $count = 0; $arSocnetGroups = Array(); foreach ($arLastSelected as $sgId) { if ($count <= 4) { $count++; } else { break; } $arSocnetGroups[$sgId] = $sgId; } return array_reverse($arSocnetGroups); } /** * Retrieves last used department from socialnetwork/log_destination UserOption * @deprecated */ public static function GetLastDepartment() { $arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array()); $arLastSelected = ( is_array($arLastSelected) && strlen($arLastSelected['department']) > 0 && $arLastSelected['department'] != '"{}"' ? array_reverse(CUtil::JsObjectToPhp($arLastSelected['department'])) : array() ); $count = 0; $arDepartment = Array(); foreach ($arLastSelected as $depId) { if ($count < 4) { $count++; } else { break; } $arDepartment[$depId] = $depId; } return array_reverse($arDepartment); } public static function GetStucture($arParams = Array()) { $bIntranetEnabled = false; if( IsModuleInstalled('intranet') && IsModuleInstalled('iblock') ) { $bIntranetEnabled = true; } $result = array( "department" => array(), "department_relation" => array(), "department_relation_head" => array(), ); $department_id = ( isset($arParams["DEPARTMENT_ID"]) && intval($arParams["DEPARTMENT_ID"]) > 0 ? intval($arParams["DEPARTMENT_ID"]) : false ); if($bIntranetEnabled) { if (!(CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser())) { if(($iblock_id = COption::GetOptionInt('intranet', 'iblock_structure', 0)) > 0) { global $CACHE_MANAGER; $ttl = ( defined("BX_COMP_MANAGED_CACHE") ? 2592000 : 600 ); $cache_id = 'sonet_structure_new4_'.$iblock_id.(intval($department_id) > 0 ? "_".$department_id : ""); $obCache = new CPHPCache; $cache_dir = '/sonet/structure'; if($obCache->InitCache($ttl, $cache_id, $cache_dir)) { $result = $obCache->GetVars(); } else { CModule::IncludeModule('iblock'); if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->StartTagCache($cache_dir); } $arFilter = array( "IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y" ); if (intval($department_id) > 0) { $rsSectionDepartment = CIBlockSection::GetList( array(), array( "ID" => intval($department_id) ), false, array("ID", "LEFT_MARGIN", "RIGHT_MARGIN") ); if ($arSectionDepartment = $rsSectionDepartment->Fetch()) { $arFilter[">=LEFT_MARGIN"] = $arSectionDepartment["LEFT_MARGIN"]; $arFilter["<=RIGHT_MARGIN"] = $arSectionDepartment["RIGHT_MARGIN"]; } } $dbRes = CIBlockSection::GetList( array("left_margin"=>"asc"), $arFilter, false, array("ID", "IBLOCK_SECTION_ID", "NAME") ); while ($ar = $dbRes->Fetch()) { $result["department"]['DR'.$ar['ID']] = array( 'id' => 'DR'.$ar['ID'], 'entityId' => $ar["ID"], 'name' => htmlspecialcharsbx($ar['NAME']), 'parent' => 'DR'.intval($ar['IBLOCK_SECTION_ID']), ); } if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->RegisterTag('iblock_id_'.$iblock_id); $CACHE_MANAGER->EndTagCache(); } if($obCache->StartDataCache()) { $obCache->EndDataCache($result); } } } } } if ( !empty( $result["department"]) && !isset($arParams["LAZY_LOAD"]) ) { $result["department_relation"] = self::GetTreeList('DR'.(intval($department_id) > 0 ? $department_id : 0), $result["department"], true); if (intval($arParams["HEAD_DEPT"]) > 0) { $result["department_relation_head"] = self::GetTreeList('DR'.intval($arParams["HEAD_DEPT"]), $result["department"], true); } } return $result; } public static function GetExtranetUser(array $arParams = array()) { global $USER, $CACHE_MANAGER; static $resultCache = array(); $userId = intval($USER->getID()); if(!isset($resultCache[$userId])) { $arUsers = Array(); $arFilter = Array(); if (CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser()) { $cacheTtl = 3153600; $cacheId = 'socnet_destination_getusers_'.md5(serialize($arParams)).'_'.$userId; $cacheDir = '/socnet/dest_extranet/'.intval($userId / 100).'/'; $obCache = new CPHPCache; if($obCache->initCache($cacheTtl, $cacheId, $cacheDir)) { $arUsers = $obCache->getVars(); } else { $obCache->startDataCache(); if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->StartTagCache($cacheDir); } $arSelect = Array($userId); $arSocnetGroups = array(); if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->registerTag("sonet_user2group_U".$userId); } $rsRelation = CSocNetUserToGroup::GetList( array("GROUP_NAME" => "ASC"), array( "USER_ID" => $userId, "<=ROLE" => SONET_ROLES_USER, "GROUP_SITE_ID" => SITE_ID, "GROUP_ACTIVE" => "Y", "!GROUP_CLOSED" => "Y" ), false, array("nTopCount" => 500), array("ID", "GROUP_ID") ); while($arRelation = $rsRelation->Fetch()) { $arGroupTmp = array( "id" => $arRelation["GROUP_ID"], "entityId" => $arRelation["GROUP_ID"] ); $arSocnetGroups[$arRelation["GROUP_ID"]] = $arGroupTmp; if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->registerTag("sonet_user2group_G".$arRelation["GROUP_ID"]); } } if (count($arSocnetGroups) > 0) { $arUserSocNetGroups = Array(); foreach ($arSocnetGroups as $groupId => $ar) { $arUserSocNetGroups[] = $groupId; } $dbRelation = CSocNetUserToGroup::GetList( array(), array( "GROUP_ID" => $arUserSocNetGroups, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y" ), false, false, array("ID", "USER_ID", "GROUP_ID") ); while ($arRelation = $dbRelation->fetch()) { $arSelect[] = intval($arRelation["USER_ID"]); } } $arFilter['ID'] = implode('|', $arSelect); if (!empty($arFilter['ID'])) { $arExtParams = Array( "FIELDS" => Array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE") ); $dbUsers = CUser::GetList(($sort_by = Array('last_name'=>'asc', 'IS_ONLINE'=>'desc')), ($dummy=''), $arFilter, $arExtParams); while ($arUser = $dbUsers->GetNext()) { $sName = trim(CUser::FormatName(CSite::GetNameFormat(), $arUser, true, false)); if (empty($sName)) { $sName = $arUser["~LOGIN"]; } $arFileTmp = CFile::ResizeImageGet( $arUser["PERSONAL_PHOTO"], array( "width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100), "height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100) ), BX_RESIZE_IMAGE_EXACT, false ); $arUsers['U'.$arUser["ID"]] = Array( 'id' => 'U'.$arUser["ID"], 'entityId' => $arUser["ID"], 'email' => $arUser["EMAIL"], 'name' => $sName, 'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'], 'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION']?$arUser['PERSONAL_PROFESSION']:' '), ); if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->registerTag("USER_NAME_".intval($arUser["ID"])); } } } $obCache->endDataCache($arUsers); } } $resultCache[$userId] = $arUsers; } return $resultCache[$userId]; } public static function GetUsers($arParams = Array(), $bSelf = true) { global $USER, $CACHE_MANAGER; $userId = intval($USER->GetID()); $extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList(); if ( isset($arParams['all']) && $arParams['all'] == 'Y' ) { if (IsModuleInstalled("intranet")) { return self::getUsersAll($arParams); } else { $arParamsNew = $arParams; $arParamsNew["id"] = array($userId); unset($arParamsNew["all"]); return CSocNetLogDestination::GetUsers($arParamsNew, $bSelf); } } $bExtranet = false; $arFilter = array(); if ( !isset($arParams['IGNORE_ACTIVITY']) || $arParams['IGNORE_ACTIVITY'] != 'Y' ) { $arFilter['ACTIVE'] = 'Y'; } $arExternalAuthId = self::getExternalAuthIdBlackList(); if (!empty($arExternalAuthId)) { $arFilter['!EXTERNAL_AUTH_ID'] = $arExternalAuthId; } if ( ( !isset($arParams['IGNORE_ACTIVITY']) || $arParams['IGNORE_ACTIVITY'] != 'Y' ) && ( IsModuleInstalled("intranet") || COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y" ) ) { $arFilter["CONFIRM_CODE"] = false; } $arExtParams = Array( "FIELDS" => array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE", "EXTERNAL_AUTH_ID"), "SELECT" => array() ); if ( isset($arParams["CRM_ENTITY"]) && $arParams["CRM_ENTITY"] == "Y" && ModuleManager::isModuleInstalled('crm') ) { $arExtParams['SELECT'][] = 'UF_USER_CRM_ENTITY'; } if (array_key_exists('id', $arParams)) { if (empty($arParams['id'])) { $arFilter['ID'] = $userId; } else { $arSelect = array($userId); foreach ($arParams['id'] as $value) { if ( intval($value) > 0 && !in_array($value, $arSelect) ) { $arSelect[] = intval($value); } } sort($arSelect); $arFilter['ID'] = implode('|', $arSelect); } } elseif (isset($arParams['deportament_id'])) { if (is_array($arParams['deportament_id'])) { $arFilter['UF_DEPARTMENT'] = $arParams['deportament_id']; } else { if ($arParams['deportament_id'] == 'EX') { $bExtranet = true; } else { $arFilter['UF_DEPARTMENT'] = intval($arParams['deportament_id']); } } $arExtParams['SELECT'][] = 'UF_DEPARTMENT'; } $avatarSize = array( "width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100), "height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100) ); $cacheTtl = 3153600; $cacheId = 'socnet_destination_getusers_'.md5(serialize($arFilter)).$bSelf.CSocNetUser::IsCurrentUserModuleAdmin().($bExtranet ? '_ex_'.$userId : '').md5(serialize($avatarSize)); $cacheDir = '/socnet/dest/'.( isset($arParams['id']) ? 'user' : 'dept' ).'/'; $obCache = new CPHPCache; if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir)) { $arUsers = $obCache->GetVars(); } else { $obCache->StartDataCache(); if(defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->StartTagCache($cacheDir); } if ( $bExtranet && CModule::IncludeModule("extranet") ) { $extranetSiteId = CExtranet::GetExtranetSiteID(); // get all extranet groups and set tags $rsSonetGroup = CSocNetUserToGroup::GetList( array(), array( "USER_ID" => $USER->GetId(), "GROUP_SITE_ID" => $extranetSiteId ), false, false, array("GROUP_ID") ); while($arSonetGroup = $rsSonetGroup->Fetch()) { $CACHE_MANAGER->RegisterTag("sonet_user2group_G".$arSonetGroup["GROUP_ID"]); } $CACHE_MANAGER->RegisterTag("sonet_user2group_U".$USER->GetId()); $arUsers = Array(); $arExtranetUsers = CExtranet::GetMyGroupsUsersFull($extranetSiteId, $bSelf); foreach($arExtranetUsers as $arUserTmp) { if (!empty($arUserTmp['UF_DEPARTMENT'])) { continue; } $sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUserTmp, true, false)); if (empty($sName)) { $sName = $arUserTmp["~LOGIN"]; } $arFileTmp = CFile::ResizeImageGet( $arUserTmp["PERSONAL_PHOTO"], $avatarSize, BX_RESIZE_IMAGE_EXACT, false ); $arUsers['U'.$arUserTmp["ID"]] = Array( 'id' => 'U'.$arUserTmp["ID"], 'entityId' => $arUserTmp["ID"], 'email' => $arUserTmp["EMAIL"] ? $arUserTmp["EMAIL"] : '', 'name' => $sName, 'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'], 'desc' => $arUserTmp['WORK_POSITION'] ? $arUserTmp['WORK_POSITION'] : ($arUserTmp['PERSONAL_PROFESSION'] ? $arUserTmp['PERSONAL_PROFESSION'] : ' '), ); if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->RegisterTag("USER_NAME_".IntVal($arUserTmp["ID"])); } } } else { $bExtranetInstalled = CModule::IncludeModule("extranet"); CSocNetTools::InitGlobalExtranetArrays(); if ( !isset($arFilter['UF_DEPARTMENT']) && $bExtranetInstalled ) { $arUserIdVisible = CExtranet::GetMyGroupsUsersSimple(SITE_ID); } $arUsers = Array(); $dbUsers = CUser::GetList( ($sort_by = array('last_name'=> 'asc', 'IS_ONLINE'=>'desc')), ($dummy=''), $arFilter, $arExtParams ); while ($arUser = $dbUsers->GetNext()) { if ( !$bSelf && is_object($USER) && $userId == $arUser["ID"] ) { continue; } if ( !isset($arFilter['UF_DEPARTMENT']) // all users && $bExtranetInstalled ) { if ( isset($arUser["UF_DEPARTMENT"]) && ( !is_array($arUser["UF_DEPARTMENT"]) || empty($arUser["UF_DEPARTMENT"]) || intval($arUser["UF_DEPARTMENT"][0]) <= 0 ) // extranet user && ( empty($arUserIdVisible) || !is_array($arUserIdVisible) || !in_array($arUser["ID"], $arUserIdVisible) ) ) { continue; } } $sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser, true, false)); if (empty($sName)) { $sName = $arUser["~LOGIN"]; } $arFileTmp = CFile::ResizeImageGet( $arUser["PERSONAL_PHOTO"], $avatarSize, BX_RESIZE_IMAGE_EXACT, false ); $arUsers['U'.$arUser["ID"]] = Array( 'id' => 'U'.$arUser["ID"], 'entityId' => $arUser["ID"], 'email' => $arUser["EMAIL"], 'name' => $sName, 'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'], 'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION'] ? $arUser['PERSONAL_PROFESSION'] : ' '), 'isExtranet' => (in_array($arUser["ID"], $extranetUserIdList) ? "Y" : "N"), 'isEmail' => ($arUser['EXTERNAL_AUTH_ID'] == 'email' ? 'Y' : 'N'), 'isCrmEmail' => ( $arUser['EXTERNAL_AUTH_ID'] == 'email' && !empty($arUser['UF_USER_CRM_ENTITY']) ? 'Y' : 'N' ) ); if ($arUser['EXTERNAL_AUTH_ID'] == 'email') { $arUsers['U'.$arUser["ID"]]['email'] = $arUser['EMAIL']; } $arUsers['U'.$arUser["ID"]]['checksum'] = md5(serialize($arUsers['U'.$arUser["ID"]])); if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->RegisterTag("USER_NAME_".IntVal($arUser["ID"])); } } } if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->RegisterTag("USER_NAME"); if (!empty($arFilter['UF_DEPARTMENT'])) { $CACHE_MANAGER->RegisterTag('intranet_department_'.$arFilter['UF_DEPARTMENT']); } $CACHE_MANAGER->EndTagCache(); } $obCache->EndDataCache($arUsers); } return $arUsers; } public static function GetGratMedalUsers($arParams = Array()) { global $USER; static $resultCache = array(); $userId = intval($USER->GetID()); if(!isset($resultCache[$userId])) { $arSubordinateDepts = array(); if (CModule::IncludeModule("intranet")) { $arSubordinateDepts = CIntranetUtils::GetSubordinateDepartments($userId, true); } $arFilter = Array( "ACTIVE" => "Y", "!UF_DEPARTMENT" => false ); $arExtParams = Array( "FIELDS" => Array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE"), "SELECT" => Array("UF_DEPARTMENT") ); if (isset($arParams["id"])) { if (empty($arParams["id"])) { $arFilter["ID"] = $userId; } else { $arSelect = array(); foreach ($arParams["id"] as $value) { $arSelect[] = intval($value); } $arFilter["ID"] = implode("|", $arSelect); } } $arGratUsers = Array(); $arMedalUsers = Array(); $dbUsers = CUser::GetList(($sort_by = Array("last_name" => "asc", "IS_ONLINE" => "desc")), ($dummy=''), $arFilter, $arExtParams); while ($arUser = $dbUsers->GetNext()) { $sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser)); if (empty($sName)) { $sName = $arUser["~LOGIN"]; } $arFileTmp = CFile::ResizeImageGet( $arUser["PERSONAL_PHOTO"], array("width" => 100, "height" => 100), BX_RESIZE_IMAGE_EXACT, false ); $arGratUsers['U'.$arUser["ID"]] = Array( "id" => "U".$arUser["ID"], "entityId" => $arUser["ID"], "email" => $arUser["EMAIL"], "name" => $sName, "avatar" => empty($arFileTmp["src"]) ? '' : $arFileTmp["src"], "desc" => $arUser["WORK_POSITION"] ? $arUser["WORK_POSITION"] : ($arUser["PERSONAL_PROFESSION"] ? $arUser["PERSONAL_PROFESSION"] : " "), ); if ( count($arSubordinateDepts) > 0 && count(array_intersect($arSubordinateDepts, $arUser["UF_DEPARTMENT"])) > 0 ) { $arMedalUsers['U'.$arUser["ID"]] = $arGratUsers['U'.$arUser["ID"]]; } } $resultCache[$userId] = array("GRAT" => $arGratUsers, "MEDAL" => $arMedalUsers); } return $resultCache[$userId]; } public function __percent_walk(&$val) { $val = str_replace('%', '', $val)."%"; } public static function SearchUsers($search, &$nt = "", $bSelf = true, $bEmployeesOnly = false, $bExtranetOnly = false, $departmentId = false) { global $USER, $DB; CUtil::JSPostUnescape(); if (is_array($search)) { $arParams = $search; $search = $arParams["SEARCH"]; $nameTemplate = (isset($arParams["NAME_TEMPLATE"]) ? $arParams["NAME_TEMPLATE"] : ''); $bSelf = (isset($arParams["SELF"]) ? $arParams["SELF"] : true); $bEmployeesOnly = (isset($arParams["EMPLOYEES_ONLY"]) ? $arParams["EMPLOYEES_ONLY"] : false); $bExtranetOnly = (isset($arParams["EXTRANET_ONLY"]) ? $arParams["EXTRANET_ONLY"] : false); $departmentId = (isset($arParams["DEPARTAMENT_ID"]) ? $arParams["DEPARTAMENT_ID"] : false); $bEmailUsers = (isset($arParams["EMAIL_USERS"]) ? $arParams["EMAIL_USERS"] : false); $bCrmEmailUsers = (isset($arParams["CRMEMAIL_USERS"]) && ModuleManager::isModuleInstalled('crm') ? $arParams["CRMEMAIL_USERS"] : false); $bActiveOnly = (isset($arParams["CHECK_ACTIVITY"]) && $arParams["CHECK_ACTIVITY"] === false ? false : true); $bNetworkSearch = (isset($arParams["NETWORK_SEARCH"]) ? $arParams["NETWORK_SEARCH"] : false); $bSearchOnlyWithEmail = (isset($arParams["ONLY_WITH_EMAIL"]) ? $arParams["ONLY_WITH_EMAIL"] : false); } else { $nameTemplate = $nt; $bEmailUsers = false; $bCrmEmailUsers = false; $bActiveOnly = true; $bNetworkSearch = false; $bSearchOnlyWithEmail = false; } $arUsers = array(); $search = trim($search); if ( strlen($search) <= 0 || !GetFilterQuery("TEST", $search) ) { return $arUsers; } $bSearchByEmail = false; if (preg_match('/^([^<]+)\s<([^>]+)>$/i', $search, $matches)) // email { $search = $matches[2]; $nt = $search; $bSearchByEmail = true; } $bIntranetEnabled = IsModuleInstalled('intranet'); $bExtranetEnabled = CModule::IncludeModule('extranet'); $bMailEnabled = IsModuleInstalled('mail'); $bBitrix24Enabled = IsModuleInstalled('bitrix24'); $bEmailUsersAll = ($bMailEnabled && \Bitrix\Main\Config\Option::get('socialnetwork', 'email_users_all', 'N') == 'Y'); $bExtranetUser = ($bExtranetEnabled && !CExtranet::IsIntranetUser()); $current_user_id = intval($USER->GetID()); if ($bExtranetEnabled) { CSocNetTools::InitGlobalExtranetArrays(); } $arSearchValue = preg_split('/\s+/', trim(ToUpper($search))); array_walk($arSearchValue, array('CSocNetLogDestination', '__percent_walk')); $arMyUserId = array(); if ($bIntranetEnabled) { if (count($arSearchValue) == 2) { $arLogicFilter = array( 'LOGIC' => 'OR', array('LOGIC' => 'AND', 'NAME' => $arSearchValue[0], 'LAST_NAME' => $arSearchValue[1]), array('LOGIC' => 'AND', 'NAME' => $arSearchValue[1], 'LAST_NAME' => $arSearchValue[0]), ); } else { $arLogicFilter = array( 'LOGIC' => 'OR', 'NAME' => $arSearchValue, 'LAST_NAME' => $arSearchValue, ); if ( count($arSearchValue) == 1 && strlen($arSearchValue[0]) > 2 ) { $arLogicFilter['LOGIN'] = $arSearchValue[0]; } } $arFilter = array( $arLogicFilter ); if ($bActiveOnly) { $arFilter['=ACTIVE'] = 'Y'; } $arExternalAuthId = self::getExternalAuthIdBlackList(array( "NETWORK_SEARCH" => $bNetworkSearch )); if (!empty($arExternalAuthId)) { $arFilter['!=EXTERNAL_AUTH_ID'] = $arExternalAuthId; } if ( ($bEmailUsers || $bCrmEmailUsers) && $bMailEnabled && !$bEmailUsersAll ) { $finderDestFilter = array( "USER_ID" => $current_user_id, "=CODE_TYPE" => "U", "=CODE_USER.EXTERNAL_AUTH_ID" => 'email' ); $finderDestSelect = array( 'CODE_USER_ID' ); if ($bCrmEmailUsers) { $finderDestFilter['!=CODE_USER.UF_USER_CRM_ENTITY'] = false; $finderDestSelect[] = 'CODE_USER.UF_USER_CRM_ENTITY'; } $rsUser = \Bitrix\Main\FinderDestTable::getList(array( 'order' => array(), 'filter' => $finderDestFilter, 'group' => array("CODE_USER_ID"), 'select' => $finderDestSelect )); while ($arUser = $rsUser->fetch()) { $arMyUserId[] = $arUser['CODE_USER_ID']; } } } else { if (count($arSearchValue) == 2) { $arFilter = array( array( 'LOGIC' => 'OR', array('LOGIC' => 'AND', 'NAME' => $arSearchValue[0], 'LAST_NAME' => $arSearchValue[1]), array('LOGIC' => 'AND', 'NAME' => $arSearchValue[1], 'LAST_NAME' => $arSearchValue[0]), ) ); } else { $arFilter = array( array( 'LOGIC' => 'OR', 'NAME' => $arSearchValue, 'LAST_NAME' => $arSearchValue, ) ); } if ($bActiveOnly) { $arFilter['=ACTIVE'] = 'Y'; } } if ( !$bNetworkSearch && ( $bIntranetEnabled || COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y" ) ) { $arFilter["CONFIRM_CODE"] = false; } $bFilteredByMyUserId = false; if( $bIntranetEnabled && $bExtranetEnabled && !$bCrmEmailUsers ) // consider extranet collaboration { CExtranet::fillUserListFilterORM( array( "CURRENT_USER_ID" => $current_user_id, "EXTRANET_USER" => $bExtranetUser, "INTRANET_ONLY" => ($bEmployeesOnly || ($bBitrix24Enabled && !$bExtranetEnabled)), "EXTRANET_ONLY" => $bExtranetOnly, "EMAIL_USERS_ALL" => $bEmailUsersAll, "MY_USERS" => $arMyUserId ), $arFilter, $bFilteredByMyUserId ); if (!$arFilter) { return $arUsers; } if ($bNetworkSearch) { end($arFilter); $arFilter[key($arFilter)]["=EXTERNAL_AUTH_ID"] = "replica"; } } if ( !empty($arMyUserId) && !$bFilteredByMyUserId ) { $arFilter[] = array( 'LOGIC' => 'OR', '!=EXTERNAL_AUTH_ID' => 'email', 'ID' => $arMyUserId, ); } if ($bSearchOnlyWithEmail) { $arFilter["!EMAIL"] = false; } $arSelect = array( "ID", "ACTIVE", "NAME", "LAST_NAME", "SECOND_NAME", "EMAIL", "LOGIN", "WORK_POSITION", "PERSONAL_PROFESSION", "PERSONAL_PHOTO", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", new \Bitrix\Main\Entity\ExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE')) ); if ($bCrmEmailUsers) { $arSelect[] = "UF_USER_CRM_ENTITY"; } if (!$bActiveOnly) { $arSelect[] = "ACTIVE"; } $db_events = GetModuleEvents("socialnetwork", "OnSocNetLogDestinationSearchUsers"); while ($arEvent = $db_events->Fetch()) { ExecuteModuleEventEx($arEvent, array($arSearchValue, &$arFilter, &$arSelect)); } $rsUser = \Bitrix\Main\UserTable::getList(array( 'order' => array( "MAX_LAST_USE_DATE" => 'DESC', 'LAST_NAME' => 'ASC' ), 'filter' => $arFilter, 'select' => $arSelect, 'limit' => 100, 'data_doubling' => false )); $queryResultCnt = 0; $bUseLogin = (strlen($search) > 3 && strpos($search, '@') > 0); $params = array( "NAME_TEMPLATE" => $nameTemplate, "USE_EMAIL" => $bSearchByEmail, "USE_LOGIN" => $bUseLogin ); while ($arUser = $rsUser->fetch()) { $queryResultCnt++; if ( !$bSelf && $current_user_id == $arUser['ID'] ) { continue; } if (intval($departmentId) > 0) { $arUserGroupCode = CAccess::GetUserCodesArray($arUser["ID"]); if (!in_array("DR".intval($departmentId), $arUserGroupCode)) { continue; } } $arUser = ( $arUser["EXTERNAL_AUTH_ID"] == "replica" ? self::formatNetworkUser($arUser, $params) : self::formatUser($arUser, $params) ); $arUsers[$arUser["id"]] = $arUser; } if ( ($bEmailUsers || $bCrmEmailUsers) && !$queryResultCnt && check_email($search, true) ) { $arEmailFilter = array( 'ACTIVE' => 'Y', '=EMAIL_OK' => 1 ); if (!empty($arExternalAuthId)) { $arEmailFilter['!=EXTERNAL_AUTH_ID'] = $arExternalAuthId; } $rsUser = \Bitrix\Main\UserTable::getList(array( 'order' => array(), 'filter' => $arEmailFilter, 'select' => array( "ID", "NAME", "LAST_NAME", "SECOND_NAME", "EMAIL", "LOGIN", "WORK_POSITION", "PERSONAL_PROFESSION", "PERSONAL_PHOTO", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", new \Bitrix\Main\Entity\ExpressionField('EMAIL_OK', 'CASE WHEN UPPER(%s) = "'.$DB->ForSql(strtoupper(str_replace('%', '%%', $search))).'" THEN 1 ELSE 0 END', 'EMAIL') ), 'limit' => 10 )); while ($arUser = $rsUser->fetch()) { $arUsers['U'.$arUser["ID"]] = self::formatUser($arUser, array( "NAME_TEMPLATE" => $nameTemplate, "USE_EMAIL" => true )); } } return $arUsers; } public static function searchSonetGroups($params = array()) { global $USER; $result = array(); CUtil::JSPostUnescape(); $search = is_array($params) && isset($params['SEARCH']) ? trim($params['SEARCH']) : ''; if (empty($search)) { return $result; } if ( strlen($search) <= 0 || !getFilterQuery("TEST", $search) ) { return $result; } $siteId = ( isset($params['SITE_ID']) && strlen($params['SITE_ID']) > 0 ? $params['SITE_ID'] : SITE_ID ); $currentUserAdmin = \CSocNetUser::isCurrentUserModuleAdmin($siteId); $tmpList = array(); $filter = array( '%NAME' => $search, "SITE_ID" => $siteId, "ACTIVE" => "Y", ); if (!$currentUserAdmin) { $filter["CHECK_PERMISSIONS"] = $USER->getId(); } $res = \CSocnetGroup::getList( array("NAME" => "ASC"), $filter, false, array("nTopCount" => 50), array("ID", "NAME", "DESCRIPTION", "IMAGE_ID") ); while ($group = $res->fetch()) { $tmp = array( "id" => $group["ID"], "entityId" => $group["ID"], "name" => htmlspecialcharsbx($group["NAME"]), "desc" => htmlspecialcharsbx($group["DESCRIPTION"]), ); if($group["IMAGE_ID"]) { $imageFile = CFile::getFileArray($group["IMAGE_ID"]); if ($imageFile !== false) { $arFileTmp = CFile::resizeImageGet( $imageFile, array( "width" => (intval($params["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $params["THUMBNAIL_SIZE_WIDTH"] : 100), "height" => (intval($params["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $params["THUMBNAIL_SIZE_HEIGHT"] : 100) ), BX_RESIZE_IMAGE_PROPORTIONAL, false ); $tmp["avatar"] = $arFileTmp["src"]; } } unset($group["IMAGE_ID"]); $tmpList[$tmp['id']] = $tmp; } if ( !$currentUserAdmin && isset($params['FEATURES']) && is_array($params['FEATURES']) && !empty($params['FEATURES']) ) { self::getSocnetGroupFilteredByFeaturePerms($tmpList, $params['FEATURES']); } if ( !$currentUserAdmin && isset($params['INITIATE']) && $params['INITIATE'] == 'Y' ) { self::getSocnetGroupFilteredByInitiatePerms($tmpList); } foreach ($tmpList as $value) { $value['id'] = 'SG'.$value['id']; $result[$value['id']] = $value; } return $result; } public static function SearchCrmEntities($arParams) { $result = array(); $search = (!empty($arParams['SEARCH']) ? $arParams['SEARCH'] : false); if ( $search && CModule::IncludeModule('crm') ) { if (check_email($search, true)) { $result = array(); if ( empty($arParams['ENTITIES']) || in_array('CONTACT', $arParams['ENTITIES']) ) { $dbRes = CCrmContact::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'FM' => array( 'EMAIL' => array( 'VALUE' => $search ) ) ), false, false, array('ID', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'PHOTO') ); while($ar = $dbRes->Fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'CONTACT', 'NAME_TEMPLATE' => $arParams["NAME_TEMPLATE"], 'EMAIL' => $search )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } if ( empty($arParams['ENTITIES']) || in_array('COMPANY', $arParams['ENTITIES']) ) { $dbRes = CCrmCompany::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'FM' => array( 'EMAIL' => array( 'VALUE' => $search ) ) ), false, false, array('ID', 'TITLE', 'LOGO') ); while($ar = $dbRes->Fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'COMPANY', 'EMAIL' => $search )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } if ( empty($arParams['ENTITIES']) || in_array('LEAD', $arParams['ENTITIES']) ) { $dbRes = CCrmLead::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'FM' => array( 'EMAIL' => array( 'VALUE' => $search ) ) ), false, false, array('ID', 'TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME') ); while($ar = $dbRes->Fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'LEAD', 'EMAIL' => $search )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } } elseif ( !isset($arParams['SEARCH_BY_EMAIL_ONLY']) || $arParams['SEARCH_BY_EMAIL_ONLY'] != 'Y' ) { $contacts = CCrmActivity::FindContactCommunications($search, 'EMAIL', 50); if (!empty($contacts)) { $arId = $arEmail = array(); foreach($contacts as $contact) { $arEmail[intval($contact["ENTITY_ID"])] = $contact["VALUE"]; $arId[] = intval($contact["ENTITY_ID"]); } $dbRes = CCrmContact::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'ID' => $arId ), false, array('nTopCount' => 10), array('ID', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'PHOTO') ); while($ar = $dbRes->fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'CONTACT', 'NAME_TEMPLATE' => $arParams["NAME_TEMPLATE"], 'EMAIL' => $arEmail[$ar['ID']] )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } $companies = CCrmActivity::FindCompanyCommunications($search, 'EMAIL', 50); if (!empty($companies)) { $arId = $arEmail = array(); foreach($companies as $company) { $arEmail[intval($company["ENTITY_ID"])] = $company["VALUE"]; $arId[] = intval($company["ENTITY_ID"]); } $dbRes = CCrmCompany::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'ID' => $arId ), false, array('nTopCount' => 10), array('ID', 'TITLE', 'LOGO') ); while($ar = $dbRes->Fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'COMPANY', 'EMAIL' => $arEmail[$ar['ID']] )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } $leads = CCrmActivity::FindLeadCommunications($search, 'EMAIL', 50); if (!empty($leads)) { $arId = $arEmail = array(); foreach($leads as $lead) { $arEmail[intval($lead["ENTITY_ID"])] = $lead["VALUE"]; $arId[] = intval($lead["ENTITY_ID"]); } $dbRes = CCrmLead::GetListEx( array(), array( 'CHECK_PERMISSIONS' => 'Y', 'ID' => $arId ), false, array('nTopCount' => 10), array('ID', 'TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME') ); while($ar = $dbRes->Fetch()) { $formatted = self::formatCrmEmailEntity($ar, array( 'TYPE' => 'LEAD', 'EMAIL' => $arEmail[$ar['ID']] )); if (!empty($formatted)) { $result[$formatted['id']] = $formatted; } } } } } return $result; } public static function getSocnetGroup($arParams = array(), &$limitReached = false) { global $USER; static $staticCache = array(); $userId = intval($USER->GetID()); $arSocnetGroups = array(); $arSelect = Array(); if (isset($arParams['id'])) { if (empty($arParams['id'])) { return $arSocnetGroups; } else { foreach ($arParams['id'] as $value) { $arSelect[] = intval($value); } } } $siteId = ( isset($arParams['site_id']) && strlen($arParams['site_id']) > 0 ? $arParams['site_id'] : SITE_ID ); $limit = (isset($arParams["limit"]) && intval($arParams["limit"]) > 0 ? intval($arParams["limit"]) : 500); $hash = md5(serialize($arParams).$userId.$siteId); if (isset($staticCache[$hash])) { $arSocnetGroups = $staticCache[$hash]; } else { $arSocnetGroupsTmp = array(); $tmpList = array(); if ( !isset($arParams["ALL"]) || $arParams["ALL"] != "Y" ) { $filter = array( "USER_ID" => $userId, "GROUP_ID" => $arSelect, "<=ROLE" => \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER, "GROUP_SITE_ID" => $siteId, "GROUP_ACTIVE" => "Y" ); if(isset($arParams['GROUP_CLOSED'])) { $filter['GROUP_CLOSED'] = $arParams['GROUP_CLOSED']; } $res = CSocNetUserToGroup::getList( array("GROUP_NAME" => "ASC"), $filter, false, array("nTopCount" => $limit), array("ID", "GROUP_ID", "GROUP_NAME", "GROUP_DESCRIPTION", "GROUP_IMAGE_ID") ); while($relation = $res->fetch()) { $tmpList[] = array( "id" => $relation["GROUP_ID"], "entityId" => $relation["GROUP_ID"], "name" => htmlspecialcharsbx($relation["GROUP_NAME"]), "desc" => htmlspecialcharsbx($relation["GROUP_DESCRIPTION"]), "imageId" => $relation["GROUP_IMAGE_ID"] ); } } else { $filter = array( "CHECK_PERMISSIONS" => $USER->GetID(), "SITE_ID" => $siteId, "ACTIVE" => "Y", "ID" => $arSelect, ); if(isset($arParams['GROUP_CLOSED'])) { $filter['CLOSED'] = $arParams['GROUP_CLOSED']; } $res = CSocnetGroup::GetList( array("NAME" => "ASC"), $filter, false, array("nTopCount" => $limit), array("ID", "NAME", "DESCRIPTION", "IMAGE_ID", "PROJECT") ); while ($group = $res->Fetch()) { $tmpList[] = array( "id" => $group["ID"], "entityId" => $group["ID"], "name" => htmlspecialcharsbx($group["NAME"]), "desc" => htmlspecialcharsbx($group["DESCRIPTION"]), "imageId" => $group["IMAGE_ID"], "project" => ($group["PROJECT"] == 'Y' ? 'Y' : 'N') ); } } $limitReached = (count($tmpList) == $limit); foreach ($tmpList as $key => $group) { if($group["imageId"]) { $imageFile = CFile::GetFileArray($group["imageId"]); if ($imageFile !== false) { $arFileTmp = CFile::ResizeImageGet( $imageFile, array( "width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100), "height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100) ), BX_RESIZE_IMAGE_PROPORTIONAL, false ); $group["avatar"] = $arFileTmp["src"]; } } unset($group["imageId"]); $arSocnetGroupsTmp[$group['id']] = $group; } if (isset($arParams['features']) && !empty($arParams['features'])) { self::getSocnetGroupFilteredByFeaturePerms($arSocnetGroupsTmp, $arParams['features']); } if (isset($arParams['initiate']) && $arParams['initiate'] == 'Y') { self::getSocnetGroupFilteredByInitiatePerms($arSocnetGroupsTmp); } foreach ($arSocnetGroupsTmp as $value) { $value['id'] = 'SG'.$value['id']; $arSocnetGroups[$value['id']] = $value; } $staticCache[$hash] = $arSocnetGroups; } if (isset($arParams['useProjects']) && $arParams['useProjects'] == 'Y') { $groupsList = $projectsList = array(); foreach($arSocnetGroups as $key => $value) { if ( isset($value['project']) && $value['project'] == 'Y' ) { $projectsList[$key] = $value; } else { $groupsList[$key] = $value; } } return array( 'SONETGROUPS' => $groupsList, 'PROJECTS' => $projectsList ); } return $arSocnetGroups; } public static function GetTreeList($id, $relation, $compat = false) { if ($compat) { $tmp = array(); foreach($relation as $iid => $rel) { $p = $rel["parent"]; if (!isset($tmp[$p])) { $tmp[$p] = array(); } $tmp[$p][] = $iid; } $relation = $tmp; } $arRelations = Array(); if (is_array($relation[$id])) { foreach ($relation[$id] as $relId) { $arItems = Array(); if ( isset($relation[$relId]) && !empty($relation[$relId]) ) { $arItems = self::GetTreeList($relId, $relation); } $arRelations[$relId] = Array('id'=>$relId, 'type' => 'category', 'items' => $arItems); } } return $arRelations; } private static function GetSocnetGroupFilteredByFeaturePerms(&$arGroups, $arFeaturePerms) { $arGroupsIDs = array(); foreach($arGroups as $value) { $arGroupsIDs[] = $value["id"]; } if (sizeof($arGroupsIDs) <= 0) { return; } $feature = $arFeaturePerms[0]; $operations = $arFeaturePerms[1]; if (!is_array($operations)) { $operations = explode(",", $operations); } $arGroupsPerms = array(); foreach($operations as $operation) { $tmpOps = CSocNetFeaturesPerms::CurrentUserCanPerformOperation(SONET_ENTITY_GROUP, $arGroupsIDs, $feature, $operation); if (is_array($tmpOps)) { foreach ($tmpOps as $key=>$val) { if (!$arGroupsPerms[$key]) { $arGroupsPerms[$key] = $val; } } } } $arGroupsActive = CSocNetFeatures::IsActiveFeature(SONET_ENTITY_GROUP, $arGroupsIDs, $arFeaturePerms[0]); foreach ($arGroups as $key=>$group) { if ( !$arGroupsActive[$group["id"]] || !$arGroupsPerms[$group["id"]] ) { unset($arGroups[$key]); } } } private static function GetSocnetGroupFilteredByInitiatePerms(&$arGroups) { global $USER; $arGroupsIDs = array(); foreach($arGroups as $value) { $arGroupsIDs[] = $value["id"]; } if (sizeof($arGroupsIDs) <= 0) { return; } if ( $USER->IsAdmin() || CSocNetUser::IsCurrentUserModuleAdmin(CSite::GetDefSite()) ) { return; } $groupsList = array(); $userRolesList = array(); $res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array( 'filter' => array( '@ID' => $arGroupsIDs ), 'select' => array('ID', 'OWNER_ID', 'INITIATE_PERMS') )); while ($group = $res->fetch()) { $groupsList[$group['ID']] = array( 'OWNER_ID' => $group['OWNER_ID'], 'INITIATE_PERMS' => $group['INITIATE_PERMS'] ); } $res = \Bitrix\Socialnetwork\UserToGroupTable::getList(array( 'filter' => array( 'USER_ID' => $USER->getId(), '@GROUP_ID' => $arGroupsIDs ), 'select' => array('GROUP_ID', 'ROLE') )); while ($relation = $res->fetch()) { $userRolesList[$relation['GROUP_ID']] = $relation['ROLE']; } $userId = $USER->getId(); foreach ($arGroups as $key => $group) { $groupId = $group["id"]; $canInitiate = ( ( isset($groupsList[$groupId]) && $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER && $userId == $groupsList[$groupId]["OWNER_ID"] ) || ( isset($groupsList[$groupId]) && $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR && isset($userRolesList[$groupId]) && in_array($userRolesList[$groupId], array( \Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER, \Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR )) ) || ( isset($groupsList[$groupId]) && $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER && isset($userRolesList[$groupId]) && in_array($userRolesList[$groupId], array( \Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER, \Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR, \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER )) ) ); if (!$canInitiate) { unset($arGroups[$key]); } } } public static function GetDestinationUsers($arCodes, $fetchUsers = false) { $userIds = array(); $users = array(); $fields = $fetchUsers ? array('ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL', 'PERSONAL_PHOTO', 'WORK_POSITION') : array('ID'); $usersToFetch = array(); foreach($arCodes as $code) { // All users if ($code === 'UA') { $dbRes = CUser::GetList($by = 'ID', $order = 'ASC', array('INTRANET_USERS' => true), array('FIELDS' => $fields)); while ($user = $dbRes->Fetch()) { if (!in_array($user['ID'], $userIds)) { $userIds[] = $user['ID']; if ($fetchUsers) { $user['USER_ID'] = $user['ID']; $users[] = $user; } } } $usersToFetch = array(); break; } elseif (substr($code, 0, 1) === 'U') { $userId = intval(substr($code, 1)); if (!in_array($userId, $userIds)) { $usersToFetch[] = $userId; if (!$fetchUsers) { $userIds[] = $userId; } } } elseif (substr($code, 0, 2) === 'SG') { $groupId = intval(substr($code, 2)); $dbMembers = CSocNetUserToGroup::GetList( array("RAND" => "ASC"), array("GROUP_ID" => $groupId, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y"), false, false, array("ID", "USER_ID", "ROLE", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "USER_EMAIL", "USER_PERSONAL_PHOTO", "USER_WORK_POSITION") ); if ($dbMembers) { while ($user = $dbMembers->GetNext()) { if (!in_array($user["USER_ID"], $userIds)) { $userIds[] = $user["USER_ID"]; $users[] = array( 'ID' => $user["USER_ID"], 'USER_ID' => $user["USER_ID"], 'LOGIN' => $user["USER_LOGIN"], 'NAME' => $user["USER_NAME"], 'LAST_NAME' => $user["USER_LAST_NAME"], 'SECOND_NAME' => $user["USER_SECOND_NAME"], 'EMAIL' => $user["USER_EMAIL"], 'PERSONAL_PHOTO' => $user["USER_PERSONAL_PHOTO"], 'WORK_POSITION' => $user["USER_WORK_POSITION"] ); } } } } elseif (substr($code, 0, 2) === 'DR') { $depId = intval(substr($code, 2)); $res = \Bitrix\Intranet\Util::getDepartmentEmployees(array( 'DEPARTMENTS' => $depId, 'RECURSIVE' => 'Y', 'ACTIVE' => 'Y', 'SELECT' => $fields )); while ($user = $res->Fetch()) { if (!in_array($user['ID'], $userIds)) { $userIds[] = $user['ID']; if ($fetchUsers) { $user['USER_ID'] = $user['ID']; $users[] = $user; } } } } } if (count($usersToFetch) > 0 && $fetchUsers) { $dbRes = CUser::GetList($by = 'ID', $order = 'ASC', array( 'INTRANET_USERS' => true, 'ID' => implode('|', $usersToFetch) ), array('FIELDS' => $fields)); while ($user = $dbRes->Fetch()) { if (!in_array($user['ID'], $userIds)) { $userIds[] = $user['ID']; $user['USER_ID'] = $user['ID']; $users[] = $user; } } } return $fetchUsers ? $users : $userIds; } public static function GetDestinationSort($arParams = array(), &$dataAdditional = false) { global $USER; $arResult = array(); $userId = ( isset($arParams["USER_ID"]) && intval($arParams["USER_ID"]) > 0 ? intval($arParams["USER_ID"]) : false ); $arContextFilter = ( isset($arParams["CONTEXT_FILTER"]) && is_array($arParams["CONTEXT_FILTER"]) ? $arParams["CONTEXT_FILTER"] : false ); $arCodeFilter = ( isset($arParams["CODE_FILTER"]) ? $arParams["CODE_FILTER"] : false ); if ( $arCodeFilter && !is_array($arCodeFilter) ) { $arCodeFilter = array($arCodeFilter); } if (!$userId) { if ($USER->IsAuthorized()) { $userId = $USER->GetId(); } else { return $arResult; } } $cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4; $cacheId = 'dest_sort'.(!is_array($dataAdditional) ? '' : '_2').$userId.serialize($arParams); $cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100); $obCache = new CPHPCache; if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir)) { $cacheData = $obCache->GetVars(); $arDestAll = isset($cacheData['DEST_ALL']) ? $cacheData['DEST_ALL'] : array(); $dataAdditionalUsers = isset($cacheData['DATA_ADDITIONAL_USERS']) ? $cacheData['DATA_ADDITIONAL_USERS'] : array(); } else { $dataAdditionalUsers = array(); $obCache->StartDataCache(); $arFilter = array( "USER_ID" => $USER->GetId() ); if ( IsModuleInstalled('mail') && IsModuleInstalled('intranet') && ( !isset($arParams["ALLOW_EMAIL_INVITATION"]) || !$arParams["ALLOW_EMAIL_INVITATION"] ) ) { $arFilter["!=CODE_USER.EXTERNAL_AUTH_ID"] = 'email'; } if (!empty($arParams["CODE_TYPE"])) { $arFilter["=CODE_TYPE"] = strtoupper($arParams["CODE_TYPE"]); } elseif ( !empty($arParams["DEST_CONTEXT"]) && strtoupper($arParams["DEST_CONTEXT"]) != 'CRM_POST' ) { $arFilter["!=CODE_TYPE"] = "CRM"; } if ( is_array($arContextFilter) && !empty($arContextFilter) ) { $arFilter["CONTEXT"] = $arContextFilter; } if ( is_array($arCodeFilter) && !empty($arCodeFilter) ) { $arFilter["CODE"] = $arCodeFilter; } $arRuntime = array(); $arOrder = array(); if (!empty($arParams["DEST_CONTEXT"])) { $conn = \Bitrix\Main\Application::getConnection(); $helper = $conn->getSqlHelper(); $arRuntime = array( new \Bitrix\Main\Entity\ExpressionField('CONTEXT_SORT', "CASE WHEN CONTEXT = '".$helper->forSql($arParams["DEST_CONTEXT"])."' THEN 1 ELSE 0 END") ); $arOrder = array( 'CONTEXT_SORT' => 'DESC' ); } $arOrder['LAST_USE_DATE'] = 'DESC'; $emailUserCodeList = $emailCrmUserCodeList = array(); if ( IsModuleInstalled('mail') && IsModuleInstalled('intranet') && isset($arParams["ALLOW_EMAIL_INVITATION"]) && $arParams["ALLOW_EMAIL_INVITATION"] ) { $rsDest = \Bitrix\Main\FinderDestTable::getList(array( 'order' => $arOrder, 'filter' => array( "USER_ID" => $USER->getId(), "=CODE_USER.EXTERNAL_AUTH_ID" => 'email', "=CODE_TYPE" => 'U' ), 'select' => array('CODE'), 'runtime' => $arRuntime, 'limit' => self::LIST_USER_LIMIT )); while($arDest = $rsDest->fetch()) { $emailUserCodeList[] = $arDest['CODE']; } $dataAdditionalUsers['UE'] = $emailUserCodeList; } if ( !empty($arParams["DEST_CONTEXT"]) && $arParams["DEST_CONTEXT"] == "CRM_POST" ) { $rsDest = \Bitrix\Main\FinderDestTable::getList(array( 'order' => $arOrder, 'filter' => array( "USER_ID" => $USER->getId(), "!=CODE_USER.UF_USER_CRM_ENTITY" => false, "=CODE_TYPE" => 'U' ), 'select' => array('CODE'), 'runtime' => $arRuntime, 'limit' => self::LIST_USER_LIMIT )); while($arDest = $rsDest->fetch()) { $emailCrmUserCodeList[] = $arDest['CODE']; } $dataAdditionalUsers['UCRM'] = $emailCrmUserCodeList; } $rsDest = \Bitrix\Main\FinderDestTable::getList(array( 'order' => $arOrder, 'filter' => $arFilter, 'select' => array( 'CONTEXT', 'CODE', 'LAST_USE_DATE' ), 'runtime' => $arRuntime )); $arDestAll = array(); while($arDest = $rsDest->Fetch()) { $arDest["LAST_USE_DATE"] = MakeTimeStamp($arDest["LAST_USE_DATE"]->toString()); $arDestAll[] = $arDest; } $obCache->EndDataCache(array( "DEST_ALL" => $arDestAll, "DATA_ADDITIONAL_USERS" => $dataAdditionalUsers )); } if (!is_array($dataAdditional)) { $dataAdditional = array(); } $dataAdditional = array_merge($dataAdditional, $dataAdditionalUsers); foreach ($arDestAll as $arDest) { if(!isset($arResult[$arDest["CODE"]])) { $arResult[$arDest["CODE"]] = array(); } $contextType = ( isset($arParams["DEST_CONTEXT"]) && $arParams["DEST_CONTEXT"] == $arDest["CONTEXT"] ? "Y" : "N" ); if ( $contextType == "Y" || !isset($arResult[$arDest["CODE"]]["N"]) || $arDest["LAST_USE_DATE"] > $arResult[$arDest["CODE"]]["N"] ) { $arResult[$arDest["CODE"]][$contextType] = $arDest["LAST_USE_DATE"]; } } return $arResult; } public static function CompareDestinations($a, $b) { if(!is_array($a) && !is_array($b)) { return 0; } elseif(is_array($a) && !is_array($b)) { return -1; } elseif(!is_array($a) && is_array($b)) { return 1; } else { if(isset($a["SORT"]["Y"]) && !isset($b["SORT"]["Y"])) { return -1; } elseif(!isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"])) { return 1; } elseif(isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"])) { if(intval($a["SORT"]["Y"]) > intval($b["SORT"]["Y"])) { return -1; } elseif(intval($a["SORT"]["Y"]) < intval($b["SORT"]["Y"])) { return 1; } else { return 0; } } else { if(intval($a["SORT"]["N"]) > intval($b["SORT"]["N"])) { return -1; } elseif(intval($a["SORT"]["N"]) < intval($b["SORT"]["N"])) { return 1; } else { return 0; } } } } public static function SortDestinations(&$arAllDest, $arSort) { foreach($arAllDest as $type => $arLastDest) { if (is_array($arLastDest)) { foreach($arLastDest as $key => $value) { if (isset($arSort[$key])) { $arAllDest[$type][$key] = array( "VALUE" => $value, "SORT" => $arSort[$key] ); } } uasort($arAllDest[$type], array(__CLASS__, 'CompareDestinations')); } } foreach($arAllDest as $type => $arLastDest) { if (is_array($arLastDest)) { foreach($arLastDest as $key => $val) { if (is_array($val)) { $arAllDest[$type][$key] = $val["VALUE"]; } } } } } public static function fillLastDestination($arDestinationSort, &$arLastDestination, $arParams = array()) { global $USER; $result = array(); $iUCounter = $iSGCounter = $iDCounter = 0; $iCRMContactCounter = $iCRMCompanyCounter = $iCRMDealCounter = $iCRMLeadCounter = 0; $bCrm = ( is_array($arParams) && isset($arParams["CRM"]) && $arParams["CRM"] == "Y" ); $bAllowEmail = ( is_array($arParams) && isset($arParams["EMAILS"]) && $arParams["EMAILS"] == "Y" ); $bAllowCrmEmail = ( is_array($arParams) && isset($arParams["CRMEMAILS"]) && $arParams["CRMEMAILS"] == "Y" && ModuleManager::isModuleInstalled('crm') ); $bAllowProject = ( is_array($arParams) && isset($arParams["PROJECTS"]) && $arParams["PROJECTS"] == "Y" ); $dataAdditional = ( is_array($arParams) && isset($arParams["DATA_ADDITIONAL"]) && is_array($arParams["DATA_ADDITIONAL"]) ? $arParams["DATA_ADDITIONAL"] : array() ); if (is_array($arDestinationSort)) { $userIdList = $sonetGroupIdList = array(); $userLimit = self::LIST_USER_LIMIT; $sonetGroupLimit = 6; $departmentLimit = 6; $crmContactLimit = $crmCompanyLimit = $crmDealLimit = $crmLeadLimit = 6; foreach ($arDestinationSort as $code => $sortInfo) { if ( !$bAllowEmail && !$bAllowCrmEmail && !$bAllowProject && ($iUCounter >= $userLimit) && $iSGCounter >= $sonetGroupLimit && $iDCounter >= $departmentLimit && $iCRMContactCounter >= $crmContactLimit && $iCRMCompanyCounter >= $crmCompanyLimit && $iCRMDealCounter >= $crmDealLimit && $iCRMLeadCounter >= $crmLeadLimit ) { break; } if (preg_match('/^U(\d+)$/i', $code, $matches)) { if ( !$bAllowEmail && !$bAllowCrmEmail && $iUCounter >= $userLimit ) { continue; } if (!isset($arLastDestination['USERS'])) { $arLastDestination['USERS'] = array(); } $arLastDestination['USERS'][$code] = $code; $userIdList[] = intval($matches[1]); $iUCounter++; } elseif (preg_match('/^SG(\d+)$/i', $code, $matches)) { if ( !$bAllowProject && $iSGCounter >= $sonetGroupLimit ) { continue; } if (!isset($arLastDestination['SONETGROUPS'])) { $arLastDestination['SONETGROUPS'] = array(); } $arLastDestination['SONETGROUPS'][$code] = $code; $sonetGroupIdList[] = intval($matches[1]); $iSGCounter++; } elseif ( preg_match('/^D(\d+)$/i', $code, $matches) || preg_match('/^DR(\d+)$/i', $code, $matches) ) { if ($iDCounter >= $departmentLimit) { continue; } if (!isset($arLastDestination['DEPARTMENT'])) { $arLastDestination['DEPARTMENT'] = array(); } $arLastDestination['DEPARTMENT'][$code] = $code; $iDCounter++; } elseif ( $bCrm && preg_match('/^CRMCONTACT(\d+)$/i', $code, $matches) ) { if ($iCRMContactCounter >= $crmContactLimit) { continue; } if (!isset($arLastDestination['CONTACTS'])) { $arLastDestination['CONTACTS'] = array(); } $arLastDestination['CONTACTS'][$code] = $code; $iCRMContactCounter++; } elseif ( $bCrm && preg_match('/^CRMCOMPANY(\d+)$/i', $code, $matches) ) { if ($iCRMCompanyCounter >= $crmCompanyLimit) { continue; } if (!isset($arLastDestination['COMPANIES'])) { $arLastDestination['COMPANIES'] = array(); } $arLastDestination['COMPANIES'][$code] = $code; $iCRMCompanyCounter++; } elseif ( $bCrm && preg_match('/^CRMDEAL(\d+)$/i', $code, $matches) ) { if ($iCRMDealCounter >= $crmDealLimit) { continue; } if (!isset($arLastDestination['DEALS'])) { $arLastDestination['DEALS'] = array(); } $arLastDestination['DEALS'][$code] = $code; $iCRMDealCounter++; } elseif ( $bCrm && preg_match('/^CRMLEAD(\d+)$/i', $code, $matches) ) { if ($iCRMLeadCounter >= $crmLeadLimit) { continue; } if (!isset($arLastDestination['LEADS'])) { $arLastDestination['LEADS'] = array(); } $arLastDestination['LEADS'][$code] = $code; $iCRMLeadCounter++; } } if ( ( $bAllowEmail || $bAllowCrmEmail ) && !empty($userIdList) ) { $iUCounter = $iUECounter = $iUCRMCounter = 0; $emailLimit = $crmLimit = 10; $userId = $USER->getId(); $destUList = $destUEList = $destUCRMList = array(); if ( ( isset($dataAdditional['UE']) && is_array($dataAdditional['UE']) ) || ( isset($dataAdditional['UCRM']) && is_array($dataAdditional['UCRM']) ) ) { if ( empty($dataAdditional['UE']) && empty($dataAdditional['UCRM']) ) { foreach($userIdList as $uId) { $code = 'U'.$uId; $destUList[$code] = $code; } } else { foreach($userIdList as $uId) { if ( $iUCounter >= $userLimit && $iUECounter >= $emailLimit && $iUCRMCounter >= $crmLimit ) { break; } $code = 'U'.$uId; if ( $bAllowEmail && in_array($code, $dataAdditional['UE']) ) { if ($iUECounter >= $emailLimit) { continue; } $destUEList[$code] = $code; $iUECounter++; } elseif ( $bAllowCrmEmail && in_array($code, $dataAdditional['UCRM']) ) { if ($iUCRMCounter >= $crmLimit) { continue; } $destUCRMList[$code] = $code; $iUCRMCounter++; } else { if ($iUCounter >= $userLimit) { continue; } $destUList[$code] = $code; $iUCounter++; } } } } else // old method { $cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4; $cacheId = 'dest_sort_users'.$userId.serialize($arParams).intval($bAllowCrmEmail); $cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100); $obCache = new CPHPCache; if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir)) { $cacheVars = $obCache->GetVars(); $destUList = $cacheVars['U']; $destUEList = $cacheVars['UE']; $destUCRMList = $cacheVars['UCRM']; } else { $obCache->StartDataCache(); $selectList = array('ID', 'EXTERNAL_AUTH_ID'); if ($bAllowCrmEmail) { $selectList[] = 'UF_USER_CRM_ENTITY'; } $selectList[] = new \Bitrix\Main\Entity\ExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE')); $res = \Bitrix\Main\UserTable::getList(array( 'order' => array( "MAX_LAST_USE_DATE" => 'DESC', ), 'filter' => array( '@ID' => $userIdList ), 'select' => $selectList )); while($destUser = $res->fetch()) { if ( $iUCounter >= $userLimit && $iUECounter >= $emailLimit && $iUCRMCounter >= $crmLimit ) { break; } $code = 'U'.$destUser['ID']; if ($bAllowEmail && $destUser['EXTERNAL_AUTH_ID'] == 'email') { if ($iUECounter >= $emailLimit) { continue; } $destUEList[$code] = $code; $iUECounter++; } elseif ( $bAllowCrmEmail && !empty($destUser['UF_USER_CRM_ENTITY']) ) { if ($iUCRMCounter >= $crmLimit) { continue; } $destUCRMList[$code] = $code; $iUCRMCounter++; } else { if ($iUCounter >= $userLimit) { continue; } $destUList[$code] = $code; $iUCounter++; } } $obCache->EndDataCache(array( 'U' => $destUList, 'UE' => $destUEList, 'UCRM' => $destUCRMList )); } } $arLastDestination['USERS'] = array_merge($destUList, $destUEList, $destUCRMList); $tmp = array('USERS' => $arLastDestination['USERS']); CSocNetLogDestination::sortDestinations($tmp, $arDestinationSort); $arLastDestination['USERS'] = $tmp['USERS']; } if ( $bAllowProject && !empty($sonetGroupIdList) ) { $iSGCounter = $iSGPCounter = 0; $projectLimit = 10; $userId = $USER->getId(); $destSGList = $destSGPList = array(); $cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4; $cacheId = 'dest_sort_sonetgroups'.$userId.serialize($arParams); $cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100); $obCache = new CPHPCache; if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir)) { $cacheVars = $obCache->GetVars(); $destSGList = $cacheVars['SG']; $destSGPList = $cacheVars['SGP']; } else { $obCache->StartDataCache(); $res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array( 'filter' => array( '@ID' => $sonetGroupIdList ), 'select' => array('ID', 'PROJECT') )); while($destSonetGroup = $res->fetch()) { if ( $iSGCounter >= $sonetGroupLimit && $iSGPCounter >= $projectLimit ) { break; } $code = 'SG'.$destSonetGroup['ID']; if ($destSonetGroup['PROJECT'] == 'Y') { if ($iSGPCounter >= $projectLimit) { continue; } $destSGPList[$code] = $code; $iSGPCounter++; } else { if ($iSGCounter >= $sonetGroupLimit) { continue; } $destSGList[$code] = $code; $iSGCounter++; } } $obCache->EndDataCache(array( 'SG' => $destSGList, 'SGP' => $destSGPList )); } $tmp = array( 'SONETGROUPS' => $destSGList, 'PROJECTS' => $destSGPList ); CSocNetLogDestination::sortDestinations($tmp, $arDestinationSort); $arLastDestination['SONETGROUPS'] = $tmp['SONETGROUPS']; $arLastDestination['PROJECTS'] = $tmp['PROJECTS']; } } foreach($arLastDestination as $groupKey => $entitiesList) { $result[$groupKey] = array(); if (is_array($entitiesList)) { $tmp = array(); $sort = 0; foreach($entitiesList as $key => $value) { $tmp[$key] = $sort++; } $result[$groupKey] = $tmp; } } return $result; } public static function fillEmails(&$arDest) { $arDest["EMAILS"] = array(); $arDest["LAST"]["EMAILS"] = array(); if ( !empty($arDest) && !empty($arDest["LAST"]) && !empty($arDest["LAST"]["USERS"]) && !empty($arDest["USERS"]) ) { foreach($arDest["LAST"]["USERS"] as $key => $value) { if ( isset($arDest["USERS"][$key]) && is_array($arDest["USERS"][$key]) && isset($arDest["USERS"][$key]["isEmail"]) && $arDest["USERS"][$key]["isEmail"] == "Y" ) { $arDest["EMAILS"][$key] = $arDest["USERS"][$key]; $arDest["LAST"]["EMAILS"][$key] = $value; } } } } public static function fillCrmEmails(&$arDest) { $arDest["CRMEMAILS"] = array(); $arDest["LAST"]["CRMEMAILS"] = array(); if ( !empty($arDest) && !empty($arDest["LAST"]) && !empty($arDest["LAST"]["USERS"]) && !empty($arDest["USERS"]) ) { foreach($arDest["LAST"]["USERS"] as $key => $value) { if ( isset($arDest["USERS"][$key]) && is_array($arDest["USERS"][$key]) && isset($arDest["USERS"][$key]["isCrmEmail"]) && $arDest["USERS"][$key]["isCrmEmail"] == "Y" ) { $arDest["CRMEMAILS"][$key] = $arDest["USERS"][$key]; $arDest["LAST"]["CRMEMAILS"][$key] = $value; } } } } public static function getUsersAll($arParams) { global $DB, $USER; static $arFields = array( "ID" => Array("FIELD" => "U.ID", "TYPE" => "int"), "ACTIVE" => Array("FIELD" => "U.ACTIVE", "TYPE" => "string"), "NAME" => Array("FIELD" => "U.NAME", "TYPE" => "string"), "EMAIL" => Array("FIELD" => "U.EMAIL", "TYPE" => "string"), "LAST_NAME" => Array("FIELD" => "U.LAST_NAME", "TYPE" => "string"), "SECOND_NAME" => Array("FIELD" => "U.SECOND_NAME", "TYPE" => "string"), "LOGIN" => Array("FIELD" => "U.LOGIN", "TYPE" => "string"), "PERSONAL_PHOTO" => Array("FIELD" => "U.PERSONAL_PHOTO", "TYPE" => "int"), "WORK_POSITION" => Array("FIELD" => "U.WORK_POSITION", "TYPE" => "string"), "CONFIRM_CODE" => Array("FIELD" => "U.CONFIRM_CODE", "TYPE" => "string"), "PERSONAL_PROFESSION" => Array("FIELD" => "U.PERSONAL_PROFESSION", "TYPE" => "string"), "EXTERNAL_AUTH_ID" => Array("FIELD" => "U.EXTERNAL_AUTH_ID", "TYPE" => "string") ); $currentUserId = $USER->GetId(); $extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList(); if (!$currentUserId) { return array(); } $bExtranetEnabled = CModule::includeModule("extranet"); $bExtranetUser = ( $bExtranetEnabled && !CExtranet::IsIntranetUser() ); $bExtranetWorkgroupsAllowed = ( $bExtranetEnabled && CExtranet::WorkgroupsAllowed() ); $bShowAllContactsAllowed = ( $bExtranetEnabled && CExtranet::ShowAllContactsAllowed() ); $rsData = CUserTypeEntity::GetList( array("ID" => "ASC"), array( "FIELD_NAME" => "UF_DEPARTMENT", "ENTITY_ID" => "USER" ) ); if($arRes = $rsData->Fetch()) { $UFId = intval($arRes["ID"]); } else { return array(); } if ( $bExtranetUser && !$bExtranetWorkgroupsAllowed ) // limited extranet { return false; } $arOrder = array("ID" => "ASC"); $arFilter = array('ACTIVE' => 'Y'); if ( IsModuleInstalled("intranet") || COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y" ) { $arFilter["CONFIRM_CODE"] = false; } $arExternalAuthId = self::getExternalAuthIdBlackList(); if (!empty($arExternalAuthId)) { $arFilter['!EXTERNAL_AUTH_ID'] = $arExternalAuthId; } $arGroupBy = false; $arSelectFields = array("ID", "NAME", "LAST_NAME", "SECOND_NAME", "LOGIN", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "EXTERNAL_AUTH_ID", "EMAIL"); $arSqls = CSocNetGroup::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields); $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "DISTINCT", $arSqls["SELECT"]); $strJoin = $strJoin2 = $arSqls2 = false; if ($bExtranetEnabled) { if ($bExtranetWorkgroupsAllowed) { if (!$bExtranetUser) { $strJoin = " INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId)." "; $tmp = $arSqls; $arSqls["WHERE"] .= (strlen($arSqls["WHERE"]) > 0 ? " AND " : "")." (UM.VALUE_INT > 0)"; if (!$bShowAllContactsAllowed) { // select all the users (intranet and extranet from my groups) $strJoin2 = " INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID INNER JOIN b_sonet_user2group UG_MY ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".intval($currentUserId)." "; $arSqls2 = $tmp; } } else { $strJoin = " INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID INNER JOIN b_sonet_user2group UG_MY ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".intval($currentUserId)." "; } } elseif (!$bShowAllContactsAllowed) // limited extranet, only for intranet users, don't show extranet { $strJoin = "INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId); $arSqls["WHERE"] .= (strlen($arSqls["WHERE"]) > 0 ? " AND " : "")."UM.VALUE_INT > 0"; } } $strSql = "SELECT ".$arSqls["SELECT"]." FROM b_user U ".$arSqls["FROM"]." "; if ($strJoin) { $strSql .= $strJoin." "; } if (strlen($arSqls["WHERE"]) > 0) { $strSql .= "WHERE ".$arSqls["WHERE"]." "; } if ($strJoin2) { $strSql .= "UNION SELECT ".$arSqls2["SELECT"]." FROM b_user U ".$arSqls2["FROM"]." "; $strSql .= $strJoin2." "; if (strlen($arSqls2["WHERE"]) > 0) { $strSql .= "WHERE ".$arSqls2["WHERE"]." "; } $strSql .= "ORDER BY ID ASC"; // cannot use alias } else // only without union { if (strlen($arSqls["ORDERBY"]) > 0) { $strSql .= "ORDER BY ".$arSqls["ORDERBY"]." "; } } //echo "!1!=".htmlspecialcharsbx($strSql)."<br>"; $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $maxCount = (IsModuleInstalled('bitrix24') ? 200 : 500); $resultCount = 0; $countExceeded = false; $arUsers = array(); if ($bExtranetEnabled) { CSocNetTools::InitGlobalExtranetArrays(); } while ($arUser = $dbRes->GetNext()) { if ($resultCount > $maxCount) { $countExceeded = true; break; } $sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser, true, false)); if (empty($sName)) { $sName = $arUser["~LOGIN"]; } $arFileTmp = CFile::ResizeImageGet( $arUser["PERSONAL_PHOTO"], array('width' => 100, 'height' => 100), BX_RESIZE_IMAGE_EXACT, false ); $arUsers['U'.$arUser["ID"]] = Array( 'id' => 'U'.$arUser["ID"], 'entityId' => $arUser["ID"], 'email' => $arUser["EMAIL"], 'name' => $sName, 'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'], 'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION'] ? $arUser['PERSONAL_PROFESSION'] : ' '), 'isExtranet' => (in_array($arUser["ID"], $extranetUserIdList) ? "Y" : "N"), 'isEmail' => ($arUser['EXTERNAL_AUTH_ID'] == 'email' ? 'Y' : 'N'), 'active' => 'Y' ); if ($arUser['EXTERNAL_AUTH_ID'] == 'email') { $arUsers['U'.$arUser["ID"]]['email'] = $arUser['EMAIL']; } $arUsers['U'.$arUser["ID"]]['checksum'] = md5(serialize($arUsers['U'.$arUser["ID"]])); $arUsers['U'.$arUser["ID"]]['login'] = ''; $resultCount++; } if ($countExceeded) { return CSocNetLogDestination::GetUsers( array( "id" => array($currentUserId) ), true ); } return $arUsers; } public static function formatUser($arUser, $arParams = array()) { static $siteNameFormat = false; static $isIntranetInstalled = false; static $extranetUserIdList = false; if ($siteNameFormat === false) { $siteNameFormat = CSite::GetNameFormat(false); } if ($isIntranetInstalled === false) { $isIntranetInstalled = (IsModuleInstalled('intranet') ? 'Y' : 'N'); } if ($extranetUserIdList === false) { $extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList(); } $arFileTmp = CFile::ResizeImageGet( $arUser["PERSONAL_PHOTO"], array('width' => 100, 'height' => 100), BX_RESIZE_IMAGE_EXACT, false ); $arRes = array( 'id' => 'U'.$arUser["ID"], 'entityId' => $arUser["ID"], 'name' => CUser::FormatName( ( !empty($arParams["NAME_TEMPLATE"]) ? $arParams["NAME_TEMPLATE"] : $siteNameFormat ), $arUser, true, true ), 'avatar' => ( empty($arFileTmp['src']) ? '' : $arFileTmp['src'] ), 'desc' => ( $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ( $arUser['PERSONAL_PROFESSION'] ? $arUser['PERSONAL_PROFESSION'] : ' ' ) ), 'isExtranet' => ( in_array($arUser["ID"], $extranetUserIdList) ? "Y" : "N" ), 'isEmail' => ( isset($arUser['EXTERNAL_AUTH_ID']) && $arUser['EXTERNAL_AUTH_ID'] == 'email' ? 'Y' : 'N' ) ); if (!empty($arUser["UF_USER_CRM_ENTITY"])) { $arRes['crmEntity'] = $arUser["UF_USER_CRM_ENTITY"]; } if (!empty($arUser["ACTIVE"])) { $arRes['active'] = $arUser["ACTIVE"]; } $arRes["email"] = $arUser['EMAIL']; if ( ( isset($arParams['USE_EMAIL']) && $arParams['USE_EMAIL'] ) || $arRes['isEmail'] == 'Y' ) { if ( strlen($arUser["NAME"]) > 0 || strlen($arUser["NAME"]) > 0 ) { $arRes['showEmail'] = "Y"; } } $db_events = GetModuleEvents("socialnetwork", "OnSocNetLogDestinationFormatUser"); while ($arEvent = $db_events->Fetch()) { ExecuteModuleEventEx($arEvent, array($arUser, &$arRes)); } $checksum = md5(serialize($arRes)); $arRes['checksum'] = $checksum; $arRes['login'] = ( $isIntranetInstalled == 'Y' && isset($arParams['USE_LOGIN']) && $arParams['USE_LOGIN'] ? $arUser["LOGIN"] : '' ); return $arRes; } public static function formatCrmEmailEntity($fields, $params = array()) { static $siteNameFormat = false; $result = array(); $userParams = array(); if ( is_array($params) && isset($params["TYPE"]) && in_array($params["TYPE"], array('CONTACT', 'COMPANY', 'LEAD')) ) { if ($siteNameFormat === false) { $siteNameFormat = ( !empty($params["NAME_TEMPLATE"]) ? $params["NAME_TEMPLATE"] : CSite::GetNameFormat(false) ); } $prefix = ''; if ($params["TYPE"] == 'CONTACT') { $prefix = 'C_'; $imageField = 'PHOTO'; $userParams = array( 'name' => $fields['NAME'], 'lastName' => $fields['LAST_NAME'] ); $name = CUser::FormatName( $siteNameFormat, $fields, true, true ); } elseif ($params["TYPE"] == 'COMPANY') { $prefix = 'CO_'; $imageField = 'LOGO'; $name = $fields['TITLE']; $userParams = array( 'name' => '', 'lastName' => $fields['TITLE'] ); } elseif ($params["TYPE"] == 'LEAD') { $prefix = 'L_'; $imageField = false; $name = $fields['TITLE']; $userParams = array( 'name' => $fields['NAME'], 'lastName' => $fields['LAST_NAME'] ); $username = CUser::FormatName( $siteNameFormat, $fields, true, true ); if (!empty($username)) { $name .= ', '.$username; } } if ( $imageField && isset($fields[$imageField]) ) { $arFileTmp = CFile::ResizeImageGet( $fields[$imageField], array('width' => 100, 'height' => 100), BX_RESIZE_IMAGE_EXACT, false ); } else { $arFileTmp = array(); } $result = array( 'id' => $prefix.$fields["ID"], 'crmEntity' => $prefix.$fields["ID"], 'entityId' => $fields['ID'], 'name' => $name, 'avatar' => ( empty($arFileTmp['src']) ? '' : $arFileTmp['src'] ), 'desc' => (!empty($params['EMAIL']) ? $params['EMAIL'] : ''), 'email' => (!empty($params['EMAIL']) ? $params['EMAIL'] : ''), 'isExtranet' => 'N', 'isEmail' => 'Y', 'isCrmEmail' => 'Y', 'params' => $userParams ); } return $result; } public static function formatNetworkUser($fields, $params = array()) { static $siteNameFormat = false; $result = array(); $userParams = array(); if ($siteNameFormat === false) { $siteNameFormat = ( !empty($params["NAME_TEMPLATE"]) ? $params["NAME_TEMPLATE"] : CSite::GetNameFormat(false) ); } $name = CUser::FormatName( $siteNameFormat, $fields, true, true ); if (isset($fields["EXTERNAL_AUTH_ID"]) && $fields["EXTERNAL_AUTH_ID"] == "replica") list(,$domain) = explode("@", $fields["LOGIN"], 2); else $domain = $fields["CLIENT_DOMAIN"]; if ($fields["PERSONAL_PHOTO"]) { $arFileTmp = CFile::ResizeImageGet( $fields["PERSONAL_PHOTO"], array('width' => 32, 'height' => 32), BX_RESIZE_IMAGE_EXACT, false ); } $userParams = array( 'name' => $fields['NAME'], 'lastName' => $fields['LAST_NAME'], 'domain' => $domain, ); $result = array( 'id' => isset($fields['ID'])? $fields['ID']: $fields['XML_ID'], 'entityId' => isset($fields['ID'])? $fields['ID']: $fields['XML_ID'], 'name' => $name, 'avatar' => $fields["PERSONAL_PHOTO"] && !empty($arFileTmp['src'])? $arFileTmp['src']: '', 'desc' => $domain, 'showDesc' => true, 'email' => (!empty($fields['EMAIL']) ? $fields['EMAIL'] : ''), 'networkId' => $fields['NETWORK_ID'], 'isExtranet' => 'N', 'isEmail' => 'N', 'isNetwork' => 'Y', 'params' => $userParams ); return $result; } private static function getExternalAuthIdBlackList($params = array()) { $result = array( "bot", "imconnector" ); if ( !is_array($params) || !isset($params["NETWORK_SEARCH"]) || !$params["NETWORK_SEARCH"] ) { $result[] = 'replica'; } return $result; } } ?>