myspace.lib.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php';
  4. require_once api_get_path(LIBRARY_PATH).'export.lib.inc.php';
  5. require_once api_get_path(LIBRARY_PATH).'tracking.lib.php';
  6. require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
  7. require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
  8. class MySpace {
  9. /* For licensing terms, see /dokeos_license.txt */
  10. /**
  11. * This function serves exporting data in CSV format.
  12. * @param array $header The header labels.
  13. * @param array $data The data array.
  14. * @param string $file_name The name of the file which contains exported data.
  15. * @return string mixed Returns a message (string) if an error occurred.
  16. */
  17. function export_csv($header, $data, $file_name = 'export.csv') {
  18. $archive_path = api_get_path(SYS_ARCHIVE_PATH);
  19. $archive_url = api_get_path(WEB_CODE_PATH).'course_info/download.php?archive=';
  20. if (!$open = fopen($archive_path.$file_name, 'w+')) {
  21. $message = get_lang('noOpen');
  22. } else {
  23. $info = '';
  24. foreach ($header as $value) {
  25. $info .= $value.';';
  26. }
  27. $info .= "\r\n";
  28. foreach ($data as $row) {
  29. foreach ($row as $value) {
  30. $info .= $value.';';
  31. }
  32. $info .= "\r\n";
  33. }
  34. fwrite($open, $info);
  35. fclose($open);
  36. @chmod($file_name, api_get_permissions_for_new_files());
  37. header("Location:".$archive_url.$file_name);
  38. }
  39. return $message;
  40. }
  41. /**
  42. * Gets the connections to a course as an array of login and logout time
  43. *
  44. * @param int User ud
  45. * @param string Course code
  46. * @param int Session id (optional, default = 0)
  47. * @return array Conections
  48. */
  49. function get_connections_to_course($user_id, $course_code, $session_id = 0) {
  50. // Database table definitions
  51. $tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
  52. $tbl_main = Database :: get_main_table(TABLE_MAIN_COURSE);
  53. // protect data
  54. $user_id = intval($user_id);
  55. $course_code = Database::escape_string($course_code);
  56. $session_id = intval($session_id);
  57. $sql_query = 'SELECT visual_code as course_code FROM '.$tbl_main.' c WHERE code="'.$course_code.'";';
  58. $result = Database::query($sql_query);
  59. $row_query = Database::fetch_array($result, 'ASSOC');
  60. $course_true = isset($row_query['course_code']) ? $row_query['course_code']: $course_code;
  61. $sql = 'SELECT login_course_date, logout_course_date FROM ' . $tbl_track_course . '
  62. WHERE user_id = '.$user_id.'
  63. AND course_code="'.$course_true.'" AND session_id = '.$session_id.' ORDER BY login_course_date ASC';
  64. $rs = Database::query($sql);
  65. $connections = array();
  66. while ($row = Database::fetch_array($rs)) {
  67. $login_date = $row['login_course_date'];
  68. $logout_date = $row['logout_course_date'];
  69. $login_date = api_get_local_time($login_date, null, date_default_timezone_get());
  70. $logout_date = api_get_local_time($logout_date, null, date_default_timezone_get());
  71. $timestamp_login_date = api_strtotime($login_date);
  72. $timestamp_logout_date = api_strtotime($logout_date);
  73. $connections[] = array('login' => $timestamp_login_date, 'logout' => $timestamp_logout_date);
  74. }
  75. return $connections;
  76. }
  77. /**
  78. * TODO: Not used, to b deleted?
  79. * Enter description here...
  80. * @param int $user_id
  81. * @param string $course_code
  82. * @param date $year
  83. * @param date $month
  84. * @param date $day
  85. * @return unknown
  86. */
  87. function get_connections_to_course_by_time($user_id, $course_code, $year = '', $month = '', $day = '') {
  88. // Database table definitions
  89. $tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
  90. $tbl_main = Database :: get_main_table(TABLE_MAIN_COURSE);
  91. $sql_query = 'SELECT visual_code as course_code FROM '.$tbl_main.' c WHERE code="'.Database :: escape_string($course_code).'";';
  92. $result = Database::query($sql_query);
  93. $row_query = Database::fetch_array($result,'ASSOC');
  94. $course_true = isset($row_query['course_code']) ? $row_query['course_code']: $course_code;
  95. $sql = 'SELECT login_course_date, logout_course_date FROM ' . $tbl_track_course . '
  96. WHERE user_id = ' . intval($user_id) . '
  97. AND course_code="' . Database::escape_string($course_true) . '"
  98. ORDER BY login_course_date DESC';
  99. $rs = Database::query($sql);
  100. $connections = array();
  101. while ($row = Database::fetch_array($rs)) {
  102. $login_date = $row['login_course_date'];
  103. $logout_date = $row['logout_course_date'];
  104. $timestamp_login_date = strtotime($login_date);
  105. $timestamp_logout_date = strtotime($logout_date);
  106. $connections[] = array('login' => $timestamp_login_date, 'logout' => $timestamp_logout_date);
  107. }
  108. return $connections;
  109. }
  110. /**
  111. * Creates a small table in the last column of the table with the user overview
  112. *
  113. * @param integer $user_id the id of the user
  114. * @param array $url_params additonal url parameters
  115. * @param array $row the row information (the other columns)
  116. * @return string html code
  117. */
  118. function course_info_tracking_filter($user_id, $url_params, $row) {
  119. // the table header
  120. $return .= '<table class="data_table" style="width: 100%;border:0;padding:0;border-collapse:collapse;table-layout: fixed">';
  121. /*$return .= ' <tr>';
  122. $return .= ' <th>'.get_lang('Course').'</th>';
  123. $return .= ' <th>'.get_lang('AvgTimeSpentInTheCourse').'</th>';
  124. $return .= ' <th>'.get_lang('AvgStudentsProgress').'</th>';
  125. $return .= ' <th>'.get_lang('AvgCourseScore').'</th>';
  126. $return .= ' <th>'.get_lang('AvgExercisesScore').'</th>';
  127. $return .= ' <th>'.get_lang('AvgMessages').'</th>';
  128. $return .= ' <th>'.get_lang('AvgAssignments').'</th>';
  129. $return .= ' <th>'.get_lang('TotalExercisesScoreObtained').'</th>';
  130. $return .= ' <th>'.get_lang('TotalExercisesScorePossible').'</th>';
  131. $return .= ' <th>'.get_lang('TotalExercisesAnswered').'</th>';
  132. $return .= ' <th>'.get_lang('TotalExercisesScorePercentage').'</th>';
  133. $return .= ' <th>'.get_lang('FirstLogin').'</th>';
  134. $return .= ' <th>'.get_lang('LatestLogin').'</th>';
  135. $return .= ' </tr>';*/
  136. // database table definition
  137. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  138. // getting all the courses of the user
  139. $sql = "SELECT * FROM $tbl_course_user WHERE user_id = '".Database::escape_string($user_id)."' AND relation_type<>".COURSE_RELATION_TYPE_RRHH." ";
  140. $result = Database::query($sql);
  141. while ($row = Database::fetch_row($result)) {
  142. $return .= '<tr>';
  143. // course code
  144. $return .= ' <td width="157px" >'.cut($row[0], 20, true).'</td>';
  145. // time spent in the course
  146. $return .= ' <td><div>'.api_time_to_hms(Tracking :: get_time_spent_on_the_course($user_id, $row[0])).'</div></td>';
  147. // student progress in course
  148. $return .= ' <td><div>'.round(Tracking :: get_avg_student_progress($user_id, $row[0]), 2).'</div></td>';
  149. // student score
  150. $return .= ' <td><div>'.round(Tracking :: get_avg_student_score($user_id, $row[0]), 2).'</div></td>';
  151. // student tes score
  152. //$return .= ' <td><div style="width:40px">'.round(Tracking :: get_avg_student_exercise_score ($user_id, $row[0]),2).'%</div></td>';
  153. // student messages
  154. $return .= ' <td><div>'.Tracking :: count_student_messages($user_id, $row[0]).'</div></td>';
  155. // student assignments
  156. $return .= ' <td><div>'.Tracking :: count_student_assignments($user_id, $row[0]).'</div></td>';
  157. // student exercises results (obtained score, maximum score, number of exercises answered, score percentage)
  158. $exercises_results = MySpace::exercises_results($user_id, $row[0]);
  159. $return .= ' <td width="105px"><div>'.(is_null($exercises_results['percentage']) ? '' : $exercises_results['score_obtained'].'/'.$exercises_results['score_possible'].' ( '.$exercises_results['percentage'].'% )').'</div></td>';
  160. //$return .= ' <td><div>'.$exercises_results['score_possible'].'</div></td>';
  161. $return .= ' <td><div>'.$exercises_results['questions_answered'].'</div></td>';
  162. //$return .= ' <td><div>'.$exercises_results['percentage'].'% </div></td>';
  163. // first connection
  164. //$return .= ' <td width="60px">'.Tracking :: get_first_connection_date_on_the_course ($user_id, $row[0]).'</td>';
  165. // last connection
  166. $return .= ' <td><div>'.Tracking :: get_last_connection_date_on_the_course ($user_id, $row[0]).'</div></td>';
  167. $return .= '<tr>';
  168. }
  169. $return .= '</table>';
  170. return $return;
  171. }
  172. /**
  173. * Display a sortable table that contains an overview off all the reporting progress of all users and all courses the user is subscribed to
  174. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  175. * @version Dokeos 1.8.6
  176. * @since October 2008
  177. */
  178. function display_tracking_user_overview() {
  179. MySpace::display_user_overview_export_options();
  180. $t_head .= ' <table style="width: 100%;border:0;padding:0;border-collapse:collapse;table-layout: fixed">';
  181. $t_head .= ' <caption>'.get_lang('CourseInformation').'</caption>';
  182. $t_head .= '<tr>';
  183. $t_head .= ' <th width="155px" style="border-left:0;border-bottom:0"><span>'.get_lang('Course').'</span></th>';
  184. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('AvgTimeSpentInTheCourse'), 6, true).'</span></th>';
  185. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('AvgStudentsProgress'), 6, true).'</span></th>';
  186. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('AvgCourseScore'), 6, true).'</span></th>';
  187. //$t_head .= ' <th><div style="width:40px">'.get_lang('AvgExercisesScore').'</div></th>';
  188. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('AvgMessages'), 6, true).'</span></th>';
  189. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('AvgAssignments'), 6, true).'</span></th>';
  190. $t_head .= ' <th width="105px" style="border-bottom:0"><span>'.get_lang('TotalExercisesScoreObtained').'</span></th>';
  191. //$t_head .= ' <th><div>'.get_lang('TotalExercisesScorePossible').'</div></th>';
  192. $t_head .= ' <th style="padding:0;border-bottom:0"><span>'.cut(get_lang('TotalExercisesAnswered'), 6, true).'</span></th>';
  193. //$t_head .= ' <th><div>'.get_lang('TotalExercisesScorePercentage').'</div></th>';
  194. //$t_head .= ' <th><div style="width:60px">'.get_lang('FirstLogin').'</div></th>';
  195. $t_head .= ' <th style="padding:0;border-bottom:0;border-right:0;"><span>'.get_lang('LatestLogin').'</span></th>';
  196. $t_head .= ' </tr></table>';
  197. $addparams = array('view' => 'admin', 'display' => 'useroverview');
  198. $table = new SortableTable('tracking_user_overview', array('MySpace','get_number_of_users_tracking_overview'), array('MySpace','get_user_data_tracking_overview'), 0);
  199. $table->additional_parameters = $addparams;
  200. $table->set_header(0, get_lang('OfficialCode'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  201. if (api_is_western_name_order()) {
  202. $table->set_header(1, get_lang('FirstName'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  203. $table->set_header(2, get_lang('LastName'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  204. } else {
  205. $table->set_header(1, get_lang('LastName'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  206. $table->set_header(2, get_lang('FirstName'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  207. }
  208. $table->set_header(3, get_lang('LoginName'), true, array('style' => 'font-size:8pt'), array('style' => 'font-size:8pt'));
  209. $table->set_header(4, $t_head, false, array('style' => 'width:90%;border:0;padding:0;font-size:7.5pt;'), array('style' => 'width:90%;padding:0;font-size:7.5pt;'));
  210. $table->set_column_filter(4, array('MySpace','course_info_tracking_filter'));
  211. $table->display();
  212. }
  213. /**
  214. * Displays a form with all the additionally defined user fields of the profile
  215. * and give you the opportunity to include these in the CSV export
  216. *
  217. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  218. * @version Dokeos 1.8.6
  219. * @since November 2008
  220. */
  221. function display_user_overview_export_options() {
  222. // include the user manager and formvalidator library
  223. if ($_GET['export'] == 'options') {
  224. // get all the defined extra fields
  225. $extrafields = UserManager::get_extra_fields(0, 50, 5, 'ASC', false);
  226. // creating the form with all the defined extra fields
  227. $form = new FormValidator('exportextrafields', 'post', api_get_self()."?view=".Security::remove_XSS($_GET['view']).'&display='.Security::remove_XSS($_GET['display']).'&export='.Security::remove_XSS($_GET['export']));
  228. if (is_array($extrafields) && count($extrafields) > 0) {
  229. foreach ($extrafields as $key => $extra) {
  230. $form->addElement('checkbox', 'extra_export_field'.$extra[0], '', $extra[3]);
  231. }
  232. $form->addElement('style_submit_button','submit', get_lang('Ok'),'class="save"' );
  233. // setting the default values for the form that contains all the extra fields
  234. if (is_array($_SESSION['additional_export_fields'])) {
  235. foreach ($_SESSION['additional_export_fields'] as $key => $value) {
  236. $defaults['extra_export_field'.$value] = 1;
  237. }
  238. }
  239. $form->setDefaults($defaults);
  240. } else {
  241. $form->addElement('html', Display::display_warning_message(get_lang('ThereAreNotExtrafieldsAvailable')));
  242. }
  243. if ($form->validate()) {
  244. // exporting the form values
  245. $values = $form->exportValues();
  246. // re-initialising the session that contains the additional fields that need to be exported
  247. $_SESSION['additional_export_fields'] = array();
  248. // adding the fields that are checked to the session
  249. $message = '';
  250. foreach ($values as $field_ids => $value) {
  251. if ($value == 1 && strstr($field_ids,'extra_export_field')) {
  252. $_SESSION['additional_export_fields'][] = str_replace('extra_export_field', '', $field_ids);
  253. }
  254. }
  255. // adding the fields that will be also exported to a message string
  256. if (is_array($_SESSION['additional_export_fields'])) {
  257. foreach ($_SESSION['additional_export_fields'] as $key => $extra_field_export) {
  258. $message .= '<li>'.$extrafields[$extra_field_export][3].'</li>';
  259. }
  260. }
  261. // Displaying a feedback message
  262. if (!empty($_SESSION['additional_export_fields'])) {
  263. Display::display_confirmation_message(get_lang('FollowingFieldsWillAlsoBeExported').': <br /><ul>'.$message.'</ul>', false);
  264. } else {
  265. Display::display_confirmation_message(get_lang('NoAdditionalFieldsWillBeExported'), false);
  266. }
  267. $message = '';
  268. } else {
  269. $form->display();
  270. }
  271. } else {
  272. if (!empty($_SESSION['additional_export_fields'])) {
  273. // get all the defined extra fields
  274. $extrafields = UserManager::get_extra_fields(0, 50, 5, 'ASC');
  275. foreach ($_SESSION['additional_export_fields'] as $key => $extra_field_export) {
  276. $message .= '<li>'.$extrafields[$extra_field_export][3].'</li>';
  277. }
  278. Display::display_normal_message(get_lang('FollowingFieldsWillAlsoBeExported').': <br /><ul>'.$message.'</ul>', false);
  279. $message = '';
  280. }
  281. }
  282. }
  283. /**
  284. * Get general information about the exercise performance of the user
  285. * the total obtained score (all the score on all the questions)
  286. * the maximum score that could be obtained
  287. * the number of questions answered
  288. * the success percentage
  289. * @param integer $user_id the id of the user
  290. * @param string $course_code the course code
  291. * @return array
  292. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  293. * @version Dokeos 1.8.6
  294. * @since November 2008
  295. */
  296. function exercises_results($user_id, $course_code) {
  297. $questions_answered = 0;
  298. $sql = 'SELECT exe_result , exe_weighting
  299. FROM '.Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES)."
  300. WHERE exe_cours_id = '".Database::escape_string($course_code)."'
  301. AND exe_user_id = '".Database::escape_string($user_id)."'";
  302. $result = Database::query($sql);
  303. $score_obtained = 0;
  304. $score_possible = 0;
  305. $questions_answered = 0;
  306. while ($row = Database::fetch_array($result)) {
  307. $score_obtained += $row['exe_result'];
  308. $score_possible += $row['exe_weighting'];
  309. $questions_answered ++;
  310. }
  311. if ($score_possible != 0) {
  312. $percentage = round(($score_obtained / $score_possible * 100), 2);
  313. } else {
  314. $percentage = null;
  315. }
  316. return array('score_obtained' => $score_obtained, 'score_possible' => $score_possible, 'questions_answered' => $questions_answered, 'percentage' => $percentage);
  317. }
  318. /**
  319. * This function exports the table that we see in display_tracking_user_overview()
  320. *
  321. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  322. * @version Dokeos 1.8.6
  323. * @since October 2008
  324. */
  325. function export_tracking_user_overview() {
  326. // database table definitions
  327. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  328. $is_western_name_order = api_is_western_name_order(PERSON_NAME_DATA_EXPORT);
  329. $sort_by_first_name = api_sort_by_first_name();
  330. // the values of the sortable table
  331. if ($_GET['tracking_user_overview_page_nr']) {
  332. $from = $_GET['tracking_user_overview_page_nr'];
  333. } else {
  334. $from = 0;
  335. }
  336. if ($_GET['tracking_user_overview_column']) {
  337. $orderby = $_GET['tracking_user_overview_column'];
  338. } else {
  339. $orderby = 0;
  340. }
  341. if ($is_western_name_order != api_is_western_name_order() && ($orderby == 1 || $orderby == 2)) {
  342. // Swapping the sorting column if name order for export is different than the common name order.
  343. $orderby = 3 - $orderby;
  344. }
  345. if ($_GET['tracking_user_overview_direction']) {
  346. $direction = $_GET['tracking_user_overview_direction'];
  347. } else {
  348. $direction = 'ASC';
  349. }
  350. $user_data = MySpace::get_user_data_tracking_overview($from, 1000, $orderby, $direction);
  351. // the first line of the csv file with the column headers
  352. $csv_row = array();
  353. $csv_row[] = get_lang('OfficialCode');
  354. if ($is_western_name_order) {
  355. $csv_row[] = get_lang('FirstName', '');
  356. $csv_row[] = get_lang('LastName', '');
  357. } else {
  358. $csv_row[] = get_lang('LastName', '');
  359. $csv_row[] = get_lang('FirstName', '');
  360. }
  361. $csv_row[] = get_lang('LoginName');
  362. $csv_row[] = get_lang('CourseCode');
  363. // the additional user defined fields (only those that were selected to be exported)
  364. $fields = UserManager::get_extra_fields(0, 50, 5, 'ASC');
  365. if (is_array($_SESSION['additional_export_fields'])) {
  366. foreach ($_SESSION['additional_export_fields'] as $key => $extra_field_export) {
  367. $csv_row[] = $fields[$extra_field_export][3];
  368. $field_names_to_be_exported[] = 'extra_'.$fields[$extra_field_export][1];
  369. }
  370. }
  371. $csv_row[] = get_lang('AvgTimeSpentInTheCourse', '');
  372. $csv_row[] = get_lang('AvgStudentsProgress', '');
  373. $csv_row[] = get_lang('AvgCourseScore', '');
  374. $csv_row[] = get_lang('AvgExercisesScore', '');
  375. $csv_row[] = get_lang('AvgMessages', '');
  376. $csv_row[] = get_lang('AvgAssignments', '');
  377. $csv_row[] = get_lang('TotalExercisesScoreObtained', '');
  378. $csv_row[] = get_lang('TotalExercisesScorePossible', '');
  379. $csv_row[] = get_lang('TotalExercisesAnswered', '');
  380. $csv_row[] = get_lang('TotalExercisesScorePercentage', '');
  381. $csv_row[] = get_lang('FirstLogin', '');
  382. $csv_row[] = get_lang('LatestLogin', '');
  383. $csv_content[] = $csv_row;
  384. // the other lines (the data)
  385. foreach ($user_data as $key => $user) {
  386. // getting all the courses of the user
  387. $sql = "SELECT * FROM $tbl_course_user WHERE user_id = '".Database::escape_string($user[4])."' AND relation_type<>".COURSE_RELATION_TYPE_RRHH." ";
  388. $result = Database::query($sql);
  389. while ($row = Database::fetch_row($result)) {
  390. $csv_row = array();
  391. // user official code
  392. $csv_row[] = $user[0];
  393. // user first|last name
  394. $csv_row[] = $user[1];
  395. // user last|first name
  396. $csv_row[] = $user[2];
  397. // user login name
  398. $csv_row[] = $user[3];
  399. // course code
  400. $csv_row[] = $row[0];
  401. // the additional defined user fields
  402. $extra_fields = MySpace::get_user_overview_export_extra_fields($user[4]);
  403. if (is_array($field_names_to_be_exported)) {
  404. foreach ($field_names_to_be_exported as $key => $extra_field_export) {
  405. $csv_row[] = $extra_fields[$extra_field_export];
  406. }
  407. }
  408. // time spent in the course
  409. $csv_row[] = api_time_to_hms(Tracking :: get_time_spent_on_the_course ($user[4], $row[0]));
  410. // student progress in course
  411. $csv_row[] = round(Tracking :: get_avg_student_progress ($user[4], $row[0]), 2);
  412. // student score
  413. $csv_row[] = round(Tracking :: get_avg_student_score ($user[4], $row[0]), 2);
  414. // student tes score
  415. $csv_row[] = round(Tracking :: get_avg_student_exercise_score ($user[4], $row[0]), 2);
  416. // student messages
  417. $csv_row[] = Tracking :: count_student_messages ($user[4], $row[0]);
  418. // student assignments
  419. $csv_row[] = Tracking :: count_student_assignments ($user[4], $row[0]);
  420. // student exercises results
  421. $exercises_results = MySpace::exercises_results($user[4], $row[0]);
  422. $csv_row[] = $exercises_results['score_obtained'];
  423. $csv_row[] = $exercises_results['score_possible'];
  424. $csv_row[] = $exercises_results['questions_answered'];
  425. $csv_row[] = $exercises_results['percentage'];
  426. // first connection
  427. $csv_row[] = Tracking :: get_first_connection_date_on_the_course ($user[4], $row[0]);
  428. // last connection
  429. $csv_row[] = strip_tags(Tracking :: get_last_connection_date_on_the_course ($user[4], $row[0]));
  430. $csv_content[] = $csv_row;
  431. }
  432. }
  433. Export :: export_table_csv($csv_content, 'reporting_user_overview');
  434. exit;
  435. }
  436. /**
  437. * Get data for courses list in sortable with pagination
  438. * @return array
  439. */
  440. function get_course_data($from, $number_of_items, $column, $direction) {
  441. global $courses, $csv_content, $charset, $session_id;
  442. // definition database tables
  443. $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE);
  444. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  445. $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  446. $a_course_students = array();
  447. $course_data = array();
  448. $courses_code = array_keys($courses);
  449. foreach ($courses_code as &$code) {
  450. $code = "'$code'";
  451. }
  452. // get all courses with limit
  453. $sql = "SELECT course.code as col1, course.title as col2
  454. FROM $tbl_course course
  455. WHERE course.code IN (".implode(',',$courses_code).")";
  456. if (!in_array($direction, array('ASC','DESC'))) $direction = 'ASC';
  457. $column = intval($column);
  458. $from = intval($from);
  459. $number_of_items = intval($number_of_items);
  460. $sql .= " ORDER BY col$column $direction ";
  461. $sql .= " LIMIT $from,$number_of_items";
  462. $res = Database::query($sql);
  463. while ($row_course = Database::fetch_row($res)) {
  464. $course_code = $row_course[0];
  465. $course_info = api_get_course_info($course_code);
  466. $avg_assignments_in_course = $avg_messages_in_course = $nb_students_in_course = $avg_progress_in_course = $avg_score_in_course = $avg_time_spent_in_course = $avg_score_in_exercise = 0;
  467. // students directly subscribed to the course
  468. if (empty($session_id)) {
  469. $sql = "SELECT user_id FROM $tbl_course_user as course_rel_user WHERE course_rel_user.status='5' AND course_rel_user.course_code='$course_code'";
  470. } else {
  471. $sql = "SELECT id_user as user_id FROM $tbl_session_course_user srcu WHERE srcu. course_code='$course_code' AND id_session = '$session_id' AND srcu.status<>2";
  472. }
  473. $rs = Database::query($sql);
  474. $users = array();
  475. while ($row = Database::fetch_array($rs)) { $users[] = $row['user_id']; }
  476. if (count($users) > 0) {
  477. $nb_students_in_course = count($users);
  478. $avg_assignments_in_course = Tracking::count_student_assignments($users, $course_code, $session_id);
  479. $avg_messages_in_course = Tracking::count_student_messages($users, $course_code, $session_id);
  480. $avg_progress_in_course = Tracking::get_avg_student_progress($users, $course_code, array(), $session_id);
  481. $avg_score_in_course = Tracking :: get_avg_student_score($users, $course_code, array(), $session_id);
  482. $avg_score_in_exercise = Tracking::get_avg_student_exercise_score($users, $course_code, 0, $session_id);
  483. $avg_time_spent_in_course = Tracking::get_time_spent_on_the_course($users, $course_code, $session_id);
  484. $avg_progress_in_course = round($avg_progress_in_course / $nb_students_in_course, 2);
  485. $avg_score_in_course = round($avg_score_in_course / $nb_students_in_course, 2);
  486. $avg_score_in_exercise = round($avg_score_in_exercise / $nb_students_in_course, 2);
  487. $avg_time_spent_in_course = api_time_to_hms($avg_time_spent_in_course / $nb_students_in_course);
  488. } else {
  489. $avg_time_spent_in_course = null;
  490. $avg_progress_in_course = null;
  491. $avg_score_in_course = null;
  492. $avg_score_in_exercise = null;
  493. $avg_messages_in_course = null;
  494. $avg_assignments_in_course = null;
  495. }
  496. $table_row = array();
  497. $table_row[] = $row_course[1];
  498. $table_row[] = $nb_students_in_course;
  499. $table_row[] = $avg_time_spent_in_course;
  500. $table_row[] = is_null($avg_progress_in_course) ? '' : $avg_progress_in_course.'%';
  501. $table_row[] = is_null($avg_score_in_course) ? '' : $avg_score_in_course.'%';
  502. $table_row[] = is_null($avg_score_in_exercise) ? '' : $avg_score_in_exercise.'%';
  503. $table_row[] = $avg_messages_in_course;
  504. $table_row[] = $avg_assignments_in_course;
  505. //set the "from" value to know if I access the Reporting by the chamilo tab or the course link
  506. $table_row[] = '<center><a href="../tracking/courseLog.php?cidReq='.$course_code.'&studentlist=true&from=myspace&id_session='.$session_id.'"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
  507. $csv_content[] = array(
  508. api_html_entity_decode($row_course[1], ENT_QUOTES, $charset),
  509. $nb_students_in_course,
  510. $avg_time_spent_in_course,
  511. is_null($avg_progress_in_course) ? null : $avg_progress_in_course.'%',
  512. is_null($avg_score_in_course) ? null : $avg_score_in_course.'%',
  513. is_null($avg_score_in_exercise) ? null : $avg_score_in_exercise.'%',
  514. $avg_messages_in_course,
  515. $avg_assignments_in_course,
  516. );
  517. $course_data[] = $table_row;
  518. }
  519. return $course_data;
  520. }
  521. /**
  522. * get the numer of users of the platform
  523. *
  524. * @return integer
  525. *
  526. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  527. * @version Dokeos 1.8.6
  528. * @since October 2008
  529. */
  530. function get_number_of_users_tracking_overview() {
  531. // database table definition
  532. $main_user_table = Database :: get_main_table(TABLE_MAIN_USER);
  533. // query
  534. $sql = 'SELECT user_id FROM '.$main_user_table;
  535. $result = Database::query($sql);
  536. // return the number of results
  537. return Database::num_rows($result);
  538. }
  539. /**
  540. * get all the data for the sortable table of the reporting progress of all users and all the courses the user is subscribed to.
  541. *
  542. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  543. * @version Dokeos 1.8.6
  544. * @since October 2008
  545. */
  546. function get_user_data_tracking_overview($from, $number_of_items, $column, $direction) {
  547. // database table definition
  548. $main_user_table = Database :: get_main_table(TABLE_MAIN_USER);
  549. global $export_csv;
  550. if ($export_csv) {
  551. $is_western_name_order = api_is_western_name_order(PERSON_NAME_DATA_EXPORT);
  552. } else {
  553. $is_western_name_order = api_is_western_name_order();
  554. }
  555. $sql = "SELECT
  556. official_code AS col0,
  557. ".($is_western_name_order ? "
  558. firstname AS col1,
  559. lastname AS col2,
  560. " : "
  561. lastname AS col1,
  562. firstname AS col2,
  563. ").
  564. "username AS col3,
  565. user_id AS col4
  566. FROM
  567. $main_user_table
  568. ";
  569. $sql .= " ORDER BY col$column $direction ";
  570. $sql .= " LIMIT $from,$number_of_items";
  571. $result = Database::query($sql);
  572. $return = array ();
  573. while ($user = Database::fetch_row($result)) {
  574. $return[] = $user;
  575. }
  576. return $return;
  577. }
  578. /**
  579. * Get all information that the user with user_id = $user_data has
  580. * entered in the additionally defined profile fields
  581. * @param integer $user_id the id of the user
  582. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  583. * @version Dokeos 1.8.6
  584. * @since November 2008
  585. */
  586. function get_user_overview_export_extra_fields($user_id) {
  587. // include the user manager
  588. $extra_data = UserManager::get_extra_user_data($user_id, true);
  589. return $extra_data;
  590. }
  591. /**
  592. * Checks if a username exist in the DB otherwise it create a "double"
  593. * i.e. if we look into for jmontoya but the user's name already exist we create the user jmontoya2
  594. * the return array will be array(username=>'jmontoya', sufix='2')
  595. * @param string firstname
  596. * @param string lastname
  597. * @param string username
  598. * @return array with the username, the sufix
  599. * @author Julio Montoya Armas
  600. */
  601. function make_username($firstname, $lastname, $username, $language = null, $encoding = null) {
  602. $table_user = Database::get_main_table(TABLE_MAIN_USER);
  603. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  604. // if username exist
  605. if (!UserManager::is_username_available($username) || empty($username)) {
  606. $i = 0;
  607. while (1) {
  608. if ($i == 0) {
  609. $sufix = '';
  610. } else {
  611. $sufix = $i;
  612. }
  613. $desired_username = UserManager::create_username($firstname, $lastname, $language, $encoding);
  614. if (UserManager::is_username_available($desired_username.$sufix)) {
  615. break;
  616. } else {
  617. $i++;
  618. }
  619. }
  620. $username_array = array('username' => $desired_username , 'sufix' => $sufix);
  621. return $username_array;
  622. } else {
  623. $username_array = array('username' => $username, 'sufix' => '');
  624. return $username_array;
  625. }
  626. }
  627. /**
  628. * Checks if there are repeted users in a given array
  629. * @param array $usernames list of the usernames in the uploaded file
  630. * @param array $user_array['username'] and $user_array['sufix'] where sufix is the number part in a login i.e -> jmontoya2
  631. * @return array with the $usernames array and the $user_array array
  632. * @author Julio Montoya Armas
  633. */
  634. function check_user_in_array($usernames, $user_array) {
  635. $user_list = array_keys($usernames);
  636. $username = $user_array['username'].$user_array['sufix'];
  637. if (in_array($username, $user_list)) {
  638. $user_array['sufix'] += $usernames[$username];
  639. $usernames[$username]++;
  640. } else {
  641. $usernames[$username] = 1;
  642. }
  643. $result_array = array($usernames, $user_array);
  644. return $result_array;
  645. }
  646. /**
  647. * Checks whether a username has been already subscribed in a session.
  648. * @param string a given username
  649. * @param array the array with the course list codes
  650. * @param the session id
  651. * @return 0 if the user is not subscribed otherwise it returns the user_id of the given username
  652. * @author Julio Montoya Armas
  653. */
  654. function user_available_in_session($username, $course_list, $id_session) {
  655. $table_user = Database::get_main_table(TABLE_MAIN_USER);
  656. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  657. $id_session = intval($id_session);
  658. $username = Database::escape_string($username);
  659. foreach($course_list as $enreg_course) {
  660. $sql_select = " SELECT u.user_id FROM $tbl_session_rel_course_rel_user rel INNER JOIN $table_user u
  661. ON (rel.id_user=u.user_id)
  662. WHERE rel.id_session='$id_session' AND u.status='5' AND u.username ='$username' AND rel.course_code='$enreg_course'";
  663. $rs = Database::query($sql_select);
  664. if (Database::num_rows($rs) > 0) {
  665. return Database::result($rs, 0, 0);
  666. } else {
  667. return 0;
  668. }
  669. }
  670. }
  671. /**
  672. This function checks whether some users in the uploaded file repeated and creates unique usernames if necesary.
  673. A case: Within the file there is an user repeted twice (Julio Montoya / Julio Montoya) and the username fields are empty.
  674. Then, this function would create unique usernames based on the first and the last name. Two users wiould be created - jmontoya and jmontoya2.
  675. Of course, if in the database there is a user with the name jmontoya, the newly created two users registered would be jmontoya2 and jmontoya3.
  676. @param $users list of users
  677. @author Julio Montoya Armas
  678. */
  679. function check_all_usernames($users, $course_list, $id_session) {
  680. $table_user = Database::get_main_table(TABLE_MAIN_USER);
  681. $usernames = array();
  682. $new_users = array();
  683. foreach ($users as $index => $user) {
  684. $desired_username = array();
  685. if (empty($user['UserName'])) {
  686. $desired_username = MySpace::make_username($user['FirstName'], $user['LastName'], '');
  687. $pre_username = $desired_username['username'].$desired_username['sufix'];
  688. $user['UserName'] = $pre_username;
  689. $user['create'] = '1';
  690. } else {
  691. if (UserManager::is_username_available($user['UserName'])) {
  692. $desired_username = MySpace::make_username($user['FirstName'], $user['LastName'], $user['UserName']);
  693. $user['UserName'] = $desired_username['username'].$desired_username['sufix'];
  694. $user['create'] = '1';
  695. } else {
  696. $is_session_avail = MySpace::user_available_in_session($user['UserName'], $course_list, $id_session);
  697. if ($is_session_avail == 0) {
  698. $user_name = $user['UserName'];
  699. $sql_select = "SELECT user_id FROM $table_user WHERE username ='$user_name' ";
  700. $rs = Database::query($sql_select);
  701. $user['create'] = Database::result($rs, 0, 0); // This should be the ID because the user exists.
  702. } else {
  703. $user['create'] = $is_session_avail;
  704. }
  705. }
  706. }
  707. // Usernames is the current list of users in the file.
  708. $result_array = MySpace::check_user_in_array($usernames, $desired_username);
  709. $usernames = $result_array[0];
  710. $desired_username = $result_array[1];
  711. $user['UserName'] = $desired_username['username'].$desired_username['sufix'];
  712. $new_users[] = $user;
  713. }
  714. return $new_users;
  715. }
  716. /**
  717. * This functions checks whether there are users that are already registered in the DB by different creator than the current coach.
  718. * @param string a given username
  719. * @param array the array with the course list codes
  720. * @param the session id
  721. * @author Julio Montoya Armas
  722. */
  723. function get_user_creator($users, $course_list, $id_session) {
  724. $errors = array();
  725. foreach ($users as $index => $user) {
  726. // database table definition
  727. $table_user = Database::get_main_table(TABLE_MAIN_USER);
  728. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  729. $username = Database::escape_string($user['UserName']);
  730. //echo "<br>";
  731. $sql = "SELECT creator_id FROM $table_user WHERE username='$username' ";
  732. $rs = Database::query($sql);
  733. $creator_id = Database::result($rs, 0, 0);
  734. // check if we are the creators or not
  735. if ($creator_id != '') {
  736. if ($creator_id != api_get_user_id()) {
  737. $user['error'] = get_lang('UserAlreadyRegisteredByOtherCreator');
  738. $errors[] = $user;
  739. }
  740. }
  741. }
  742. return $errors;
  743. }
  744. /**
  745. * Validates imported data.
  746. * @param list of users
  747. */
  748. function validate_data($users, $id_session = null) {
  749. $errors = array();
  750. $usernames = array();
  751. $new_users = array();
  752. foreach ($users as $index => $user) {
  753. // 1. Check whether mandatory fields are set.
  754. $mandatory_fields = array('LastName', 'FirstName');
  755. if (api_get_setting('registration', 'email') == 'true') {
  756. $mandatory_fields[] = 'Email';
  757. }
  758. foreach ($mandatory_fields as $key => $field) {
  759. if (!isset ($user[$field]) || strlen($user[$field]) == 0) {
  760. $user['error'] = get_lang($field.'Mandatory');
  761. $errors[] = $user;
  762. }
  763. }
  764. // 2. Check whether the username is too long.
  765. if (UserManager::is_username_too_long($user['UserName'])) {
  766. $user['error'] = get_lang('UserNameTooLong');
  767. $errors[] = $user;
  768. }
  769. $user['UserName'] = trim($user['UserName']);
  770. if (empty($user['UserName'])) {
  771. $user['UserName'] = UserManager::create_username($user['FirstName'], $user['LastName']);
  772. }
  773. $new_users[] = $user;
  774. }
  775. $results = array('errors' => $errors, 'users' => $new_users);
  776. return $results;
  777. }
  778. /**
  779. * Adds missing user-information (which isn't required, like password, etc).
  780. */
  781. function complete_missing_data($user) {
  782. // 1. Generate a password if it is necessary.
  783. if (!isset ($user['Password']) || strlen($user['Password']) == 0) {
  784. $user['Password'] = api_generate_password();
  785. }
  786. return $user;
  787. }
  788. /**
  789. * Saves imported data.
  790. */
  791. function save_data($users, $course_list, $id_session) {
  792. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  793. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  794. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  795. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  796. $id_session = intval($id_session);
  797. $sendMail = $_POST['sendMail'] ? 1 : 0;
  798. // Adding users to the platform.
  799. $new_users = array();
  800. foreach ($users as $index => $user) {
  801. $user = MySpace::complete_missing_data($user);
  802. // coach only will registered users
  803. $default_status = '5';
  804. if ($user['create'] == '1') {
  805. $user['id'] = UserManager :: create_user($user['FirstName'], $user['LastName'], $default_status, $user['Email'], $user['UserName'], $user['Password'], $user['OfficialCode'], api_get_setting('PlatformLanguage'), $user['PhoneNumber'], '');
  806. $user['added_at_platform'] = 1;
  807. } else {
  808. $user['id'] = $user['create'];
  809. $user['added_at_platform'] = 0;
  810. }
  811. $new_users[] = $user;
  812. }
  813. // Update user list.
  814. $users = $new_users;
  815. // Inserting users.
  816. $super_list = array();
  817. foreach ($course_list as $enreg_course) {
  818. $nbr_users = 0;
  819. $new_users = array();
  820. $enreg_course = Database::escape_string($enreg_course);
  821. foreach ($users as $index => $user) {
  822. $userid = intval($user['id']);
  823. $sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user(id_session,course_code,id_user) VALUES('$id_session','$enreg_course','$userid')";
  824. $course_session = array('course' => $enreg_course, 'added' => 1);
  825. //$user['added_at_session'] = $course_session;
  826. Database::query($sql);
  827. if (Database::affected_rows()) {
  828. $nbr_users++;
  829. }
  830. $new_users[] = $user;
  831. }
  832. $super_list[] = $new_users;
  833. //update the nbr_users field
  834. $sql_select = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND course_code='$enreg_course'";
  835. $rs = Database::query($sql_select);
  836. list($nbr_users) = Database::fetch_array($rs);
  837. $sql_update = "UPDATE $tbl_session_rel_course SET nbr_users=$nbr_users WHERE id_session='$id_session' AND course_code='$enreg_course'";
  838. Database::query($sql_update);
  839. $sql_update = "UPDATE $tbl_session SET nbr_users= '$nbr_users' WHERE id='$id_session'";
  840. Database::query($sql_update);
  841. }
  842. // We don't delete the users (thoughts while dreaming)
  843. //$sql_delete = "DELETE FROM $tbl_session_rel_user WHERE id_session = '$id_session'";
  844. //Database::query($sql_delete);
  845. $new_users = array();
  846. foreach ($users as $index => $user) {
  847. $userid = $user['id'];
  848. $sql_insert = "INSERT IGNORE INTO $tbl_session_rel_user(id_session, id_user) VALUES('$id_session','$userid')";
  849. Database::query($sql_insert);
  850. $user['added_at_session'] = 1;
  851. $new_users[] = $user;
  852. }
  853. $users = $new_users;
  854. $registered_users = get_lang('FileImported').'<br /> Import file results : <br />';
  855. // Sending emails.
  856. $addedto = '';
  857. if ($sendMail) {
  858. $i = 0;
  859. foreach ($users as $index => $user) {
  860. $emailto = api_get_person_name($user['FirstName'], $user['LastName'], null, PERSON_NAME_EMAIL_ADDRESS).' <'.$user['Email'].'>';
  861. $emailsubject = '['.api_get_setting('siteName').'] '.get_lang('YourReg').' '.api_get_setting('siteName');
  862. $emailbody = get_lang('Dear').' '.api_get_person_name($user['FirstName'], $user['LastName']).",\n\n".get_lang('YouAreReg')." ".api_get_setting('siteName')." ".get_lang('WithTheFollowingSettings')."\n\n".get_lang('Username')." : $user[UserName]\n".get_lang('Pass')." : $user[Password]\n\n".get_lang('Address')." ".api_get_setting('siteName')." ".get_lang('Is')." : ".api_get_path(WEB_PATH)." \n\n".get_lang('Problem')."\n\n".get_lang('Formula').",\n\n".api_get_person_name(api_get_setting('administratorName'), api_get_setting('administratorSurname'))."\n".get_lang('Manager')." ".api_get_setting('siteName')."\nT. ".api_get_setting('administratorTelephone')."\n".get_lang('Email')." : ".api_get_setting('emailAdministrator')."";
  863. $emailheaders = 'From: '.api_get_person_name(api_get_setting('administratorName'), api_get_setting('administratorSurname'), null, PERSON_NAME_EMAIL_ADDRESS).' <'.api_get_setting('emailAdministrator').">\n";
  864. $emailheaders .= 'Reply-To: '.api_get_setting('emailAdministrator');
  865. @api_send_mail($emailto, $emailsubject, $emailbody, $emailheaders);
  866. if (($user['added_at_platform'] == 1 && $user['added_at_session'] == 1) || $user['added_at_session'] == 1) {
  867. if ($user['added_at_platform'] == 1) {
  868. $addedto = get_lang('UserCreatedPlatform');
  869. } else {
  870. $addedto = ' ';
  871. }
  872. if ($user['added_at_session'] == 1) {
  873. $addedto .= get_lang('UserInSession');
  874. }
  875. $registered_users .= "<a href=\"../user/userInfo.php?uInfo=".$user['id']."\">".api_get_person_name($user['FirstName'], $user['LastName'])."</a> - ".$addedto.'<br />';
  876. } else {
  877. $addedto = get_lang('UserNotAdded');
  878. $registered_users .= "<a href=\"../user/userInfo.php?uInfo=".$user['id']."\">".api_get_person_name($user['FirstName'], $user['LastName'])."</a> - ".$addedto.'<br />';
  879. }
  880. }
  881. } else {
  882. $i = 0;
  883. foreach ($users as $index => $user) {
  884. if (($user['added_at_platform'] == 1 && $user['added_at_session'] == 1) || $user['added_at_session'] == 1) {
  885. if ($user['added_at_platform'] == 1) {
  886. $addedto = get_lang('UserCreatedPlatform');
  887. } else {
  888. $addedto = ' ';
  889. }
  890. if ($user['added_at_session'] == 1) {
  891. $addedto .= ' '.get_lang('UserInSession');
  892. }
  893. $registered_users .= "<a href=\"../user/userInfo.php?uInfo=".$user['id']."\">".api_get_person_name($user['FirstName'], $user['LastName'])."</a> - ".$addedto.'<br />';
  894. } else {
  895. $addedto = get_lang('UserNotAdded');
  896. $registered_users .= "<a href=\"../user/userInfo.php?uInfo=".$user['id']."\">".api_get_person_name($user['FirstName'], $user['LastName'])."</a> - ".$addedto.'<br />';
  897. }
  898. }
  899. }
  900. header('Location: course.php?id_session='.$id_session.'&action=show_message&message='.urlencode($registered_users));
  901. exit ();
  902. //header('Location: resume_session.php?id_session='.$id_session);
  903. }
  904. /**
  905. * Reads CSV-file.
  906. * @param string $file Path to the CSV-file
  907. * @return array All userinformation read from the file
  908. */
  909. function parse_csv_data($file) {
  910. $users = Import :: csv_to_array($file);
  911. foreach ($users as $index => $user) {
  912. if (isset ($user['Courses'])) {
  913. $user['Courses'] = explode('|', trim($user['Courses']));
  914. }
  915. $users[$index] = $user;
  916. }
  917. return $users;
  918. }
  919. /**
  920. * XML-parser: the handler at the beginning of element.
  921. */
  922. function element_start($parser, $data) {
  923. $data = api_utf8_decode($data);
  924. global $user;
  925. global $current_tag;
  926. switch ($data) {
  927. case 'Contact' :
  928. $user = array ();
  929. break;
  930. default :
  931. $current_tag = $data;
  932. }
  933. }
  934. /**
  935. * XML-parser: the handler at the end of element.
  936. */
  937. function element_end($parser, $data) {
  938. $data = api_utf8_decode($data);
  939. global $user;
  940. global $users;
  941. global $current_value;
  942. global $purification_option_for_usernames;
  943. $user[$data] = $current_value;
  944. switch ($data) {
  945. case 'Contact' :
  946. $user['UserName'] = UserManager::purify_username($user['UserName'], $purification_option_for_usernames);
  947. $users[] = $user;
  948. break;
  949. default :
  950. $user[$data] = $current_value;
  951. break;
  952. }
  953. }
  954. /**
  955. * XML-parser: the handler for character data.
  956. */
  957. function character_data($parser, $data) {
  958. $data = trim(api_utf8_decode($data));
  959. global $current_value;
  960. $current_value = $data;
  961. }
  962. /**
  963. * Reads XML-file.
  964. * @param string $file Path to the XML-file
  965. * @return array All userinformation read from the file
  966. */
  967. function parse_xml_data($file) {
  968. global $current_tag;
  969. global $current_value;
  970. global $user;
  971. global $users;
  972. $users = array ();
  973. $parser = xml_parser_create('UTF-8');
  974. xml_set_element_handler($parser, array('MySpace','element_start'), array('MySpace','element_end'));
  975. xml_set_character_data_handler($parser, "character_data");
  976. xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
  977. xml_parse($parser, api_utf8_encode_xml(file_get_contents($file)));
  978. xml_parser_free($parser);
  979. return $users;
  980. }
  981. }