• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_destination.php
  • Класс: CSocNetLogDestination
  • Вызов: CSocNetLogDestination::getUsersAll
static function getUsersAll($arParams = [])
{
	global $DB, $USER;

	static $arFieldsStatic = 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")
	);

	$arFields = $arFieldsStatic;
	$arFields["IS_ONLINE"] = Array(
		"FIELD" => "IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL " . CUser::getSecondsForLimitOnline() . " SECOND), 'Y', 'N')"
	);

	$currentUserId = $USER->GetId();

	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 = (int)$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([
		'ALLOW_BOTS' => (isset($arParams['ALLOW_BOTS']) && $arParams['ALLOW_BOTS'] === true)
	]);
	$arExternalAuthId[] = 'email';
	$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", "IS_ONLINE");

	$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"] .= ($arSqls["WHERE"] <> '' ? " 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 AND UG.ROLE <= '".SONET_ROLES_USER."'
						INNER JOIN b_sonet_user2group UG_MY 
							ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".(int)$currentUserId."
							AND UG_MY.ROLE <= '".UserToGroupTable::ROLE_USER."'
						LEFT JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".(int)$UFId."
					";
					$arSqls2 = $tmp;
				}
			}
			else
			{
				$strJoin = "
					INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID AND UG.ROLE <= '".SONET_ROLES_USER."'
					INNER JOIN b_sonet_user2group UG_MY 
						ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".(int)$currentUserId."
						AND UG_MY.ROLE <= '".UserToGroupTable::ROLE_USER."'
					LEFT JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".(int)$UFId."
				";
			}
		}
		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"] .= ($arSqls["WHERE"] <> '' ? " AND " : "")."UM.VALUE_INT > 0";
		}
	}

	$strSql =
		"SELECT
			".(
				$bExtranetEnabled
					? $arSqls["SELECT"].", CASE WHEN UM.VALUE_INT > 0 THEN 'employee' WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'extranet' END USER_TYPE"
					: $arSqls["SELECT"].", CASE WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'employee' END USER_TYPE"
			)." 
		FROM b_user U
			".$arSqls["FROM"]." ";

	if ($strJoin)
	{
		$strSql .= $strJoin." ";
	}

	if ($arSqls["WHERE"] <> '')
	{
		$strSql .= "WHERE ".$arSqls["WHERE"]." ";
	}

	$strSql .= "GROUP BY ID ";

	if ($strJoin2)
	{
		$strSql .=
			"UNION SELECT
				".$arSqls2["SELECT"].", CASE WHEN UM.VALUE_INT > 0 THEN 'employee' WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'extranet' END  USER_TYPE 
			FROM b_user U
				".$arSqls2["FROM"]." ";

			$strSql .= $strJoin2." ";

		if ($arSqls2["WHERE"] <> '')
		{
			$strSql .= "WHERE ".$arSqls2["WHERE"]." ";
		}

		$strSql .= "GROUP BY ID ";

		$strSql .= "ORDER BY ID ASC"; // cannot use alias
	}
	else // only without union
	{
		if ($arSqls["ORDERBY"] <> '')
		{
			$strSql .= "ORDER BY ".$arSqls["ORDERBY"]." ";
		}
	}

	//echo "!1!=".htmlspecialcharsbx($strSql)."
"; $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $maxCount = (IsModuleInstalled('bitrix24') ? 200 : 500); $resultCount = 0; $countExceeded = false; $arUsers = array(); if ($bExtranetEnabled) { CSocNetTools::InitGlobalExtranetArrays(); } while ($arUser = $dbRes->GetNext()) { if ( $resultCount > $maxCount && (!isset($arParams['RETURN_FULL_LIST']) || $arParams['RETURN_FULL_LIST'] !== 'Y') ) { $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' => (isset($arUser['USER_TYPE']) && $arUser['USER_TYPE'] === 'extranet' ? "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; }