static function GetList(&$by, &$order, $arFilter=Array(), $arParams=Array())
{
/** @global CUserTypeManager $USER_FIELD_MANAGER */
global $DB, $USER_FIELD_MANAGER;
$err_mess = (CUser::err_mess())."
Function: GetList
Line: ";
if (is_array($by))
{
$bSingleBy = false;
$arOrder = $by;
}
else
{
$bSingleBy = true;
$arOrder = array($by=>$order);
}
static $obUserFieldsSql;
if (!isset($obUserFieldsSql))
{
$obUserFieldsSql = new CUserTypeSQL;
$obUserFieldsSql->SetEntity("USER", "U.ID");
$obUserFieldsSql->obWhere->AddFields(array(
"F_LAST_NAME" => array(
"TABLE_ALIAS" => "U",
"FIELD_NAME" => "U.LAST_NAME",
"MULTIPLE" => "N",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
));
}
$obUserFieldsSql->SetSelect($arParams["SELECT"]);
$obUserFieldsSql->SetFilter($arFilter);
$obUserFieldsSql->SetOrder($arOrder);
$arFields_m = array("ID", "ACTIVE", "LAST_LOGIN", "LOGIN", "EMAIL", "NAME", "LAST_NAME", "SECOND_NAME", "TIMESTAMP_X", "PERSONAL_BIRTHDAY", "IS_ONLINE", "IS_REAL_USER");
$arFields = array(
"DATE_REGISTER", "PERSONAL_PROFESSION", "PERSONAL_WWW", "PERSONAL_ICQ", "PERSONAL_GENDER", "PERSONAL_PHOTO", "PERSONAL_PHONE", "PERSONAL_FAX",
"PERSONAL_MOBILE", "PERSONAL_PAGER", "PERSONAL_STREET", "PERSONAL_MAILBOX", "PERSONAL_CITY", "PERSONAL_STATE", "PERSONAL_ZIP", "PERSONAL_COUNTRY", "PERSONAL_NOTES",
"WORK_COMPANY", "WORK_DEPARTMENT", "WORK_POSITION", "WORK_WWW", "WORK_PHONE", "WORK_FAX", "WORK_PAGER", "WORK_STREET", "WORK_MAILBOX", "WORK_CITY", "WORK_STATE",
"WORK_ZIP", "WORK_COUNTRY", "WORK_PROFILE", "WORK_NOTES", "ADMIN_NOTES", "XML_ID", "LAST_NAME", "SECOND_NAME", "STORED_HASH", "CHECKWORD_TIME", "EXTERNAL_AUTH_ID",
"CONFIRM_CODE", "LOGIN_ATTEMPTS", "LAST_ACTIVITY_DATE", "AUTO_TIME_ZONE", "TIME_ZONE", "TIME_ZONE_OFFSET", "PASSWORD", "CHECKWORD", "LID", "LANGUAGE_ID", "TITLE",
);
$arFields_all = array_merge($arFields_m, $arFields);
$arSelectFields = array();
$online_interval = (array_key_exists("ONLINE_INTERVAL", $arParams) && intval($arParams["ONLINE_INTERVAL"]) > 0 ? $arParams["ONLINE_INTERVAL"] : CUser::GetSecondsForLimitOnline());
if (isset($arParams['FIELDS']) && is_array($arParams['FIELDS']) && count($arParams['FIELDS']) > 0 && !in_array("*", $arParams['FIELDS']))
{
foreach ($arParams['FIELDS'] as $field)
{
$field = mb_strtoupper($field);
if ($field == 'TIMESTAMP_X' || $field == 'DATE_REGISTER' || $field == 'LAST_LOGIN')
$arSelectFields[$field] = $DB->DateToCharFunction("U.".$field)." ".$field.", U.".$field." ".$field."_DATE";
elseif ($field == 'PERSONAL_BIRTHDAY')
$arSelectFields[$field] = $DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT")." PERSONAL_BIRTHDAY, U.PERSONAL_BIRTHDAY PERSONAL_BIRTHDAY_DATE";
elseif ($field == 'IS_ONLINE')
$arSelectFields[$field] = "IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL ".$online_interval." SECOND), 'Y', 'N') IS_ONLINE";
elseif ($field == 'IS_REAL_USER')
$arSelectFields[$field] = "IF(U.EXTERNAL_AUTH_ID IN ('".join("', '", CUser::GetExternalUserTypes())."'), 'N', 'Y') IS_REAL_USER";
elseif (in_array($field, $arFields_all))
$arSelectFields[$field] = 'U.'.$field;
}
}
if (empty($arSelectFields))
{
$arSelectFields[] = 'U.*';
$arSelectFields['TIMESTAMP_X'] = $DB->DateToCharFunction("U.TIMESTAMP_X")." TIMESTAMP_X";
$arSelectFields['IS_ONLINE'] = "IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL ".$online_interval." SECOND), 'Y', 'N') IS_ONLINE";
$arSelectFields['DATE_REGISTER'] = $DB->DateToCharFunction("U.DATE_REGISTER")." DATE_REGISTER";
$arSelectFields['LAST_LOGIN'] = $DB->DateToCharFunction("U.LAST_LOGIN")." LAST_LOGIN";
$arSelectFields['PERSONAL_BIRTHDAY'] = $DB->DateToCharFunction("U.PERSONAL_BIRTHDAY", "SHORT")." PERSONAL_BIRTHDAY";
}
$arSqlSearch = Array();
$strJoin = "";
if(is_array($arFilter))
{
foreach ($arFilter as $key => $val)
{
$key = mb_strtoupper($key);
if(is_array($val))
{
if(count($val) <= 0)
continue;
}
elseif
(
$key != "LOGIN_EQUAL_EXACT"
&& $key != "CONFIRM_CODE"
&& $key != "!CONFIRM_CODE"
&& $key != "LAST_ACTIVITY"
&& $key != "!LAST_ACTIVITY"
&& $key != "LAST_LOGIN"
&& $key != "!LAST_LOGIN"
&& $key != "EXTERNAL_AUTH_ID"
&& $key != "!EXTERNAL_AUTH_ID"
&& $key != "IS_REAL_USER"
)
{
if((string)$val == '' || $val === "NOT_REF")
continue;
}
$match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter);
switch($key)
{
case "ID":
$arSqlSearch[] = GetFilterQuery("U.ID",$val,"N");
break;
case ">ID":
$arSqlSearch[] = "U.ID > ".intval($val);
break;
case "!ID":
$arSqlSearch[] = "U.ID <> ".intval($val);
break;
case "ID_EQUAL_EXACT":
$arSqlSearch[] = "U.ID='".intval($val)."'";
break;
case "TIMESTAMP_1":
$arSqlSearch[] = "U.TIMESTAMP_X >= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y"),"d.m.Y")."')";
break;
case "TIMESTAMP_2":
$arSqlSearch[] = "U.TIMESTAMP_X <= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y")." 23:59:59","d.m.Y")."')";
break;
case "TIMESTAMP_X_1":
$arSqlSearch[] = "U.TIMESTAMP_X >= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"DD.MM.YYYY HH:MI:SS"),"d.m.Y H:i:s")."')";
break;
case "TIMESTAMP_X_2":
$arSqlSearch[] = "U.TIMESTAMP_X <= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"DD.MM.YYYY HH:MI:SS"),"d.m.Y H:i:s")."')";
break;
case "LAST_LOGIN_1":
$arSqlSearch[] = "U.LAST_LOGIN >= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y"),"d.m.Y")."')";
break;
case "LAST_LOGIN_2":
$arSqlSearch[] = "U.LAST_LOGIN <= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y")." 23:59:59","d.m.Y")."')";
break;
case "LAST_LOGIN":
if ($val === false)
$arSqlSearch[] = "U.LAST_LOGIN IS NULL";
break;
case "!LAST_LOGIN":
if ($val === false)
$arSqlSearch[] = "U.LAST_LOGIN IS NOT NULL";
break;
case "DATE_REGISTER_1":
$arSqlSearch[] = "U.DATE_REGISTER >= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y"),"d.m.Y")."')";
break;
case "DATE_REGISTER_2":
$arSqlSearch[] = "U.DATE_REGISTER <= FROM_UNIXTIME('".MkDateTime(FmtDate($val,"D.M.Y")." 23:59:59","d.m.Y")."')";
break;
case "ACTIVE":
$arSqlSearch[] = ($val=="Y") ? "U.ACTIVE='Y'" : "U.ACTIVE='N'";
break;
case "LOGIN_EQUAL":
$arSqlSearch[] = GetFilterQuery("U.LOGIN", $val, "N");
break;
case "LOGIN":
$arSqlSearch[] = GetFilterQuery("U.LOGIN", $val);
break;
case "EXTERNAL_AUTH_ID":
if($val <> '')
$arSqlSearch[] = "U.EXTERNAL_AUTH_ID='".$DB->ForSQL($val, 255)."'";
else
$arSqlSearch[] = "(U.EXTERNAL_AUTH_ID IS NULL OR U.EXTERNAL_AUTH_ID='')";
break;
case "!EXTERNAL_AUTH_ID":
if (
is_array($val)
&& count($val) > 0
)
{
$strTmp = "";
foreach($val as $authId)
{
if ($authId <> '')
{
$strTmp .= ($strTmp <> '' ? "," : "")."'".$DB->ForSQL($authId, 255)."'";
}
}
if ($strTmp <> '')
{
$arSqlSearch[] = "U.EXTERNAL_AUTH_ID NOT IN (".$strTmp.") OR U.EXTERNAL_AUTH_ID IS NULL";
}
}
elseif (!is_array($val))
{
if($val <> '')
$arSqlSearch[] = "U.EXTERNAL_AUTH_ID <> '".$DB->ForSql($val, 255)."' OR U.EXTERNAL_AUTH_ID IS NULL";
else
$arSqlSearch[] = "(U.EXTERNAL_AUTH_ID IS NOT NULL AND LENGTH(U.EXTERNAL_AUTH_ID) > 0)";
}
break;
case "LOGIN_EQUAL_EXACT":
$arSqlSearch[] = "U.LOGIN='".$DB->ForSql($val)."'";
break;
case "XML_ID":
$arSqlSearch[] = "U.XML_ID='".$DB->ForSql($val)."'";
break;
case "CONFIRM_CODE":
if($val <> '')
$arSqlSearch[] = "U.CONFIRM_CODE='".$DB->ForSql($val)."'";
else
$arSqlSearch[] = "(U.CONFIRM_CODE IS NULL OR LENGTH(U.CONFIRM_CODE) <= 0)";
break;
case "!CONFIRM_CODE":
if($val <> '')
$arSqlSearch[] = "U.CONFIRM_CODE <> '".$DB->ForSql($val)."'";
else
$arSqlSearch[] = "(U.CONFIRM_CODE IS NOT NULL AND LENGTH(U.CONFIRM_CODE) > 0)";
break;
case "COUNTRY_ID":
case "WORK_COUNTRY":
$arSqlSearch[] = "U.WORK_COUNTRY=".intval($val);
break;
case "PERSONAL_COUNTRY":
$arSqlSearch[] = "U.PERSONAL_COUNTRY=".intval($val);
break;
case "NAME":
$arSqlSearch[] = GetFilterQuery("U.NAME, U.LAST_NAME, U.SECOND_NAME", $val);
break;
case "NAME_SEARCH":
$arSqlSearch[] = GetFilterQuery("U.NAME, U.LAST_NAME, U.SECOND_NAME, U.EMAIL, U.LOGIN", $val);
break;
case "EMAIL":
$arSqlSearch[] = GetFilterQuery("U.EMAIL", $val, "Y", array("@","_",".","-"));
break;
case "=EMAIL":
$arSqlSearch[] = "U.EMAIL = '".$DB->ForSQL(trim($val))."'";
break;
case "GROUP_MULTI":
case "GROUPS_ID":
if(is_numeric($val) && intval($val)>0)
$val = array($val);
if(is_array($val) && count($val)>0)
{
$ar = array();
foreach($val as $id)
$ar[intval($id)] = intval($id);
$strJoin .=
" INNER JOIN (SELECT DISTINCT UG.USER_ID FROM b_user_group UG
WHERE UG.GROUP_ID in (".implode(",", $ar).")
and (UG.DATE_ACTIVE_FROM is null or UG.DATE_ACTIVE_FROM <= ".$DB->CurrentTimeFunction().")
and (UG.DATE_ACTIVE_TO is null or UG.DATE_ACTIVE_TO >= ".$DB->CurrentTimeFunction().")
) UG ON UG.USER_ID=U.ID ";
}
break;
case "PERSONAL_BIRTHDATE_1":
$arSqlSearch[] = "U.PERSONAL_BIRTHDATE>=".$DB->CharToDateFunction($val);
break;
case "PERSONAL_BIRTHDATE_2":
$arSqlSearch[] = "U.PERSONAL_BIRTHDATE<=".$DB->CharToDateFunction($val." 23:59:59");
break;
case "PERSONAL_BIRTHDAY_1":
$arSqlSearch[] = "U.PERSONAL_BIRTHDAY>=".$DB->CharToDateFunction($DB->ForSql($val), "SHORT");
break;
case "PERSONAL_BIRTHDAY_2":
$arSqlSearch[] = "U.PERSONAL_BIRTHDAY<=".$DB->CharToDateFunction($DB->ForSql($val), "SHORT");
break;
case "PERSONAL_BIRTHDAY_DATE":
$arSqlSearch[] = "DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%m-%d') = '".$DB->ForSql($val)."'";
break;
case "KEYWORDS":
$arSqlSearch[] = GetFilterQuery(implode(",",$arFields), $val);
break;
case "CHECK_SUBORDINATE":
if(is_array($val))
{
$strSubord = "0";
foreach($val as $grp)
$strSubord .= ",".intval($grp);
if(intval($arFilter["CHECK_SUBORDINATE_AND_OWN"]) > 0)
$arSqlSearch[] = "(U.ID=".intval($arFilter["CHECK_SUBORDINATE_AND_OWN"])." OR NOT EXISTS(SELECT 'x' FROM b_user_group UGS WHERE UGS.USER_ID=U.ID AND UGS.GROUP_ID NOT IN (".$strSubord.")))";
else
$arSqlSearch[] = "NOT EXISTS(SELECT 'x' FROM b_user_group UGS WHERE UGS.USER_ID=U.ID AND UGS.GROUP_ID NOT IN (".$strSubord."))";
}
break;
case "NOT_ADMIN":
if($val !== true)
break;
$arSqlSearch[] = "not exists (SELECT * FROM b_user_group UGNA WHERE UGNA.USER_ID=U.ID AND UGNA.GROUP_ID = 1)";
break;
case "LAST_ACTIVITY":
if ($val === false)
$arSqlSearch[] = "U.LAST_ACTIVITY_DATE IS NULL";
elseif (intval($val)>0)
$arSqlSearch[] = "U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL ".intval($val)." SECOND)";
break;
case "!LAST_ACTIVITY":
if ($val === false)
$arSqlSearch[] = "U.LAST_ACTIVITY_DATE IS NOT NULL";
break;
case "INTRANET_USERS":
$arSqlSearch[] = "U.ACTIVE = 'Y' AND U.LAST_LOGIN IS NOT NULL AND EXISTS(SELECT 'x' FROM b_utm_user UF1, b_user_field F1 WHERE F1.ENTITY_ID = 'USER' AND F1.FIELD_NAME = 'UF_DEPARTMENT' AND UF1.FIELD_ID = F1.ID AND UF1.VALUE_ID = U.ID AND UF1.VALUE_INT IS NOT NULL AND UF1.VALUE_INT <> 0)";
break;
case "IS_REAL_USER":
if($val === true || $val === 'Y')
{
$arSqlSearch[] = "U.EXTERNAL_AUTH_ID NOT IN ('".join("', '", CUser::GetExternalUserTypes())."') OR U.EXTERNAL_AUTH_ID IS NULL";
}
else
{
$arSqlSearch[] = "U.EXTERNAL_AUTH_ID IN ('".join("', '", CUser::GetExternalUserTypes())."')";
}
break;
default:
if(in_array($key, $arFields))
$arSqlSearch[] = GetFilterQuery('U.'.$key, $val, ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set? "N" : "Y"));
}
}
}
$arSqlOrder = array();
foreach ($arOrder as $field => $dir)
{
$field = mb_strtoupper($field);
if(mb_strtolower($dir) <> "asc")
{
$dir = "desc";
if ($bSingleBy)
$order = "desc";
}
if($field == "CURRENT_BIRTHDAY")
{
$cur_year = intval(date('Y'));
$arSqlOrder[$field] = "IF(ISNULL(U.PERSONAL_BIRTHDAY), '9999-99-99', IF (
DATE_FORMAT(U.PERSONAL_BIRTHDAY, '".$cur_year."-%m-%d') < DATE_FORMAT(DATE_ADD(".$DB->CurrentTimeFunction().", INTERVAL ".CTimeZone::GetOffset()." SECOND), '%Y-%m-%d'),
DATE_FORMAT(U.PERSONAL_BIRTHDAY, '".($cur_year + 1)."-%m-%d'),
DATE_FORMAT(U.PERSONAL_BIRTHDAY, '".$cur_year."-%m-%d')
)) ".$dir;
}
elseif($field == "IS_ONLINE")
{
$arSelectFields[$field] = "IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL ".$online_interval." SECOND), 'Y', 'N') IS_ONLINE";
$arSqlOrder[$field] = "IS_ONLINE ".$dir;
}
elseif(in_array($field,$arFields_all))
{
$arSqlOrder[$field] = "U.".$field." ".$dir;
}
elseif($s = $obUserFieldsSql->GetOrder($field))
{
$arSqlOrder[$field] = mb_strtoupper($s)." ".$dir;
}
elseif(preg_match('/^RATING_(d+)$/i', $field, $matches))
{
$ratingId = intval($matches[1]);
if ($ratingId > 0)
{
$arSqlOrder[$field] = $field."_ISNULL ASC, ".$field." ".$dir;
$arParams['SELECT'][] = $field;
}
else
{
$field = "TIMESTAMP_X";
$arSqlOrder[$field] = "U.".$field." ".$dir;
if ($bSingleBy)
$by = mb_strtolower($field);
}
}
elseif ($field == 'FULL_NAME')
{
$arSqlOrder[$field] = sprintf(
"IF(U.LAST_NAME IS NULL OR U.LAST_NAME = '', 1, 0) %1$s,
IF(U.LAST_NAME IS NULL OR U.LAST_NAME = '', 1, U.LAST_NAME) %1$s,
IF(U.NAME IS NULL OR U.NAME = '', 1, 0) %1$s,
IF(U.NAME IS NULL OR U.NAME = '', 1, U.NAME) %1$s,
IF(U.SECOND_NAME IS NULL OR U.SECOND_NAME = '', 1, 0) %1$s,
IF(U.SECOND_NAME IS NULL OR U.SECOND_NAME = '', 1, U.SECOND_NAME) %1$s,
U.LOGIN %1$s", $dir
);
}
}
$userFieldsSelect = $obUserFieldsSql->GetSelect();
$arSqlSearch[] = $obUserFieldsSql->GetFilter();
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
$sSelect = ($obUserFieldsSql->GetDistinct()? "DISTINCT " : "")
.implode(', ',$arSelectFields)."
".$userFieldsSelect."
";
if (is_array($arParams['SELECT']))
{
$arRatingInSelect = array();
foreach ($arParams['SELECT'] as $column)
{
if(preg_match('/^RATING_(d+)$/i', $column, $matches))
{
$ratingId = intval($matches[1]);
if ($ratingId > 0 && !in_array($ratingId, $arRatingInSelect))
{
$sSelect .= ", RR".$ratingId.".CURRENT_POSITION IS NULL as RATING_".$ratingId."_ISNULL";
$sSelect .= ", RR".$ratingId.".CURRENT_VALUE as RATING_".$ratingId;
$sSelect .= ", RR".$ratingId.".CURRENT_VALUE as RATING_".$ratingId."_CURRENT_VALUE";
$sSelect .= ", RR".$ratingId.".PREVIOUS_VALUE as RATING_".$ratingId."_PREVIOUS_VALUE";
$sSelect .= ", RR".$ratingId.".CURRENT_POSITION as RATING_".$ratingId."_CURRENT_POSITION";
$sSelect .= ", RR".$ratingId.".PREVIOUS_POSITION as RATING_".$ratingId."_PREVIOUS_POSITION";
$strJoin .= " LEFT JOIN b_rating_results RR".$ratingId."
ON RR".$ratingId.".RATING_ID=".$ratingId."
and RR".$ratingId.".ENTITY_TYPE_ID = 'USER'
and RR".$ratingId.".ENTITY_ID = U.ID ";
$arRatingInSelect[] = $ratingId;
}
}
}
}
$strFrom = "
FROM
b_user U
".$obUserFieldsSql->GetJoin("U.ID")."
".$strJoin."
WHERE
".$strSqlSearch."
";
$strSqlOrder = '';
if (!empty($arSqlOrder))
$strSqlOrder = 'ORDER BY '.implode(', ', $arSqlOrder);
$strSql = "SELECT ".$sSelect.$strFrom.$strSqlOrder;
if(array_key_exists("NAV_PARAMS", $arParams) && is_array($arParams["NAV_PARAMS"]))
{
$nTopCount = intval($arParams['NAV_PARAMS']['nTopCount']);
if($nTopCount > 0)
{
$strSql = $DB->TopSql($strSql, $nTopCount);
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
if($userFieldsSelect <> '')
$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("USER"));
}
else
{
$res_cnt = $DB->Query("SELECT COUNT(".($obUserFieldsSql->GetDistinct()? "DISTINCT ":"")."U.ID) as C ".$strFrom);
$res_cnt = $res_cnt->Fetch();
$res = new CDBResult();
if($userFieldsSelect <> '')
$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("USER"));
$res->NavQuery($strSql, $res_cnt["C"], $arParams["NAV_PARAMS"]);
}
}
else
{
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
if($userFieldsSelect <> '')
$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("USER"));
}
$res->is_filtered = IsFiltered($strSqlSearch);
return $res;
}