user_list.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. <?php
  2. // $Id: user_list.php 14615 2008-03-17 09:53:23Z elixir_inter $
  3. /*
  4. ==============================================================================
  5. Dokeos - elearning and course management software
  6. Copyright (c) 2004 Dokeos S.A.
  7. Copyright (c) 2003 Ghent University (UGent)
  8. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  9. Copyright (c) Olivier Brouckaert
  10. For a full list of contributors, see "credits.txt".
  11. The full license can be read in "license.txt".
  12. This program is free software; you can redistribute it and/or
  13. modify it under the terms of the GNU General Public License
  14. as published by the Free Software Foundation; either version 2
  15. of the License, or (at your option) any later version.
  16. See the GNU General Public License for more details.
  17. Contact: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
  18. ==============================================================================
  19. */
  20. /**
  21. ==============================================================================
  22. @author Bart Mollet
  23. * @package dokeos.admin
  24. ==============================================================================
  25. */
  26. // name of the language file that needs to be included
  27. $language_file = array ('registration','admin');
  28. $cidReset = true;
  29. require ('../inc/global.inc.php');
  30. require_once (api_get_path(LIBRARY_PATH).'sortabletable.class.php');
  31. require_once (api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php');
  32. require_once (api_get_path(LIBRARY_PATH).'security.lib.php');
  33. $this_section = SECTION_PLATFORM_ADMIN;
  34. api_protect_admin_script();
  35. /**
  36. * Make sure this function is protected
  37. * because it does NOT check password!
  38. *
  39. * This function defines globals.
  40. * @author Roan Embrechts
  41. */
  42. function login_user($user_id)
  43. {
  44. //init ---------------------------------------------------------------------
  45. global $uidReset, $loginFailed, $_configuration;
  46. $main_user_table = Database :: get_main_table(TABLE_MAIN_USER);
  47. $main_admin_table = Database :: get_main_table(TABLE_MAIN_ADMIN);
  48. $track_e_login_table = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
  49. //logic --------------------------------------------------------------------
  50. //unset($_user['user_id']); // uid not in session ? prevent any hacking
  51. if (!isset ($user_id))
  52. {
  53. $uidReset = true;
  54. return;
  55. }
  56. $sql_query = "SELECT * FROM $main_user_table WHERE user_id='$user_id'";
  57. $sql_result = api_sql_query($sql_query, __FILE__, __LINE__);
  58. $result = Database :: fetch_array($sql_result);
  59. $firstname = $result["firstname"];
  60. $lastname = $result["lastname"];
  61. $user_id = $result["user_id"];
  62. $message = "Attempting to login as ".$firstname." ".$lastname." (id ".$user_id.")";
  63. $loginFailed = false;
  64. $uidReset = false;
  65. if ($user_id) // a uid is given (log in succeeded)
  66. {
  67. if ($_configuration['tracking_enabled'])
  68. {
  69. $sql_query = "SELECT user.*, a.user_id is_admin,
  70. UNIX_TIMESTAMP(login.login_date) login_date
  71. FROM $main_user_table
  72. LEFT JOIN $main_admin_table a
  73. ON user.user_id = a.user_id
  74. LEFT JOIN $track_e_login_table login
  75. ON user.user_id = login.login_user_id
  76. WHERE user.user_id = '".$user_id."'
  77. ORDER BY login.login_date DESC LIMIT 1";
  78. }
  79. else
  80. {
  81. $sql_query = "SELECT user.*, a.user_id is_admin
  82. FROM $main_user_table
  83. LEFT JOIN $main_admin_table a
  84. ON user.user_id = a.user_id
  85. WHERE user.user_id = '".$user_id."'";
  86. }
  87. $sql_result = api_sql_query($sql_query, __FILE__, __LINE__);
  88. if (mysql_num_rows($sql_result) > 0)
  89. {
  90. // Extracting the user data
  91. $user_data = mysql_fetch_array($sql_result);
  92. //Delog the current user
  93. LoginDelete($_SESSION["_user"]["user_id"], $_configuration['statistics_database']);
  94. // Cleaning session variables
  95. unset($_SESSION['_user']);
  96. unset($_SESSION['is_platformAdmin']);
  97. unset($_SESSION['is_allowedCreateCourse']);
  98. unset($_SESSION['_uid']);
  99. $_user['firstName'] = $user_data['firstname'];
  100. $_user['lastName'] = $user_data['lastname'];
  101. $_user['mail'] = $user_data['email'];
  102. $_user['lastLogin'] = $user_data['login_date'];
  103. $_user['official_code'] = $user_data['official_code'];
  104. $_user['picture_uri'] = $user_data['picture_uri'];
  105. $_user['user_id'] = $user_data['user_id'];
  106. $is_platformAdmin = (bool) (!is_null($user_data['is_admin']));
  107. $is_allowedCreateCourse = (bool) ($user_data['status'] == 1);
  108. // Filling session variables with new data
  109. $_SESSION['_uid'] = $user_id;
  110. $_SESSION['_user'] = $_user;
  111. $_SESSION['is_platformAdmin'] = $is_platformAdmin;
  112. $_SESSION['is_allowedCreateCourse'] = $is_allowedCreateCourse;
  113. $_SESSION['login_as'] = true; // will be usefull later to know if the user is actually an admin or not (example reporting)s
  114. $target_url = api_get_path(WEB_PATH)."user_portal.php";
  115. $message .= "<br/>Login successful. Go to <a href=\"$target_url\">$target_url</a>";
  116. Display :: display_header(get_lang('UserList'));
  117. Display :: display_normal_message($message,false);
  118. Display :: display_footer();
  119. exit;
  120. }
  121. else
  122. {
  123. exit ("<br/>WARNING UNDEFINED UID !! ");
  124. }
  125. }
  126. }
  127. /**
  128. * Get the total number of users on the platform
  129. * @see SortableTable#get_total_number_of_items()
  130. */
  131. function get_number_of_users()
  132. {
  133. $user_table = Database :: get_main_table(TABLE_MAIN_USER);
  134. $sql = "SELECT COUNT(u.user_id) AS total_number_of_items FROM $user_table u";
  135. if (isset ($_GET['keyword']))
  136. {
  137. $keyword = mysql_real_escape_string($_GET['keyword']);
  138. $sql .= " WHERE u.firstname LIKE '%".$keyword."%' OR u.lastname LIKE '%".$keyword."%' OR u.email LIKE '%".$keyword."%' OR u.official_code LIKE '%".$keyword."%'";
  139. }
  140. elseif (isset ($_GET['keyword_firstname']))
  141. {
  142. $admin_table = Database :: get_main_table(TABLE_MAIN_ADMIN);
  143. $keyword_firstname = mysql_real_escape_string($_GET['keyword_firstname']);
  144. $keyword_lastname = mysql_real_escape_string($_GET['keyword_lastname']);
  145. $keyword_email = mysql_real_escape_string($_GET['keyword_email']);
  146. $keyword_username = mysql_real_escape_string($_GET['keyword_username']);
  147. $keyword_status = mysql_real_escape_string($_GET['keyword_status']);
  148. $query_admin_table = '';
  149. $keyword_admin = '';
  150. if($keyword_status == 10)
  151. {
  152. $keyword_status = '%';
  153. $query_admin_table = " , $admin_table a ";
  154. $keyword_admin = ' AND a.user_id = u.user_id ';
  155. }
  156. $keyword_active = isset($_GET['keyword_active']);
  157. $keyword_inactive = isset($_GET['keyword_inactive']);
  158. $sql .= $query_admin_table .
  159. " WHERE u.firstname LIKE '%".$keyword_firstname."%' " .
  160. "AND u.lastname LIKE '%".$keyword_lastname."%' " .
  161. "AND u.username LIKE '%".$keyword_username."%' " .
  162. "AND u.email LIKE '%".$keyword_email."%' " .
  163. //"AND u.official_code LIKE '%".$keyword_officialcode."%' " .
  164. "AND u.status LIKE '".$keyword_status."'" .
  165. $keyword_admin;
  166. if($keyword_active && !$keyword_inactive)
  167. {
  168. $sql .= " AND u.active='1'";
  169. }
  170. elseif($keyword_inactive && !$keyword_active)
  171. {
  172. $sql .= " AND u.active='0'";
  173. }
  174. }
  175. $res = api_sql_query($sql, __FILE__, __LINE__);
  176. $obj = mysql_fetch_object($res);
  177. return $obj->total_number_of_items;
  178. }
  179. /**
  180. * Get the users to display on the current page.
  181. * @see SortableTable#get_table_data($from)
  182. */
  183. function get_user_data($from, $number_of_items, $column, $direction)
  184. {
  185. $user_table = Database :: get_main_table(TABLE_MAIN_USER);
  186. $sql = "SELECT
  187. u.user_id AS col0,
  188. u.official_code AS col1,
  189. u.lastname AS col2,
  190. u.firstname AS col3,
  191. u.username AS col4,
  192. u.email AS col5,
  193. u.status AS col6,
  194. u.active AS col7,
  195. u.user_id AS col8
  196. FROM
  197. $user_table u";
  198. if (isset ($_GET['keyword']))
  199. {
  200. $keyword = mysql_real_escape_string($_GET['keyword']);
  201. $sql .= " WHERE u.firstname LIKE '%".$keyword."%' OR u.lastname LIKE '%".$keyword."%' OR u.username LIKE '%".$keyword."%' OR u.official_code LIKE '%".$keyword."%'";
  202. }
  203. elseif (isset ($_GET['keyword_firstname']))
  204. {
  205. $admin_table = Database :: get_main_table(TABLE_MAIN_ADMIN);
  206. $keyword_firstname = mysql_real_escape_string($_GET['keyword_firstname']);
  207. $keyword_lastname = mysql_real_escape_string($_GET['keyword_lastname']);
  208. $keyword_email = mysql_real_escape_string($_GET['keyword_email']);
  209. $keyword_username = mysql_real_escape_string($_GET['keyword_username']);
  210. $keyword_status = mysql_real_escape_string($_GET['keyword_status']);
  211. $query_admin_table = '';
  212. $keyword_admin = '';
  213. if($keyword_status == 10)
  214. {
  215. $keyword_status = '%';
  216. $query_admin_table = " , $admin_table a ";
  217. $keyword_admin = ' AND a.user_id = u.user_id ';
  218. }
  219. $keyword_active = isset($_GET['keyword_active']);
  220. $keyword_inactive = isset($_GET['keyword_inactive']);
  221. $sql .= $query_admin_table." WHERE u.firstname LIKE '%".$keyword_firstname."%' " .
  222. "AND u.lastname LIKE '%".$keyword_lastname."%' " .
  223. "AND u.username LIKE '%".$keyword_username."%' " .
  224. "AND u.email LIKE '%".$keyword_email."%' " .
  225. //"AND u.official_code LIKE '%".$keyword_officialcode."%' " .
  226. "AND u.status LIKE '".$keyword_status."'" .
  227. $keyword_admin;
  228. if($keyword_active && !$keyword_inactive)
  229. {
  230. $sql .= " AND u.active='1'";
  231. }
  232. elseif($keyword_inactive && !$keyword_active)
  233. {
  234. $sql .= " AND u.active='0'";
  235. }
  236. }
  237. $sql .= " ORDER BY col$column $direction ";
  238. $sql .= " LIMIT $from,$number_of_items";
  239. $res = api_sql_query($sql, __FILE__, __LINE__);
  240. $users = array ();
  241. $status = array(1=>get_lang('Teacher'),4=>get_lang('Drh'),5=>get_lang('Student'),6=>get_lang('Anonymous'));
  242. while ($user = mysql_fetch_row($res))
  243. {
  244. $user[6] = $status[$user[6]];
  245. $users[] = $user;
  246. }
  247. return $users;
  248. }
  249. /**
  250. * Returns a mailto-link
  251. * @param string $email An email-address
  252. * @return string HTML-code with a mailto-link
  253. */
  254. function email_filter($email)
  255. {
  256. return Display :: encrypted_mailto_link($email, $email);
  257. }
  258. /**
  259. * Build the modify-column of the table
  260. * @param int $user_id The user id
  261. * @param string $url_params
  262. * @return string Some HTML-code with modify-buttons
  263. */
  264. function modify_filter($user_id,$url_params)
  265. {
  266. global $charset;
  267. $result .= '<a href="user_information.php?user_id='.$user_id.'"><img src="../img/synthese_view.gif" border="0" style="vertical-align: middle;" title="'.get_lang('Info').'" alt="'.get_lang('Info').'"/></a>&nbsp;';
  268. $result .= '<a href="user_list.php?action=login_as&amp;user_id='.$user_id.'&amp;sec_token='.$_SESSION['sec_token'].'"><img src="../img/login_as.gif" border="0" style="vertical-align: middle;" alt="'.get_lang('LoginAs').'" title="'.get_lang('LoginAs').'"/></a>&nbsp;';
  269. $tbl_user = Database :: get_main_table(TABLE_MAIN_USER);
  270. $sql="SELECT status FROM ".$tbl_user." WHERE user_id='".$user_id."'";
  271. $result_sql=api_sql_query($sql);
  272. if(mysql_result($result_sql,0,"status")=="1"){
  273. $result .= '<div style="display:inline;margin-left:25px"></div>';
  274. }
  275. if(mysql_result($result_sql,0,"status")=="5"){
  276. $result .= '<a href="../mySpace/myStudents.php?student='.$user_id.'"><img src="../img/statistics.gif" border="0" style="vertical-align: middle;" title="'.get_lang('Reporting').'" alt="'.get_lang('Reporting').'"/></a>&nbsp;';
  277. }
  278. $result .= '<a href="user_edit.php?user_id='.$user_id.'"><img src="../img/edit.gif" border="0" style="vertical-align: middle;" title="'.get_lang('Edit').'" alt="'.get_lang('Edit').'"/></a>&nbsp;';
  279. $result .= '<a href="user_list.php?action=delete_user&amp;user_id='.$user_id.'&amp;'.$url_params.'&amp;sec_token='.$_SESSION['sec_token'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset))."'".')) return false;"><img src="../img/delete.gif" border="0" style="vertical-align: middle;" title="'.get_lang('Delete').'" alt="'.get_lang('Delete').'"/></a>';
  280. return $result;
  281. }
  282. /**
  283. * Build the active-column of the table to lock or unlock a certain user
  284. * lock = the user can no longer use this account
  285. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
  286. * @param int $active the current state of the account
  287. * @param int $user_id The user id
  288. * @param string $url_params
  289. * @return string Some HTML-code with the lock/unlock button
  290. */
  291. function active_filter($active, $url_params, $row)
  292. {
  293. global $_user;
  294. if ($active=='1')
  295. {
  296. $action='lock';
  297. $image='right';
  298. }
  299. if ($active=='0')
  300. {
  301. $action='unlock';
  302. $image='wrong';
  303. }
  304. if ($row['0']<>$_user['user_id']) // you cannot lock yourself out otherwise you could disable all the accounts including your own => everybody is locked out and nobody can change it anymore.
  305. {
  306. $result = '<a href="user_list.php?action='.$action.'&amp;user_id='.$row['0'].'&amp;'.$url_params.'&amp;sec_token='.$_SESSION['sec_token'].'"><img src="../img/'.$image.'.gif" border="0" style="vertical-align: middle;" alt="'.get_lang(ucfirst($action)).'" title="'.get_lang(ucfirst($action)).'"/></a>';
  307. }
  308. return $result;
  309. }
  310. /**
  311. * lock or unlock a user
  312. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
  313. * @param int $status, do we want to lock the user ($status=lock) or unlock it ($status=unlock)
  314. * @param int $user_id The user id
  315. * @return language variable
  316. */
  317. function lock_unlock_user($status,$user_id)
  318. {
  319. $user_table = Database :: get_main_table(TABLE_MAIN_USER);
  320. if ($status=='lock')
  321. {
  322. $status_db='0';
  323. $return_message=get_lang('UserLocked');
  324. }
  325. if ($status=='unlock')
  326. {
  327. $status_db='1';
  328. $return_message=get_lang('UserUnlocked');
  329. }
  330. if(($status_db=='1' OR $status_db=='0') AND is_numeric($user_id))
  331. {
  332. $sql="UPDATE $user_table SET active='".mysql_real_escape_string($status_db)."' WHERE user_id='".mysql_real_escape_string($user_id)."'";
  333. $result = api_sql_query($sql, __FILE__, __LINE__);
  334. }
  335. if ($result)
  336. {
  337. return $return_message;
  338. }
  339. }
  340. /**
  341. ==============================================================================
  342. INIT SECTION
  343. ==============================================================================
  344. */
  345. require_once (api_get_path(LIBRARY_PATH).'usermanager.lib.php');
  346. $action = $_GET["action"];
  347. $login_as_user_id = $_GET["user_id"];
  348. // Login as ...
  349. if ($_GET['action'] == "login_as" && isset ($login_as_user_id))
  350. {
  351. login_user($login_as_user_id);
  352. }
  353. if (isset ($_GET['search']) && $_GET['search'] == 'advanced')
  354. {
  355. $interbreadcrumb[] = array ("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
  356. $interbreadcrumb[] = array ("url" => 'user_list.php', "name" => get_lang('UserList'));
  357. $tool_name = get_lang('SearchAUser');
  358. Display :: display_header($tool_name);
  359. //api_display_tool_title($tool_name);
  360. $form = new FormValidator('advanced_search','get');
  361. $form->add_textfield('keyword_firstname',get_lang('FirstName'),false);
  362. $form->add_textfield('keyword_lastname',get_lang('LastName'),false);
  363. $form->add_textfield('keyword_username',get_lang('LoginName'),false);
  364. $form->add_textfield('keyword_email',get_lang('Email'),false);
  365. $form->add_textfield('keyword_officialcode',get_lang('OfficialCode'),false);
  366. $status_options = array();
  367. $status_options['%'] = get_lang('All');
  368. $status_options[STUDENT] = get_lang('Student');
  369. $status_options[COURSEMANAGER] = get_lang('Teacher');
  370. $status_options[10] = get_lang('Administrator');
  371. $form->addElement('select','keyword_status',get_lang('Status'),$status_options);
  372. $active_group = array();
  373. $active_group[] = $form->createElement('checkbox','keyword_active','',get_lang('Active'));
  374. $active_group[] = $form->createElement('checkbox','keyword_inactive','',get_lang('Inactive'));
  375. $form->addGroup($active_group,'',get_lang('ActiveAccount'),'<br/>',false);
  376. $form->addElement('submit','submit',get_lang('Ok'));
  377. $defaults['keyword_active'] = 1;
  378. $defaults['keyword_inactive'] = 1;
  379. $form->setDefaults($defaults);
  380. $form->display();
  381. }
  382. else
  383. {
  384. $interbreadcrumb[] = array ("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
  385. $tool_name = get_lang('UserList');
  386. Display :: display_header($tool_name, "");
  387. //api_display_tool_title($tool_name);
  388. if (isset ($_GET['action']))
  389. {
  390. $check = Security::check_token('get');
  391. if($check)
  392. {
  393. switch ($_GET['action'])
  394. {
  395. case 'show_message' :
  396. Display :: display_normal_message(stripslashes($_GET['message']));
  397. break;
  398. case 'delete_user' :
  399. if ($user_id != $_user['user_id'] && UserManager :: delete_user($_GET['user_id']))
  400. {
  401. Display :: display_normal_message(get_lang('UserDeleted'));
  402. }
  403. else
  404. {
  405. Display :: display_error_message(get_lang('CannotDeleteUser'));
  406. }
  407. break;
  408. case 'lock' :
  409. $message=lock_unlock_user('lock',$_GET['user_id']);
  410. Display :: display_normal_message($message);
  411. break;
  412. case 'unlock';
  413. $message=lock_unlock_user('unlock',$_GET['user_id']);
  414. Display :: display_normal_message($message);
  415. break;
  416. }
  417. Security::clear_token();
  418. }
  419. }
  420. if (isset ($_POST['action']))
  421. {
  422. $check = Security::check_token('get');
  423. if($check)
  424. {
  425. switch ($_POST['action'])
  426. {
  427. case 'delete' :
  428. $number_of_selected_users = count($_POST['id']);
  429. $number_of_deleted_users = 0;
  430. foreach ($_POST['id'] as $index => $user_id)
  431. {
  432. if($user_id != $_user['user_id'])
  433. {
  434. if(UserManager :: delete_user($user_id))
  435. {
  436. $number_of_deleted_users++;
  437. }
  438. }
  439. }
  440. if($number_of_selected_users == $number_of_deleted_users)
  441. {
  442. Display :: display_normal_message(get_lang('SelectedUsersDeleted'));
  443. }
  444. else
  445. {
  446. Display :: display_error_message(get_lang('SomeUsersNotDeleted'));
  447. }
  448. break;
  449. }
  450. Security::clear_token();
  451. }
  452. }
  453. // Create a search-box
  454. $form = new FormValidator('search_simple','get','','',null,false);
  455. $renderer =& $form->defaultRenderer();
  456. $renderer->setElementTemplate('<span>{element}</span> ');
  457. $form->addElement('text','keyword',get_lang('keyword'));
  458. $form->addElement('submit','submit',get_lang('Search'));
  459. $form->addElement('static','search_advanced_link',null,'<a href="user_list.php?search=advanced">'.get_lang('AdvancedSearch').'</a>');
  460. $form->display();
  461. if (isset ($_GET['keyword']))
  462. {
  463. $parameters = array ('keyword' => $_GET['keyword']);
  464. }
  465. elseif (isset ($_GET['keyword_firstname']))
  466. {
  467. $parameters['keyword_firstname'] = $_GET['keyword_firstname'];
  468. $parameters['keyword_lastname'] = $_GET['keyword_lastname'];
  469. $parameters['keyword_email'] = $_GET['keyword_email'];
  470. $parameters['keyword_officialcode'] = $_GET['keyword_officialcode'];
  471. $parameters['keyword_status'] = $_GET['keyword_status'];
  472. $parameters['keyword_active'] = $_GET['keyword_active'];
  473. $parameters['keyword_inactive'] = $_GET['keyword_inactive'];
  474. }
  475. // Create a sortable table with user-data
  476. $parameters['sec_token'] = Security::get_token();
  477. $table = new SortableTable('users', 'get_number_of_users', 'get_user_data',2);
  478. $table->set_additional_parameters($parameters);
  479. $table->set_header(0, '', false);
  480. $table->set_header(1, get_lang('OfficialCode'));
  481. $table->set_header(2, get_lang('LastName'));
  482. $table->set_header(3, get_lang('FirstName'));
  483. $table->set_header(4, get_lang('LoginName'));
  484. $table->set_header(5, get_lang('Email'));
  485. $table->set_header(6, get_lang('Status'));
  486. $table->set_header(7, get_lang('Active'));
  487. $table->set_header(8, get_lang('Modify'));
  488. $table->set_column_filter(5, 'email_filter');
  489. $table->set_column_filter(7, 'active_filter');
  490. $table->set_column_filter(8, 'modify_filter');
  491. $table->set_form_actions(array ('delete' => get_lang('DeleteFromPlatform')));
  492. $table->display();
  493. }
  494. /*
  495. ==============================================================================
  496. FOOTER
  497. ==============================================================================
  498. */
  499. Display :: display_footer();
  500. ?>