PageRenderTime 50ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/main/admin/user_admin.php

https://gitlab.com/alexprowars/bitrix
PHP | 839 lines | 739 code | 81 blank | 19 comment | 120 complexity | 4e8894f4e1bcc792db70efda08c07cbb MD5 | raw file
  1. <?
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage main
  6. * @copyright 2001-2013 Bitrix
  7. */
  8. /**
  9. * Bitrix vars
  10. * @global CUser $USER
  11. * @global CMain $APPLICATION
  12. * @global CDatabase $DB
  13. * @global CUserTypeManager $USER_FIELD_MANAGER
  14. * @global string $by
  15. * @global string $order
  16. */
  17. require_once(dirname(__FILE__)."/../include/prolog_admin_before.php");
  18. require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/prolog.php");
  19. define("HELP_FILE", "users/user_admin.php");
  20. $entity_id = "USER";
  21. if(!($USER->CanDoOperation('view_subordinate_users') || $USER->CanDoOperation('view_all_users') || $USER->CanDoOperation('edit_all_users') || $USER->CanDoOperation('edit_subordinate_users')))
  22. $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
  23. use Bitrix\Main\ORM\Fields\Relations\Reference;
  24. use Bitrix\Main\ORM\Query\Join;
  25. use Bitrix\Main\UserTable;
  26. use Bitrix\Main\UserGroupTable;
  27. use Bitrix\Main\Entity\Query;
  28. use Bitrix\Main\DB\SqlExpression;
  29. use Bitrix\Main\Entity\ExpressionField;
  30. use Bitrix\Main\Text\HtmlFilter;
  31. use Bitrix\Main\Type\DateTime;
  32. IncludeModuleLangFile(__FILE__);
  33. //authorize as user
  34. if($_REQUEST["action"] == "authorize" && check_bitrix_sessid() && $USER->CanDoOperation('edit_php'))
  35. {
  36. $USER->Logout();
  37. $USER->Authorize(intval($_REQUEST["ID"]), false, true, null, false);
  38. LocalRedirect("user_admin.php?lang=".LANGUAGE_ID);
  39. }
  40. //logout user
  41. if($_REQUEST["action"] == "logout_user" && check_bitrix_sessid() && $USER->CanDoOperation('edit_php'))
  42. {
  43. \Bitrix\Main\UserAuthActionTable::addLogoutAction($_REQUEST["ID"]);
  44. LocalRedirect("user_admin.php?lang=".LANGUAGE_ID);
  45. }
  46. $sTableID = "tbl_user";
  47. $excelMode = ($_REQUEST["mode"] == "excel");
  48. $oSort = new CAdminUiSorting($sTableID, "ID", "desc");
  49. $lAdmin = new CAdminUiList($sTableID, $oSort);
  50. $bIntranetEdition = IsModuleInstalled("intranet");//(defined("INTRANET_EDITION") && INTRANET_EDITION == "Y");
  51. /* Prepare data for new filter */
  52. $queryObject = CGroup::GetDropDownList("AND ID!=2");
  53. $listGroup = array();
  54. while($group = $queryObject->fetch())
  55. $listGroup[$group["REFERENCE_ID"]] = $group["REFERENCE"];
  56. $filterFields = array(
  57. array(
  58. "id" => "ID",
  59. "name" => GetMessage("MAIN_USER_ADMIN_FIELD_ID"),
  60. "filterable" => "",
  61. "default" => true
  62. ),
  63. array(
  64. "id" => "TIMESTAMP_1",
  65. "name" => GetMessage("MAIN_F_TIMESTAMP"),
  66. "type" => "date",
  67. ),
  68. array(
  69. "id" => "LAST_LOGIN_1",
  70. "name" => GetMessage("MAIN_F_LAST_LOGIN"),
  71. "type" => "date",
  72. ),
  73. array(
  74. "id" => "ACTIVE",
  75. "name" => GetMessage("F_ACTIVE"),
  76. "type" => "list",
  77. "items" => array(
  78. "Y" => GetMessage("MAIN_YES"),
  79. "N" => GetMessage("MAIN_NO")
  80. ),
  81. "filterable" => ""
  82. ),
  83. array(
  84. "id" => "LOGIN",
  85. "name" => GetMessage("F_LOGIN"),
  86. "filterable" => "%",
  87. "default" => true
  88. ),
  89. array(
  90. "id" => "EMAIL",
  91. "name" => GetMessage("MAIN_F_EMAIL"),
  92. "filterable" => "%",
  93. "default" => true
  94. ),
  95. array(
  96. "id" => "NAME",
  97. "name" => GetMessage("F_NAME"),
  98. "filterable" => "",
  99. "default" => true
  100. ),
  101. array(
  102. "id" => "KEYWORDS",
  103. "name" => GetMessage("MAIN_F_KEYWORDS"),
  104. "filterable" => ""
  105. ),
  106. array(
  107. "id" => "GROUPS_ID",
  108. "name" => GetMessage("F_GROUP"),
  109. "type" => "list",
  110. "items" => $listGroup,
  111. "params" => array("multiple" => "Y"),
  112. "filterable" => ""
  113. ),
  114. array(
  115. "id" => "PERSONAL_BIRTHDAY",
  116. "name" => GetMessage("PERSONAL_BIRTHDAY"),
  117. "type" => "date",
  118. ),
  119. );
  120. if ($bIntranetEdition)
  121. {
  122. $filterFields[] = array(
  123. "id" => "INTRANET_USERS",
  124. "name" => GetMessage("F_FIND_INTRANET_USERS"),
  125. "type" => "list",
  126. "items" => array(
  127. "" => GetMessage("MAIN_ALL"),
  128. "Y" => GetMessage("MAIN_YES")
  129. ),
  130. "filterable" => ""
  131. );
  132. }
  133. $USER_FIELD_MANAGER->AdminListAddFilterFieldsV2($entity_id, $filterFields);
  134. $arFilter = array();
  135. $lAdmin->AddFilter($filterFields, $arFilter);
  136. $USER_FIELD_MANAGER->AdminListAddFilterV2($entity_id, $arFilter, $sTableID, $filterFields);
  137. $arUserSubordinateGroups = array();
  138. if(!$USER->CanDoOperation('edit_all_users') && !$USER->CanDoOperation('view_all_users'))
  139. {
  140. $arUserGroups = CUser::GetUserGroup($USER->GetID());
  141. for ($j = 0, $len = count($arUserGroups); $j < $len; $j++)
  142. {
  143. $arSubordinateGroups = CGroup::GetSubordinateGroups($arUserGroups[$j]);
  144. $arUserSubordinateGroups = array_merge ($arUserSubordinateGroups, $arSubordinateGroups);
  145. }
  146. $arUserSubordinateGroups = array_unique($arUserSubordinateGroups);
  147. $arFilter["CHECK_SUBORDINATE"] = $arUserSubordinateGroups;
  148. if($USER->CanDoOperation('edit_own_profile'))
  149. $arFilter["CHECK_SUBORDINATE_AND_OWN"] = $USER->GetID();
  150. }
  151. if (!$USER->CanDoOperation('edit_php'))
  152. {
  153. $arFilter["NOT_ADMIN"] = true;
  154. }
  155. if($lAdmin->EditAction())
  156. {
  157. $editableFields = array(
  158. "ACTIVE"=>1, "BLOCKED"=>1, "LOGIN"=>1, "TITLE"=>1, "NAME"=>1, "LAST_NAME"=>1, "SECOND_NAME"=>1, "EMAIL"=>1, "PERSONAL_PROFESSION"=>1,
  159. "PERSONAL_WWW"=>1, "PERSONAL_ICQ"=>1, "PERSONAL_GENDER"=>1, "PERSONAL_PHONE"=>1, "PERSONAL_MOBILE"=>1,
  160. "PERSONAL_CITY"=>1, "PERSONAL_STREET"=>1, "WORK_COMPANY"=>1, "WORK_DEPARTMENT"=>1, "WORK_POSITION"=>1,
  161. "WORK_WWW"=>1, "WORK_PHONE"=>1, "WORK_CITY"=>1, "XML_ID"=>1,
  162. );
  163. foreach($_POST["FIELDS"] as $ID => $arFields)
  164. {
  165. $ID = intval($ID);
  166. if(!$USER->IsAdmin())
  167. {
  168. $UGroups = CUser::GetUserGroup($ID);
  169. if(in_array(1, $UGroups)) // not admin can't edit admins
  170. {
  171. continue;
  172. }
  173. elseif($USER->CanDoOperation('edit_subordinate_users'))
  174. {
  175. if(count(array_diff($UGroups, $arUserSubordinateGroups)) > 0)
  176. continue;
  177. }
  178. elseif($USER->CanDoOperation('edit_own_profile'))
  179. {
  180. if($USER->GetParam("USER_ID") != $ID)
  181. continue;
  182. }
  183. else
  184. {
  185. continue;
  186. }
  187. }
  188. if(!$lAdmin->IsUpdated($ID))
  189. continue;
  190. foreach($arFields as $key => $field)
  191. {
  192. if(!isset($editableFields[$key]) && strpos($key, "UF_") !== 0)
  193. {
  194. unset($arFields[$key]);
  195. }
  196. }
  197. $USER_FIELD_MANAGER->AdminListPrepareFields($entity_id, $arFields);
  198. $DB->StartTransaction();
  199. $ob = new CUser;
  200. if(!$ob->Update($ID, $arFields))
  201. {
  202. $lAdmin->AddUpdateError(GetMessage("SAVE_ERROR").$ID.": ".$ob->LAST_ERROR, $ID);
  203. $DB->Rollback();
  204. }
  205. $DB->Commit();
  206. }
  207. }
  208. if(($arID = $lAdmin->GroupAction()) && ($USER->CanDoOperation('edit_all_users') || $USER->CanDoOperation('edit_subordinate_users')))
  209. {
  210. if (!empty($_REQUEST["action_all_rows_".$sTableID]) && $_REQUEST["action_all_rows_".$sTableID] === "Y")
  211. {
  212. $userQuery = getUserQuery($lAdmin, $arFilter, $filterFields, $excelMode, $sTableID);
  213. $result = $userQuery->exec();
  214. $arID = [];
  215. while ($userData = $result->fetch())
  216. {
  217. $arID[] = $userData['ID'];
  218. }
  219. }
  220. $gr_id = intval($_REQUEST['groups']);
  221. $struct_id = intval($_REQUEST['UF_DEPARTMENT']);
  222. foreach($arID as $ID)
  223. {
  224. $ID = intval($ID);
  225. if($ID <= 1)
  226. continue;
  227. $arGroups = array();
  228. $res = CUser::GetUserGroupList($ID);
  229. while($res_arr = $res->Fetch())
  230. $arGroups[intval($res_arr["GROUP_ID"])] = array("GROUP_ID"=>$res_arr["GROUP_ID"], "DATE_ACTIVE_FROM"=>$res_arr["DATE_ACTIVE_FROM"], "DATE_ACTIVE_TO"=>$res_arr["DATE_ACTIVE_TO"]);
  231. if(isset($arGroups[1]) && !$USER->CanDoOperation('edit_php')) // not admin can't edit admins
  232. continue;
  233. if(!$USER->CanDoOperation('edit_all_users') && $USER->CanDoOperation('edit_subordinate_users') && count(array_diff(array_keys($arGroups), $arUserSubordinateGroups))>0)
  234. continue;
  235. switch($_REQUEST['action'])
  236. {
  237. case "delete":
  238. @set_time_limit(0);
  239. $DB->StartTransaction();
  240. if(!CUser::Delete($ID))
  241. {
  242. $DB->Rollback();
  243. $err = '';
  244. if($ex = $APPLICATION->GetException())
  245. $err = '<br>'.$ex->GetString();
  246. $lAdmin->AddGroupError(GetMessage("DELETE_ERROR").$err, $ID);
  247. }
  248. $DB->Commit();
  249. break;
  250. case "activate":
  251. case "deactivate":
  252. $ob = new CUser();
  253. $arFields = Array("ACTIVE"=>($_REQUEST['action']=="activate"?"Y":"N"));
  254. if(!$ob->Update($ID, $arFields))
  255. $lAdmin->AddGroupError(GetMessage("MAIN_EDIT_ERROR").$ob->LAST_ERROR, $ID);
  256. break;
  257. case "add_group":
  258. case "remove_group":
  259. if($gr_id <= 0)
  260. break;
  261. if($gr_id == 1 && !$USER->CanDoOperation('edit_php')) // not admin can't edit admins
  262. break;
  263. if ($USER->CanDoOperation('edit_subordinate_users') && !$USER->CanDoOperation('edit_all_users') && !in_array($gr_id, $arUserSubordinateGroups))
  264. break;
  265. if($_REQUEST['action'] == "add_group")
  266. $arGroups[$gr_id] = array("GROUP_ID" => $gr_id);
  267. else
  268. unset($arGroups[$gr_id]);
  269. CUser::SetUserGroup($ID, $arGroups);
  270. break;
  271. case "add_structure":
  272. case "remove_structure":
  273. if($struct_id <= 0)
  274. break;
  275. $dbUser = CUser::GetByID($ID);
  276. $arUser = $dbUser->Fetch();
  277. $arDep = $arUser['UF_DEPARTMENT'];
  278. if(!is_array($arDep))
  279. $arDep = array();
  280. if($_REQUEST['action']=="add_structure")
  281. $arDep[] = $struct_id;
  282. else
  283. $arDep = array_diff($arDep, array($struct_id));
  284. $ob = new CUser();
  285. $arFields = Array("UF_DEPARTMENT"=>$arDep);
  286. if(!$ob->Update($ID, $arFields))
  287. $lAdmin->AddGroupError(GetMessage("MAIN_EDIT_ERROR").$ob->LAST_ERROR, $ID);
  288. break;
  289. case "intranet_deactivate":
  290. $ob = new CUser();
  291. $arFields = Array("LAST_LOGIN"=>false);
  292. if(!$ob->Update($ID, $arFields))
  293. $lAdmin->AddGroupError(GetMessage("MAIN_EDIT_ERROR").$ob->LAST_ERROR, $ID);
  294. break;
  295. }
  296. }
  297. if ($lAdmin->hasGroupErrors())
  298. {
  299. $adminSidePanelHelper->sendJsonErrorResponse($lAdmin->getGroupErrors());
  300. }
  301. else
  302. {
  303. $adminSidePanelHelper->sendSuccessResponse();
  304. }
  305. }
  306. setHeaderColumn($lAdmin);
  307. $nav = $lAdmin->getPageNavigation("pages-user-admin");
  308. $userQuery = getUserQuery($lAdmin, $arFilter, $filterFields, $excelMode, $sTableID, $nav);
  309. $result = $userQuery->exec();
  310. $totalCountRequest = $lAdmin->isTotalCountRequest();
  311. if ($totalCountRequest)
  312. {
  313. $lAdmin->sendTotalCountResponse($result->getCount());
  314. }
  315. $edit = ($USER->canDoOperation('edit_subordinate_users') || $USER->canDoOperation('edit_all_users'));
  316. $n = 0;
  317. $pageSize = $lAdmin->getNavSize();
  318. while ($userData = $result->fetch())
  319. {
  320. $n++;
  321. if ($n > $pageSize && !$excelMode)
  322. {
  323. break;
  324. }
  325. $userId = $userData["ID"];
  326. $userEditUrl = "user_edit.php?lang=".LANGUAGE_ID."&ID=".$userId;
  327. $row =& $lAdmin->addRow($userId, $userData, $userEditUrl);
  328. $USER_FIELD_MANAGER->addUserFields($entity_id, $userData, $row);
  329. $row->addViewField("ID", "<a href='".$userEditUrl."' title='".GetMessage("MAIN_EDIT_TITLE")."'>".$userId."</a>");
  330. $own_edit = ($USER->canDoOperation('edit_own_profile') && ($USER->getParam("USER_ID") == $userId));
  331. $can_edit = (intval($userId) > 1 && ($own_edit || $edit));
  332. if ($userId == 1 || $own_edit || !$can_edit)
  333. {
  334. $row->addCheckField("ACTIVE", false);
  335. $row->addCheckField("BLOCKED", false);
  336. }
  337. else
  338. {
  339. $row->addCheckField("ACTIVE");
  340. $row->addCheckField("BLOCKED");
  341. }
  342. if ($can_edit && $edit)
  343. {
  344. $row->addField("LOGIN", "<a href='user_edit.php?lang=".LANGUAGE_ID."&ID=".$userId.
  345. "' title='".GetMessage("MAIN_EDIT_TITLE")."'>".HtmlFilter::encode($userData["LOGIN"])."</a>", true);
  346. $row->addInputField("TITLE");
  347. $row->addInputField("NAME");
  348. $row->addInputField("LAST_NAME");
  349. $row->addInputField("SECOND_NAME");
  350. $row->addViewField("EMAIL", TxtToHtml($userData["EMAIL"]));
  351. $row->addInputField("EMAIL");
  352. $row->addInputField("PERSONAL_PROFESSION");
  353. $row->addViewField("PERSONAL_WWW", TxtToHtml($userData["PERSONAL_WWW"]));
  354. $row->addInputField("PERSONAL_WWW");
  355. $row->addInputField("PERSONAL_ICQ");
  356. $row->addSelectField("PERSONAL_GENDER", array(
  357. "" => GetMessage("USER_DONT_KNOW"),
  358. "M" => GetMessage("USER_MALE"),
  359. "F" => GetMessage("USER_FEMALE"),
  360. ));
  361. $row->addInputField("PERSONAL_PHONE");
  362. $row->addInputField("PERSONAL_MOBILE");
  363. $row->addInputField("PERSONAL_CITY");
  364. $row->addInputField("PERSONAL_STREET");
  365. $row->addInputField("WORK_COMPANY");
  366. $row->addInputField("WORK_DEPARTMENT");
  367. $row->addInputField("WORK_POSITION");
  368. $row->addViewField("WORK_WWW", TxtToHtml($userData["WORK_WWW"]));
  369. $row->addInputField("WORK_WWW");
  370. $row->addInputField("WORK_PHONE");
  371. $row->addInputField("WORK_CITY");
  372. $row->addInputField("XML_ID");
  373. }
  374. else
  375. {
  376. $row->addViewField("LOGIN", "<a href='user_edit.php?lang=".LANGUAGE_ID."&ID=".$userId.
  377. "' title='".GetMessage("MAIN_EDIT_TITLE")."'>".HtmlFilter::encode($userData["LOGIN"])."</a>");
  378. $row->addViewField("EMAIL", TxtToHtml($userData["EMAIL"]));
  379. $row->addViewField("PERSONAL_WWW", TxtToHtml($userData["PERSONAL_WWW"]));
  380. $row->addViewField("WORK_WWW", TxtToHtml($userData["WORK_WWW"]));
  381. }
  382. $arActions = array();
  383. $arActions[] = array(
  384. "ICON" => $can_edit ? "edit" : "view",
  385. "TEXT" => GetMessage($can_edit ? "MAIN_ADMIN_MENU_EDIT" : "MAIN_ADMIN_MENU_VIEW"),
  386. "LINK" => "user_edit.php?lang=".LANGUAGE_ID."&ID=".$userId, "DEFAULT" => true
  387. );
  388. if ($can_edit && $edit)
  389. {
  390. $arActions[] = array(
  391. "ICON" => "copy",
  392. "TEXT" => GetMessage("MAIN_ADMIN_ADD_COPY"),
  393. "LINK" => "user_edit.php?lang=".LANGUAGE_ID."&COPY_ID=".$userId
  394. );
  395. if (!$own_edit)
  396. {
  397. $arActions[] = array(
  398. "ICON" => "delete",
  399. "TEXT" => GetMessage("MAIN_ADMIN_MENU_DELETE"),
  400. "ACTION" => "if(confirm('".GetMessage('CONFIRM_DEL_USER')."')) ".$lAdmin->actionDoGroup($userId, "delete")
  401. );
  402. }
  403. }
  404. if($USER->CanDoOperation('edit_php'))
  405. {
  406. $arActions[] = array("SEPARATOR"=>true);
  407. $arActions[] = array(
  408. "ICON" => "",
  409. "TEXT" => GetMessage("MAIN_ADMIN_AUTH"),
  410. "TITLE" => GetMessage("MAIN_ADMIN_AUTH_TITLE"),
  411. "LINK" => "user_admin.php?lang=".LANGUAGE_ID."&ID=".$userId."&action=authorize&".bitrix_sessid_get()
  412. );
  413. $arActions[] = array(
  414. "ICON" => "",
  415. "TEXT" => GetMessage("main_user_admin_logout"),
  416. "TITLE" => GetMessage("main_user_admin_logout_title"),
  417. "LINK" => "user_admin.php?lang=".LANGUAGE_ID."&ID=".$userId."&action=logout_user&".bitrix_sessid_get()
  418. );
  419. }
  420. $row->addActions($arActions);
  421. }
  422. $nav->setRecordCount($nav->getOffset() + $n);
  423. $lAdmin->setNavigation($nav, GetMessage("MAIN_USER_ADMIN_PAGES"), false);
  424. $aContext = Array();
  425. if ($USER->CanDoOperation('edit_subordinate_users') || $USER->CanDoOperation('edit_all_users'))
  426. {
  427. $sGr = array();
  428. foreach($listGroup as $referenceId => $reference)
  429. $sGr[] = array("NAME" => $reference, "VALUE" => $referenceId);
  430. $ar = Array(
  431. "edit" => true,
  432. "delete" => true,
  433. "for_all" => true,
  434. "activate" => GetMessage("MAIN_ADMIN_LIST_ACTIVATE"),
  435. "deactivate" => GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"),
  436. "add_group" => array(
  437. "lable" => GetMessage("MAIN_ADMIN_LIST_ADD_GROUP"),
  438. "type" => "select",
  439. "name" => "groups",
  440. "items" => $sGr
  441. ),
  442. "remove_group"=>array(
  443. "lable" => GetMessage("MAIN_ADMIN_LIST_REM_GROUP"),
  444. "type" => "select",
  445. "name" => "groups",
  446. "items" => $sGr
  447. )
  448. );
  449. //for Intranet editions: structure group operations and last authorization time
  450. if($bIntranetEdition)
  451. {
  452. $arUserFields = $USER_FIELD_MANAGER->GetUserFields('USER', 0, LANGUAGE_ID);
  453. $arUserField = $arUserFields['UF_DEPARTMENT'];
  454. if(is_array($arUserField))
  455. {
  456. $arUserField['MULTIPLE'] = 'N';
  457. $arUserField['SETTINGS']['LIST_HEIGHT'] = 1;
  458. $sStruct = call_user_func_array(
  459. array($arUserField["USER_TYPE"]["CLASS_NAME"], "GetGroupActionData"),
  460. array(
  461. $arUserField,
  462. array(
  463. "NAME" => $arUserField["FIELD_NAME"],
  464. "VALUE" => "",
  465. ),
  466. )
  467. );
  468. $ar["add_structure"] = array(
  469. "lable" => GetMessage("MAIN_ADMIN_LIST_ADD_STRUCT"),
  470. "type" => "select",
  471. "name" => "UF_DEPARTMENT",
  472. "items" => $sStruct
  473. );
  474. $ar["remove_structure"] = array(
  475. "lable" => GetMessage("MAIN_ADMIN_LIST_REM_STRUCT"),
  476. "type" => "select",
  477. "name" => "UF_DEPARTMENT",
  478. "items" => $sStruct
  479. );
  480. }
  481. $ar["intranet_deactivate"] = GetMessage("MAIN_ADMIN_LIST_INTRANET_DEACTIVATE");
  482. }
  483. $arParams = array("select_onchange"=>"document.getElementById('bx_user_groups').style.display = (this.value == 'add_group' || this.value == 'remove_group'? 'block':'none');".(isset($ar["structure"])? "document.getElementById('bx_user_structure').style.display = (this.value == 'add_structure' || this.value == 'remove_structure'? 'block':'none');":""));
  484. $lAdmin->AddGroupActionTable($ar, $arParams);
  485. $aContext[] = array(
  486. "TEXT" => GetMessage("MAIN_ADD_USER"),
  487. "LINK" => "user_edit.php?lang=".LANGUAGE_ID,
  488. "TITLE" => GetMessage("MAIN_ADD_USER_TITLE"),
  489. "ICON" => "btn_new"
  490. );
  491. }
  492. $lAdmin->AddAdminContextMenu($aContext);
  493. $lAdmin->CheckListMode();
  494. $APPLICATION->SetTitle(GetMessage("TITLE"));
  495. require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_admin_after.php");
  496. $lAdmin->DisplayFilter($filterFields);
  497. $lAdmin->DisplayList(["SHOW_COUNT_HTML" => true]);
  498. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
  499. function setHeaderColumn(CAdminUiList $lAdmin)
  500. {
  501. $arHeaders = array(
  502. array("id"=>"LOGIN", "content"=>GetMessage("LOGIN"), "sort"=>"login", "default"=>true),
  503. array("id"=>"ACTIVE", "content"=>GetMessage('ACTIVE'), "sort"=>"active", "default"=>true, "align" => "center"),
  504. array("id"=>"BLOCKED", "content"=>GetMessage("main_user_admin_blocked"), "sort"=>"blocked", "default"=>false, "align" => "center"),
  505. array("id"=>"TIMESTAMP_X", "content"=>GetMessage('TIMESTAMP'), "sort"=>"timestamp_x", "default"=>true),
  506. array("id"=>"TITLE", "content"=>GetMessage("USER_ADMIN_TITLE"), "sort"=>"title"),
  507. array("id"=>"NAME", "content"=>GetMessage("NAME"), "sort"=>"name", "default"=>true),
  508. array("id"=>"LAST_NAME", "content"=>GetMessage("LAST_NAME"), "sort"=>"last_name", "default"=>true),
  509. array("id"=>"SECOND_NAME", "content"=>GetMessage("SECOND_NAME"), "sort"=>"second_name"),
  510. array("id"=>"EMAIL", "content"=>GetMessage('EMAIL'), "sort"=>"email", "default"=>true),
  511. array("id"=>"LAST_LOGIN", "content"=>GetMessage("LAST_LOGIN"), "sort"=>"last_login", "default"=>true),
  512. array("id"=>"DATE_REGISTER", "content"=>GetMessage("DATE_REGISTER"), "sort"=>"date_register"),
  513. array("id"=>"ID", "content"=>"ID", "sort"=>"id", "default"=>true, "align"=>"right"),
  514. array("id"=>"PERSONAL_BIRTHDAY", "content"=>GetMessage("PERSONAL_BIRTHDAY"), "sort"=>"personal_birthday"),
  515. array("id"=>"PERSONAL_PROFESSION", "content"=>GetMessage("PERSONAL_PROFESSION"), "sort"=>"personal_profession"),
  516. array("id"=>"PERSONAL_WWW", "content"=>GetMessage("PERSONAL_WWW"), "sort"=>"personal_www"),
  517. array("id"=>"PERSONAL_ICQ", "content"=>GetMessage("PERSONAL_ICQ"), "sort"=>"personal_icq"),
  518. array("id"=>"PERSONAL_GENDER", "content"=>GetMessage("PERSONAL_GENDER"), "sort"=>"personal_gender"),
  519. array("id"=>"PERSONAL_PHONE", "content"=>GetMessage("PERSONAL_PHONE"), "sort"=>"personal_phone"),
  520. array("id"=>"PERSONAL_MOBILE", "content"=>GetMessage("PERSONAL_MOBILE"), "sort"=>"personal_mobile"),
  521. array("id"=>"PERSONAL_CITY", "content"=>GetMessage("PERSONAL_CITY"), "sort"=>"personal_city"),
  522. array("id"=>"PERSONAL_STREET", "content"=>GetMessage("PERSONAL_STREET"), "sort"=>"personal_street"),
  523. array("id"=>"WORK_COMPANY", "content"=>GetMessage("WORK_COMPANY"), "sort"=>"work_company"),
  524. array("id"=>"WORK_DEPARTMENT", "content"=>GetMessage("WORK_DEPARTMENT"), "sort"=>"work_department"),
  525. array("id"=>"WORK_POSITION", "content"=>GetMessage("WORK_POSITION"), "sort"=>"work_position"),
  526. array("id"=>"WORK_WWW", "content"=>GetMessage("WORK_WWW"), "sort"=>"work_www"),
  527. array("id"=>"WORK_PHONE", "content"=>GetMessage("WORK_PHONE"), "sort"=>"work_phone"),
  528. array("id"=>"WORK_CITY", "content"=>GetMessage("WORK_CITY"), "sort"=>"work_city"),
  529. array("id"=>"XML_ID", "content"=>GetMessage("XML_ID"), "sort"=>"xml_id"),
  530. array("id"=>"EXTERNAL_AUTH_ID", "content"=>GetMessage("EXTERNAL_AUTH_ID")),
  531. );
  532. setRatingHeadersColumn($arHeaders);
  533. setUFHeadersColumn($arHeaders);
  534. $lAdmin->addHeaders($arHeaders);
  535. }
  536. function setRatingHeadersColumn(&$arHeaders)
  537. {
  538. $rsRatings = CRatings::GetList(array('ID' => 'ASC'), array('ACTIVE' => 'Y', 'ENTITY_ID' => 'USER'));
  539. while ($arRatingsTmp = $rsRatings->GetNext())
  540. {
  541. $ratingId = $arRatingsTmp['ID'];
  542. $arHeaders[] = array(
  543. "id" => "RATING_".$ratingId,
  544. "content" => htmlspecialcharsbx($arRatingsTmp['NAME']),
  545. "sort" => "RATING_".$ratingId
  546. );
  547. }
  548. }
  549. function setUFHeadersColumn(&$arHeaders)
  550. {
  551. global $USER_FIELD_MANAGER;
  552. $USER_FIELD_MANAGER->adminListAddHeaders("USER", $arHeaders);
  553. }
  554. function getUserQuery(CAdminUiList $lAdmin, $arFilter, $filterFields, $excelMode, $tableId, $nav = null)
  555. {
  556. global $by, $order;
  557. $totalCountRequest = $lAdmin->isTotalCountRequest();
  558. $userQuery = new Query(UserTable::getEntity());
  559. $listSelectFields = ($totalCountRequest ? [] : $lAdmin->getVisibleHeaderColumns());
  560. if (!in_array("ID", $listSelectFields))
  561. $listSelectFields[] = "ID";
  562. $listRatingColumn = preg_grep('/^RATING_(\d+)$/i', $listSelectFields);
  563. if (!empty($listRatingColumn))
  564. $listSelectFields = array_diff($listSelectFields, $listRatingColumn);
  565. $userQuery->setSelect($listSelectFields);
  566. $sortBy = strtoupper($by);
  567. if(!UserTable::getEntity()->hasField($sortBy))
  568. {
  569. $sortBy = "ID";
  570. }
  571. $sortOrder = strtoupper($order);
  572. if($sortOrder <> "DESC" && $sortOrder <> "ASC")
  573. {
  574. $sortOrder = "DESC";
  575. }
  576. $userQuery->setOrder(array($sortBy => $sortOrder));
  577. if ($totalCountRequest)
  578. {
  579. $userQuery->countTotal(true);
  580. }
  581. if ($nav instanceof Bitrix\Main\UI\PageNavigation)
  582. {
  583. $userQuery->setOffset($nav->getOffset());
  584. if (!$excelMode)
  585. $userQuery->setLimit($nav->getLimit() + 1);
  586. }
  587. $filterOption = new Bitrix\Main\UI\Filter\Options($tableId);
  588. $filterData = $filterOption->getFilter($filterFields);
  589. if (!empty($filterData["FIND"]))
  590. {
  591. $userQuery->setFilter(\Bitrix\Main\UserUtils::getAdminSearchFilter(array("FIND" => $filterData["FIND"])));
  592. }
  593. foreach ($listRatingColumn as $ratingColumn)
  594. {
  595. if (preg_match('/^RATING_(\d+)$/i', $ratingColumn, $matches))
  596. {
  597. $ratingId = intval($matches[1]);
  598. $userQuery->registerRuntimeField("RR".$ratingId, array(
  599. "data_type" => "Bitrix\Main\Rating\ResultsTable",
  600. "reference" => array(
  601. "=this.ID" => "ref.ENTITY_ID",
  602. "ref.ENTITY_TYPE_ID" => new SqlExpression("'USER'"),
  603. "ref.RATING_ID" => new SqlExpression('?i', $ratingId)
  604. ),
  605. "join_type" => "LEFT"
  606. ));
  607. $userQuery->addSelect("RR".$ratingId.".CURRENT_VALUE", "RATING_".$ratingId);
  608. }
  609. }
  610. if (isset($arFilter["NAME"]))
  611. {
  612. $listFields = array("NAME", "LAST_NAME", "SECOND_NAME");
  613. $nameWords = $arFilter["NAME"];
  614. $filterQueryObject = new CFilterQuery("and", "yes", "N", array(), "N", "Y", "N");
  615. $nameWords = $filterQueryObject->CutKav($nameWords);
  616. $nameWords = $filterQueryObject->ParseQ($nameWords);
  617. if ($nameWords <> '' && $nameWords !== "( )")
  618. $parsedNameWords = preg_split('/[&&(||)]/', $nameWords, -1, PREG_SPLIT_NO_EMPTY);
  619. $filterOr = Query::filter()->logic("or");
  620. foreach ($listFields as $fieldId)
  621. {
  622. foreach ($parsedNameWords as $nameWord)
  623. {
  624. $nameWord = trim($nameWord);
  625. if ($nameWord)
  626. {
  627. $filterOr->where(Query::filter()
  628. ->whereLike($fieldId, "%".$nameWord."%")
  629. );
  630. }
  631. }
  632. }
  633. $userQuery->where($filterOr);
  634. }
  635. if (isset($arFilter["CHECK_SUBORDINATE"]) && is_array($arFilter["CHECK_SUBORDINATE"]))
  636. {
  637. $strSubord = "0";
  638. foreach($arFilter["CHECK_SUBORDINATE"] as $grp)
  639. $strSubord .= ",".intval($grp);
  640. $userGroupQuery = UserGroupTable::query();
  641. $userGroupQuery->whereNotIn("GROUP_ID", new SqlExpression($strSubord));
  642. $userGroupQuery->where("USER_ID", new SqlExpression("%s"));
  643. $userQuery->registerRuntimeField(
  644. new ExpressionField("UGS", "EXISTS(".$userGroupQuery->getQuery().")", "ID"));
  645. if ($arFilter["CHECK_SUBORDINATE_AND_OWN"] > 0)
  646. {
  647. $userQuery->where(Query::filter()->logic("or")
  648. ->where("ID", $arFilter["CHECK_SUBORDINATE_AND_OWN"])->whereNot("UGS"));
  649. }
  650. else
  651. {
  652. $userQuery->whereNot("UGS");
  653. }
  654. }
  655. if ($arFilter["NOT_ADMIN"])
  656. {
  657. $userGroupQuery = UserGroupTable::query();
  658. $userGroupQuery->addSelect("USER_ID");
  659. $userGroupQuery->setGroup(["USER_ID"]);
  660. $userGroupQuery = \Bitrix\Main\ORM\Entity::getInstanceByQuery($userGroupQuery);
  661. $userQuery->registerRuntimeField("",
  662. (new Reference("UGNA", $userGroupQuery, Join::on("this.ID", "ref.USER_ID")))->configureJoinType("inner")
  663. );
  664. }
  665. if ($arFilter["INTRANET_USERS"] === "Y")
  666. {
  667. $userQuery->where("ACTIVE", "Y");
  668. $userQuery->whereNotNull("LAST_LOGIN");
  669. $userQuery->where("UF_DEPARTMENT_SINGLE", ">", "0");
  670. $userQuery->disableDataDoubling();
  671. }
  672. if (isset($arFilter["TIMESTAMP_1"]))
  673. {
  674. $userQuery->where("TIMESTAMP_X", ">=", new DateTime($arFilter["TIMESTAMP_1"]));
  675. }
  676. if (isset($arFilter["TIMESTAMP_2"]))
  677. {
  678. $userQuery->where("TIMESTAMP_X", "<=", new DateTime($arFilter["TIMESTAMP_2"]));
  679. }
  680. if (isset($arFilter["LAST_LOGIN_1"]))
  681. {
  682. $userQuery->where("LAST_LOGIN", ">=", new DateTime($arFilter["LAST_LOGIN_1"]));
  683. }
  684. if (isset($arFilter["LAST_LOGIN_2"]))
  685. {
  686. $userQuery->where("LAST_LOGIN", "<=", new DateTime($arFilter["LAST_LOGIN_2"]));
  687. }
  688. if (isset($arFilter["GROUPS_ID"]))
  689. {
  690. if (is_numeric($arFilter["GROUPS_ID"]) && intval($arFilter["GROUPS_ID"]) > 0)
  691. $arFilter["GROUPS_ID"] = array($arFilter["GROUPS_ID"]);
  692. $listGroupId = array();
  693. foreach ($arFilter["GROUPS_ID"] as $groupId)
  694. $listGroupId[intval($groupId)] = intval($groupId);
  695. $userGroupQuery = UserGroupTable::query();
  696. $userGroupQuery->addSelect("USER_ID");
  697. $userGroupQuery->whereIn("GROUP_ID", $listGroupId);
  698. $nowTimeExpression = new SqlExpression(
  699. $userGroupQuery->getEntity()->getConnection()->getSqlHelper()->getCurrentDateTimeFunction());
  700. $userGroupQuery->where(Query::filter()->logic("or")
  701. ->whereNull("DATE_ACTIVE_FROM")
  702. ->where("DATE_ACTIVE_FROM", "<=", $nowTimeExpression)
  703. );
  704. $userGroupQuery->where(Query::filter()->logic("or")
  705. ->whereNull("DATE_ACTIVE_TO")
  706. ->where("DATE_ACTIVE_TO", ">=", $nowTimeExpression)
  707. );
  708. $userGroupQuery->setGroup(["USER_ID"]);
  709. $userGroupQuery = \Bitrix\Main\ORM\Entity::getInstanceByQuery($userGroupQuery);
  710. $userQuery->registerRuntimeField("",
  711. (new Reference("UG", $userGroupQuery, Join::on("this.ID", "ref.USER_ID")))->configureJoinType("inner")
  712. );
  713. }
  714. if (!empty($arFilter["KEYWORDS"]))
  715. {
  716. $listFields = array(
  717. "PERSONAL_PROFESSION", "PERSONAL_WWW", "PERSONAL_ICQ",
  718. "PERSONAL_PHONE", "PERSONAL_FAX", "PERSONAL_MOBILE", "PERSONAL_PAGER", "PERSONAL_STREET", "PERSONAL_MAILBOX",
  719. "PERSONAL_CITY", "PERSONAL_STATE", "PERSONAL_ZIP", "PERSONAL_COUNTRY", "PERSONAL_NOTES", "WORK_COMPANY",
  720. "WORK_DEPARTMENT", "WORK_POSITION", "WORK_WWW", "WORK_PHONE", "WORK_FAX", "WORK_PAGER", "WORK_STREET",
  721. "WORK_MAILBOX", "WORK_CITY", "WORK_STATE", "WORK_ZIP", "WORK_COUNTRY", "WORK_PROFILE", "WORK_NOTES",
  722. "LAST_NAME", "SECOND_NAME", "TITLE",
  723. );
  724. $keyWords = $arFilter["KEYWORDS"];
  725. $filterQueryObject = new CFilterQuery("and", "yes", "N", array(), "N", "Y", "N");
  726. $keyWords = $filterQueryObject->CutKav($keyWords);
  727. $keyWords = $filterQueryObject->ParseQ($keyWords);
  728. if ($keyWords <> '' && $keyWords !== "( )")
  729. $parsedKeyWords = preg_split('/[&&(||)]/', $keyWords, -1, PREG_SPLIT_NO_EMPTY);
  730. $filterOr = Query::filter()->logic("or");
  731. foreach ($listFields as $fieldId)
  732. {
  733. foreach ($parsedKeyWords as $keyWord)
  734. {
  735. $keyWord = trim($keyWord);
  736. if ($keyWord)
  737. {
  738. $filterOr->where(Query::filter()
  739. ->whereNotNull($fieldId)
  740. ->whereLike($fieldId, "%".$keyWord."%")
  741. );
  742. }
  743. }
  744. }
  745. $userQuery->where($filterOr);
  746. }
  747. $ignoreKey = ["NAME", "CHECK_SUBORDINATE", "CHECK_SUBORDINATE_AND_OWN", "NOT_ADMIN", "INTRANET_USERS",
  748. "GROUPS_ID", "KEYWORDS", "TIMESTAMP_1", "TIMESTAMP_2", "LAST_LOGIN_1", "LAST_LOGIN_2"];
  749. foreach ($arFilter as $filterKey => $filterValue)
  750. {
  751. if (!in_array($filterKey, $ignoreKey))
  752. {
  753. $userQuery->addFilter($filterKey, $filterValue);
  754. }
  755. }
  756. return $userQuery;
  757. }
  758. ?>