index.php 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228
  1. <?php // $Id: index.php 16620 2008-10-25 20:03:54Z yannoo $
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2004-2009 Dokeos SPRL
  6. Copyright (c) 2003 Ghent University (UGent)
  7. Copyright (c) various contributors
  8. For a full list of contributors, see "credits.txt".
  9. The full license can be read in "license.txt".
  10. This program is free software; you can redistribute it and/or
  11. modify it under the terms of the GNU General Public License
  12. as published by the Free Software Foundation; either version 2
  13. of the License, or (at your option) any later version.
  14. See the GNU General Public License for more details.
  15. Contact address: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium
  16. Mail: info@dokeos.com
  17. ==============================================================================
  18. */
  19. /**
  20. * @todo use constant for $this_section
  21. */
  22. // name of the language file that needs to be included
  23. $language_file = array ('registration', 'index','tracking');
  24. $cidReset=true;
  25. require ('../inc/global.inc.php');
  26. require (api_get_path(LIBRARY_PATH).'tracking.lib.php');
  27. require_once(api_get_path(LIBRARY_PATH).'course.lib.php');
  28. require_once(api_get_path(LIBRARY_PATH).'export.lib.inc.php');
  29. ob_start();
  30. $export_csv = isset($_GET['export']) && $_GET['export'] == 'csv' ? true : false;
  31. $csv_content = array();
  32. $nameTools= get_lang("MySpace");
  33. $this_section = "session_my_space";
  34. // access control
  35. api_block_anonymous_users();
  36. if(!$export_csv)
  37. {
  38. Display :: display_header($nameTools);
  39. }
  40. else
  41. {
  42. if ($_GET['view'] == 'admin' AND $_GET['display'] == 'useroverview')
  43. {
  44. export_tracking_user_overview();
  45. exit;
  46. }
  47. }
  48. // Database table definitions
  49. $tbl_user = Database :: get_main_table(TABLE_MAIN_USER);
  50. $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE);
  51. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  52. $tbl_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  53. $tbl_sessions = Database :: get_main_table(TABLE_MAIN_SESSION);
  54. $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE);
  55. $tbl_session_user = Database :: get_main_table(TABLE_MAIN_SESSION_USER);
  56. $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  57. $tbl_admin = Database :: get_main_table(TABLE_MAIN_ADMIN);
  58. /********************
  59. * FUNCTIONS
  60. ********************/
  61. function count_teacher_courses()
  62. {
  63. global $nb_teacher_courses;
  64. return $nb_teacher_courses;
  65. }
  66. function count_coaches()
  67. {
  68. global $total_no_coachs;
  69. return $total_no_coachs;
  70. }
  71. function sort_users($a,$b){
  72. $a = trim(strtolower($a[$_SESSION['tracking_column']]));
  73. $b = trim(strtolower($b[$_SESSION['tracking_column']]));
  74. if($_SESSION['tracking_direction'] == 'DESC')
  75. return strcmp($b, $a);
  76. else
  77. return strcmp($a, $b);
  78. }
  79. /**************************
  80. * MAIN CODE
  81. ***************************/
  82. $isCoach = api_is_coach();
  83. $isPlatformAdmin = api_is_platform_admin();
  84. $view = isset($_GET['view']) ? $_GET['view'] : 'teacher';
  85. $menu_items = array();
  86. global $_configuration;
  87. if(api_is_allowed_to_create_course()) {
  88. $sqlNbCours = " SELECT course_rel_user.course_code, course.title
  89. FROM $tbl_course_user as course_rel_user
  90. INNER JOIN $tbl_course as course
  91. ON course.code = course_rel_user.course_code
  92. WHERE course_rel_user.user_id='".$_user['user_id']."' AND course_rel_user.status='1'
  93. ORDER BY course.title";
  94. if ($_configuration['multiple_access_urls']==true) {
  95. $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
  96. $access_url_id = api_get_current_access_url_id();
  97. if ($access_url_id != -1){
  98. $sqlNbCours = " SELECT course_rel_user.course_code, course.title
  99. FROM $tbl_course_user as course_rel_user
  100. INNER JOIN $tbl_course as course
  101. ON course.code = course_rel_user.course_code
  102. INNER JOIN $tbl_course_rel_access_url course_rel_url
  103. ON (course_rel_url.course_code= course.code)
  104. WHERE access_url_id = $access_url_id AND course_rel_user.user_id='".$_user['user_id']."' AND course_rel_user.status='1'
  105. ORDER BY course.title";
  106. }
  107. }
  108. $resultNbCours = api_sql_query($sqlNbCours, __FILE__, __LINE__);
  109. $a_courses = api_store_result($resultNbCours);
  110. $nb_teacher_courses = count($a_courses);
  111. if($nb_teacher_courses)
  112. {
  113. if(!$isCoach && !api_is_platform_admin())
  114. {
  115. $view = 'teacher';
  116. }
  117. if($view=='teacher')
  118. {
  119. $menu_items[] = get_lang('TeacherInterface');
  120. $title = get_lang('YourCourseList');
  121. }
  122. else
  123. {
  124. $menu_items[] = '<a href="'.api_get_self().'?view=teacher">'.get_lang('TeacherInterface').'</a>';
  125. }
  126. }
  127. }
  128. if($isCoach)
  129. {
  130. if($nb_teacher_courses==0 && !api_is_platform_admin())
  131. {
  132. $view = 'coach';
  133. }
  134. if($view=='coach')
  135. {
  136. $menu_items[] = get_lang('CoachInterface');
  137. $title = get_lang('YourStatistics');
  138. }
  139. else
  140. {
  141. $menu_items[] = '<a href="'.api_get_self().'?view=coach">'.get_lang('CoachInterface').'</a>';
  142. }
  143. }
  144. if(api_is_platform_admin())
  145. {
  146. if(!$isCoach && $nb_teacher_courses==0)
  147. {
  148. $view = 'admin';
  149. }
  150. if($view=='admin')
  151. {
  152. $menu_items[] = get_lang('AdminInterface');
  153. $title = get_lang('CoachList');
  154. }
  155. else
  156. {
  157. $menu_items[] = '<a href="'.api_get_self().'?view=admin">'.get_lang('AdminInterface').'</a>';
  158. }
  159. }
  160. if($_user['status']==DRH)
  161. {
  162. $view = 'drh';
  163. $title = get_lang('DrhInterface');
  164. $menu_items[] = '<a href="'.api_get_self().'?view=drh">'.get_lang('DrhInterface').'</a>';
  165. }
  166. echo '<div class="actions">';
  167. $nb_menu_items = count($menu_items);
  168. if($nb_menu_items>1)
  169. {
  170. foreach($menu_items as $key=> $item)
  171. {
  172. echo $item;
  173. if($key!=$nb_menu_items-1)
  174. {
  175. echo ' | ';
  176. }
  177. }
  178. }
  179. echo '
  180. <a href="#" onclick="window.print()"><img align="absbottom" src="../img/printmgr.gif">&nbsp;'.get_lang('Print').'</a>
  181. <a href="'.api_get_self().'?export=csv&view='.$view.'"><img align="absbottom" src="../img/excel.gif">&nbsp;'.get_lang('ExportAsCSV').'</a>
  182. ';
  183. echo '</div>';
  184. echo '<h4>'.$title.'</h4>';
  185. if($_user['status']==DRH && $view=='drh')
  186. {
  187. $a_students = Tracking :: get_student_followed_by_drh($_user['user_id']);
  188. $courses_of_the_platform = CourseManager :: get_real_course_list();
  189. foreach($courses_of_the_platform as $course)
  190. $a_courses[$course['code']] = $course['code'];
  191. }
  192. if($isCoach && $view=='coach')
  193. {
  194. $a_students = Tracking :: get_student_followed_by_coach($_user['user_id']);
  195. $a_courses = Tracking :: get_courses_followed_by_coach($_user['user_id']);
  196. }
  197. if($view=='coach' || $view=='drh')
  198. {
  199. $nbStudents = count($a_students);
  200. $totalTimeSpent = 0;
  201. $totalCourses = 0;
  202. $avgTotalProgress = 0;
  203. $avgResultsToExercises = 0;
  204. $nb_inactive_students = 0;
  205. $nb_posts = $nb_assignments = 0;
  206. foreach($a_students as $student_id)
  207. {
  208. // inactive students
  209. $last_connection_date = Tracking :: get_last_connection_date($student_id,true,true);
  210. if($last_connection_date!=false)
  211. {
  212. /*
  213. list($last_connection_date, $last_connection_hour) = explode(' ',$last_connection_date);
  214. $last_connection_date = explode('-',$last_connection_date);
  215. $last_connection_hour = explode(':',$last_connection_hour);
  216. $last_connection_hour[0];
  217. $last_connection_time = mktime($last_connection_hour[0],$last_connection_hour[1],$last_connection_hour[2],$last_connection_date[1],$last_connection_date[2],$last_connection_date[0]);
  218. */
  219. if(time()-(3600*24*7) > $last_connection_time)
  220. {
  221. $nb_inactive_students++;
  222. }
  223. }
  224. else
  225. {
  226. $nb_inactive_students++;
  227. }
  228. $totalTimeSpent += Tracking :: get_time_spent_on_the_platform($student_id);
  229. $totalCourses += Tracking :: count_course_per_student($student_id);
  230. $avgStudentProgress = $avgStudentScore = 0;
  231. $nb_courses_student = 0;
  232. foreach($a_courses as $course_code)
  233. {
  234. if(CourseManager :: is_user_subscribed_in_course($student_id, $course_code, true))
  235. {
  236. $nb_courses_student++;
  237. $nb_posts += Tracking :: count_student_messages($student_id,$course_code);
  238. $nb_assignments += Tracking :: count_student_assignments($student_id,$course_code);
  239. $avgStudentProgress += Tracking :: get_avg_student_progress($student_id,$course_code);
  240. $avgStudentScore += Tracking :: get_avg_student_score($student_id,$course_code);
  241. if($nb_posts !== null && $nb_assignments !== null && $avgStudentProgress !== null && $avgStudentScore !== null)
  242. {
  243. //if one of these scores is null, it means that we had a problem connecting to the right database, so don't count it in
  244. $nb_courses_student++;
  245. }
  246. }
  247. }
  248. // average progress of the student
  249. $avgStudentProgress = $avgStudentProgress / $nb_courses_student;
  250. $avgTotalProgress += $avgStudentProgress;
  251. // average test results of the student
  252. $avgStudentScore = $avgStudentScore / $nb_courses_student;
  253. $avgResultsToExercises += $avgStudentScore;
  254. }
  255. $avgTotalProgress = 0;
  256. $avgResultsToExercises = 0;
  257. $avgCoursesPerStudent = 0;
  258. $avgTimeSpent = 0;
  259. $nb_assignments = 0;
  260. $nb_posts = 0;
  261. if ($nbStudents > 0) {
  262. // average progress
  263. $avgTotalProgress = $avgTotalProgress/$nbStudents;
  264. // average results to the tests
  265. $avgResultsToExercises = $avgResultsToExercises/$nbStudents;
  266. // average courses by student
  267. $avgCoursesPerStudent = round($totalCourses / $nbStudents,2);
  268. // average time spent on the platform
  269. $avgTimeSpent = $totalTimeSpent / $nbStudents;
  270. // average assignments
  271. $nb_assignments = $nb_assignments / $nbStudents;
  272. // average posts
  273. $nb_posts = $nb_posts / $nbStudents;
  274. }
  275. //csv part
  276. if($export_csv)
  277. {
  278. $csv_content[] = array( get_lang('Probationers'));
  279. $csv_content[] = array( get_lang('InactivesStudents'),$nb_inactive_students );
  280. $csv_content[] = array( get_lang('AverageTimeSpentOnThePlatform'),$avgTimeSpent);
  281. $csv_content[] = array( get_lang('AverageCoursePerStudent'),$avgCoursesPerStudent);
  282. $csv_content[] = array( get_lang('AverageProgressInLearnpath'),$avgTotalProgress);
  283. $csv_content[] = array( get_lang('AverageResultsToTheExercices'),$avgResultsToExercises);
  284. $csv_content[] = array( get_lang('AveragePostsInForum'),$nb_posts);
  285. $csv_content[] = array( get_lang('AverageAssignments'),$nb_assignments);
  286. $csv_content[] = array();
  287. }
  288. // html part
  289. else
  290. {
  291. echo '
  292. <div class="admin_section">
  293. <h4>
  294. <a href="student.php"><img src="'.api_get_path(WEB_IMG_PATH).'students.gif">&nbsp;'.get_lang('Probationers').' ('.$nbStudents.')'.'</a>
  295. </h4>
  296. <table class="data_table">
  297. <tr>
  298. <td>
  299. '.get_lang('InactivesStudents').'
  300. </td>
  301. <td align="right">
  302. '.$nb_inactive_students.'
  303. </td>
  304. </tr>
  305. <tr>
  306. <td>
  307. '.get_lang('AverageTimeSpentOnThePlatform').'
  308. </td>
  309. <td align="right">
  310. '.api_time_to_hms($avgTimeSpent).'
  311. </td>
  312. </tr>
  313. <tr>
  314. <td>
  315. '.get_lang('AverageCoursePerStudent').'
  316. </td>
  317. <td align="right">
  318. '.$avgCoursesPerStudent.'
  319. </td>
  320. </tr>
  321. <tr>
  322. <td>
  323. '.get_lang('AverageProgressInLearnpath').'
  324. </td>
  325. <td align="right">
  326. '.round($avgTotalProgress,2).' %
  327. </td>
  328. </tr>
  329. <tr>
  330. <td>
  331. '.get_lang('AverageResultsToTheExercices').'
  332. </td>
  333. <td align="right">
  334. '.round($avgResultsToExercises,2).' %
  335. </td>
  336. </tr>
  337. <tr>
  338. <td>
  339. '.get_lang('AveragePostsInForum').'
  340. </td>
  341. <td align="right">
  342. '.round($nb_posts,2).'
  343. </td>
  344. </tr>
  345. <tr>
  346. <td>
  347. '.get_lang('AverageAssignments').'
  348. </td>
  349. <td align="right">
  350. '.round($nb_assignments,2).'
  351. </td>
  352. </tr>
  353. </table>
  354. <a href="student.php">'.get_lang('SeeStudentList').'</a>
  355. </div>';
  356. }
  357. }
  358. if($view == 'coach')
  359. {
  360. /****************************************
  361. * Infos about sessions of the coach
  362. ****************************************/
  363. $a_sessions = Tracking :: get_sessions_coached_by_user($_user['user_id']);
  364. $nbSessions = count($a_sessions);
  365. $nb_sessions_past = $nb_sessions_future = $nb_sessions_current = 0;
  366. $a_courses = array();
  367. foreach($a_sessions as $a_session)
  368. {
  369. if($a_session['date_start'] == '0000-00-00')
  370. {
  371. $nb_sessions_current ++;
  372. }
  373. else
  374. {
  375. $date_start = explode('-',$a_session['date_start']);
  376. $time_start = mktime(0,0,0,$date_start[1],$date_start[2],$date_start[0]);
  377. $date_end = explode('-',$a_session['date_end']);
  378. $time_end = mktime(0,0,0,$date_end[1],$date_end[2],$date_end[0]);
  379. if($time_start < time() && time() < $time_end)
  380. {
  381. $nb_sessions_current++;
  382. }
  383. else if(time() < $time_start)
  384. {
  385. $nb_sessions_future++;
  386. }
  387. else if(time() > $time_end)
  388. {
  389. $nb_sessions_past++;
  390. }
  391. }
  392. $a_courses = array_merge($a_courses, Tracking::get_courses_list_from_session($a_session['id']));
  393. }
  394. $nb_courses_per_session = round(count($a_courses)/$nbSessions,2);
  395. //csv part
  396. if($export_csv)
  397. {
  398. $csv_content[] = array( get_lang('Sessions'));
  399. $csv_content[] = array( get_lang('NbActiveSessions').';'.$nb_sessions_current);
  400. $csv_content[] = array( get_lang('NbPastSessions').';'.$nb_sessions_past);
  401. $csv_content[] = array( get_lang('NbFutureSessions').';'.$nb_sessions_future);
  402. $csv_content[] = array( get_lang('NbStudentPerSession').';'.round($nbStudents/$nbSessions,2));
  403. $csv_content[] = array( get_lang('NbCoursesPerSession').';'.$nb_courses_per_session);
  404. $csv_content[] = array();
  405. }
  406. // html part
  407. else
  408. {
  409. echo '
  410. <div class="admin_section">
  411. <h4>
  412. <a href="session.php"><img src="'.api_get_path(WEB_IMG_PATH).'sessions.gif">&nbsp;'.get_lang('Sessions').' ('.$nbSessions.')'.'</a>
  413. </h4>
  414. <table class="data_table">
  415. <tr>
  416. <td>
  417. '.get_lang('NbActiveSessions').'
  418. </td>
  419. <td align="right">
  420. '.$nb_sessions_current.'
  421. </td>
  422. </tr>
  423. <tr>
  424. <td>
  425. '.get_lang('NbPastSessions').'
  426. </td>
  427. <td align="right">
  428. '.$nb_sessions_past.'
  429. </td>
  430. </tr>
  431. <tr>
  432. <td>
  433. '.get_lang('NbFutureSessions').'
  434. </td>
  435. <td align="right">
  436. '.$nb_sessions_future.'
  437. </td>
  438. </tr>
  439. <tr>
  440. <td>
  441. '.get_lang('NbStudentPerSession').'
  442. </td>
  443. <td align="right">
  444. '.round($nbStudents/$nbSessions,2).'
  445. </td>
  446. </tr>
  447. <tr>
  448. <td>
  449. '.get_lang('NbCoursesPerSession').'
  450. </td>
  451. <td align="right">
  452. '.$nb_courses_per_session.'
  453. </td>
  454. </tr>
  455. </table>
  456. <a href="session.php">'.get_lang('SeeSessionList').'</a>
  457. </div>';
  458. }
  459. }
  460. echo '<div class="clear">&nbsp;</div>';
  461. if(api_is_allowed_to_create_course() && $view=='teacher')
  462. {
  463. if($nb_teacher_courses)
  464. {
  465. $table = new SortableTable('tracking_list_course', 'count_teacher_courses');
  466. $parameters['view'] = 'teacher';
  467. $parameters['class'] = 'data_table';
  468. $table->set_additional_parameters($parameters);
  469. $table -> set_header(0, get_lang('CourseTitle'), false, 'align="center"');
  470. $table -> set_header(1, get_lang('NbStudents'), false);
  471. $table -> set_header(2, get_lang('AvgTimeSpentInTheCourse').Display :: return_icon('info3.gif', get_lang('TimeOfActiveByTraining')),false);
  472. $table -> set_header(3, get_lang('AvgStudentsProgress').Display :: return_icon('info3.gif', get_lang('AvgAllUsersInAllCourses')), false);
  473. $table -> set_header(4, get_lang('AvgCourseScore').Display :: return_icon('info3.gif', get_lang('AvgAllUsersInAllCourses')), false);
  474. $table -> set_header(5, get_lang('AvgExercisesScore').Display :: return_icon('info3.gif', get_lang('AvgAllUsersInAllCourses')), false);
  475. $table -> set_header(6, get_lang('AvgMessages'), false);
  476. $table -> set_header(7, get_lang('AvgAssignments'), false);
  477. $table -> set_header(8, get_lang('Details'), false);
  478. $csv_content[] = array(
  479. get_lang('CourseTitle'),
  480. get_lang('NbStudents'),
  481. get_lang('AvgTimeSpentInTheCourse'),
  482. get_lang('AvgStudentsProgress'),
  483. get_lang('AvgCourseScore'),
  484. get_lang('AvgExercisesScore'),
  485. get_lang('AvgMessages'),
  486. get_lang('AvgAssignments')
  487. );
  488. $a_course_students = array();
  489. //
  490. foreach($a_courses as $course)
  491. {
  492. $course_code = $course['course_code'];
  493. $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;
  494. // students directly subscribed to the course
  495. $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'";
  496. $rs = api_sql_query($sql, __FILE__, __LINE__);
  497. while($row = Database::fetch_array($rs))
  498. {
  499. $nb_students_in_course++;
  500. // tracking datas
  501. $avg_progress_in_course += Tracking :: get_avg_student_progress ($row['user_id'], $course_code);
  502. $avg_score_in_course += Tracking :: get_avg_student_score ($row['user_id'], $course_code);
  503. $avg_score_in_exercise += Tracking :: get_avg_student_exercise_score ($row['user_id'], $course_code);
  504. $avg_time_spent_in_course += Tracking :: get_time_spent_on_the_course ($row['user_id'], $course_code);
  505. $avg_messages_in_course += Tracking :: count_student_messages ($row['user_id'], $course_code);
  506. $avg_assignments_in_course += Tracking :: count_student_assignments ($row['user_id'], $course_code);
  507. $a_course_students[] = $row['user_id'];
  508. }
  509. // students subscribed to the course through a session
  510. if(api_get_setting('use_session_mode') == 'true')
  511. {
  512. $sql = 'SELECT id_user as user_id
  513. FROM '.$tbl_session_course_user.'
  514. WHERE course_code="'.addslashes($course_code).'" ORDER BY course_code';
  515. $rs = api_sql_query($sql, __FILE__, __LINE__);
  516. while($row = Database::fetch_array($rs))
  517. {
  518. if(!in_array($row['user_id'], $a_course_students))
  519. {
  520. $nb_students_in_course++;
  521. // tracking datas
  522. $avg_progress_in_course += Tracking :: get_avg_student_progress ($row['user_id'], $course_code);
  523. $avg_score_in_course += Tracking :: get_avg_student_score ($row['user_id'], $course_code);
  524. $avg_score_in_exercise += Tracking :: get_avg_student_exercise_score ($row['user_id'], $course_code);
  525. $avg_time_spent_in_course += Tracking :: get_time_spent_on_the_course ($row['user_id'], $course_code);
  526. $avg_messages_in_course += Tracking :: count_student_messages ($row['user_id'], $course_code);
  527. $avg_assignments_in_course += Tracking :: count_student_assignments ($row['user_id'], $course_code);
  528. $a_course_students[] = $row['user_id'];
  529. }
  530. }
  531. }
  532. if($nb_students_in_course>0)
  533. {
  534. $avg_time_spent_in_course = api_time_to_hms($avg_time_spent_in_course / $nb_students_in_course);
  535. $avg_progress_in_course = round($avg_progress_in_course / $nb_students_in_course,2).' %';
  536. $avg_score_in_course = round($avg_score_in_course / $nb_students_in_course,2).' %';
  537. $avg_score_in_exercise = round($avg_score_in_exercise / $nb_students_in_course,2).' %';
  538. $avg_messages_in_course = round($avg_messages_in_course / $nb_students_in_course,2);
  539. $avg_assignments_in_course = round($avg_assignments_in_course / $nb_students_in_course,2);
  540. }
  541. $table_row = array();
  542. $table_row[] = $course['title'];
  543. $table_row[] = $nb_students_in_course;
  544. $table_row[] = $avg_time_spent_in_course;
  545. $table_row[] = $avg_progress_in_course;
  546. $table_row[] = $avg_score_in_course;
  547. $table_row[] = $avg_score_in_exercise;
  548. $table_row[] = $avg_messages_in_course;
  549. $table_row[] = $avg_assignments_in_course;
  550. $table_row[] = '<center><a href="../tracking/courseLog.php?cidReq='.$course_code.'&studentlist=true"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
  551. $csv_content[] = array(
  552. html_entity_decode($course['title']),
  553. $nb_students_in_course,
  554. $avg_time_spent_in_course,
  555. $avg_progress_in_course,
  556. $avg_score_in_course,
  557. $avg_score_in_exercise,
  558. $avg_messages_in_course,
  559. $avg_assignments_in_course,
  560. );
  561. $table -> addRow($table_row, 'align="right"');
  562. $a_course_students = array();
  563. }
  564. $table -> updateColAttributes(0,array('align'=>'left'));
  565. $table -> updateColAttributes(7,array('align'=>'center'));
  566. $table -> display();
  567. }
  568. }
  569. if(api_is_platform_admin() && $view=='admin')
  570. {
  571. echo '<a href="'.api_get_self().'?view=admin&amp;display=coaches">'.get_lang('DisplayCoaches').'</a> | ';
  572. echo '<a href="'.api_get_self().'?view=admin&amp;display=useroverview">'.get_lang('DisplayUserOverview').'</a>';
  573. if ($_GET['display'] == 'useroverview')
  574. {
  575. echo ' | <a href="'.api_get_self().'?view=admin&amp;display=useroverview&amp;export=options">'.get_lang('ExportUserOverviewOptions').'</a>';
  576. }
  577. if ($_GET['display'] === 'useroverview')
  578. {
  579. display_tracking_user_overview();
  580. }
  581. else
  582. {
  583. $tracking_column = isset($_GET['tracking_list_coaches_column']) ? $_GET['tracking_list_coaches_column'] : 0;
  584. $tracking_direction = (isset($_GET['tracking_list_coaches_direction']) && in_array(strtoupper($_GET['tracking_list_coaches_direction']),array('ASC','DESC','ASCENDING','DESCENDING','0','1'))) ? $_GET['tracking_list_coaches_direction'] : 'DESC';
  585. //prepare array for column order - when impossible, use lastname
  586. $order = array(0=>'firstname',1=>'lastname',2=>'lastname',3=>'login_date',4=>'lastname',5=>'lastname');
  587. $table = new SortableTable('tracking_list_coaches', 'count_coaches');
  588. $parameters['view'] = 'admin';
  589. $table->set_additional_parameters($parameters);
  590. $table -> set_header(0, get_lang('FirstName'), true, 'align="center"');
  591. $table -> set_header(1, get_lang('LastName'), true, 'align="center"');
  592. $table -> set_header(2, get_lang('TimeSpentOnThePlatform'), false);
  593. $table -> set_header(3, get_lang('LastConnexion'), true, 'align="center"');
  594. $table -> set_header(4, get_lang('NbStudents'), false);
  595. $table -> set_header(5, get_lang('CountCours'), false);
  596. $table -> set_header(6, get_lang('NumberOfSessions'), false);
  597. $table -> set_header(7, get_lang('Sessions'), false,'align="center"');
  598. $csv_content[] = array(
  599. get_lang('FirstName'),
  600. get_lang('LastName'),
  601. get_lang('TimeSpentOnThePlatform'),
  602. get_lang('LastConnexion'),
  603. get_lang('NbStudents'),
  604. get_lang('CountCours'),
  605. get_lang('NumberOfSessions')
  606. );
  607. $tbl_track_login = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
  608. $sqlCoachs = " SELECT DISTINCT id_coach, user_id, lastname, firstname, MAX(login_date) as login_date
  609. FROM $tbl_user, $tbl_session_course, $tbl_track_login
  610. WHERE id_coach=user_id AND login_user_id=user_id
  611. GROUP BY user_id " ;
  612. // ORDER BY login_date ".$tracking_direction;
  613. if ($_configuration['multiple_access_urls']==true) {
  614. $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  615. $access_url_id = api_get_current_access_url_id();
  616. if ($access_url_id != -1){
  617. $sqlCoachs = " SELECT DISTINCT id_coach, user_id, lastname, firstname, MAX(login_date) as login_date
  618. FROM $tbl_user, $tbl_session_course, $tbl_track_login , $tbl_session_rel_access_url session_rel_url
  619. WHERE id_coach=user_id AND login_user_id=user_id AND access_url_id = $access_url_id AND session_rel_url.session_id=id_session
  620. GROUP BY user_id " ;
  621. }
  622. }
  623. if(!empty($order[$tracking_column]))
  624. {
  625. $sqlCoachs .= "ORDER BY ".$order[$tracking_column]." ".$tracking_direction;
  626. }
  627. $result_coaches=api_sql_query($sqlCoachs, __FILE__, __LINE__);
  628. $total_no_coachs = Database::num_rows($result_coaches);
  629. $global_coachs=array();
  630. while($a_coach=Database::fetch_array($result_coaches)){
  631. $global_coachs[$a_coach['user_id']] = $a_coach;
  632. }
  633. $sql_session_coach = 'SELECT session.id_coach, user_id, lastname, firstname, MAX(login_date) as login_date
  634. FROM '.$tbl_user.','.$tbl_sessions.' as session,'.$tbl_track_login.'
  635. WHERE id_coach=user_id AND login_user_id=user_id
  636. GROUP BY user_id
  637. ORDER BY login_date '.$tracking_direction;
  638. if ($_configuration['multiple_access_urls']==true) {
  639. $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  640. $access_url_id = api_get_current_access_url_id();
  641. if ($access_url_id != -1){
  642. $sql_session_coach = 'SELECT session.id_coach, user_id, lastname, firstname, MAX(login_date) as login_date
  643. FROM '.$tbl_user.','.$tbl_sessions.' as session,'.$tbl_track_login.' , '.$tbl_session_rel_access_url.' as session_rel_url
  644. WHERE id_coach=user_id AND login_user_id=user_id AND access_url_id = '.$access_url_id.' AND session_rel_url.session_id=session.id
  645. GROUP BY user_id
  646. ORDER BY login_date '.$tracking_direction;
  647. }
  648. }
  649. $result_sessions_coach=api_sql_query($sql_session_coach, __FILE__, __LINE__);
  650. $total_no_coachs += Database::num_rows($result_sessions_coach);
  651. while($a_coach=Database::fetch_array($result_sessions_coach)){
  652. $global_coachs[$a_coach['user_id']] = $a_coach;
  653. }
  654. $all_datas=array();
  655. foreach($global_coachs as $id_coach => $a_coachs){
  656. $time_on_platform = api_time_to_hms(Tracking :: get_time_spent_on_the_platform($a_coachs['user_id']));
  657. $last_connection = Tracking :: get_last_connection_date($a_coachs['user_id']);
  658. $nb_students = count(Tracking :: get_student_followed_by_coach($a_coachs['user_id']));
  659. $nb_courses = count(Tracking :: get_courses_followed_by_coach($a_coachs['user_id']));
  660. $nb_sessions = count(Tracking :: get_sessions_coached_by_user($a_coachs['user_id']));
  661. $table_row = array();
  662. $table_row[] = $a_coachs['firstname'];
  663. $table_row[] = $a_coachs['lastname'];
  664. $table_row[] = $time_on_platform;
  665. $table_row[] = $last_connection;
  666. $table_row[] = $nb_students;
  667. $table_row[] = $nb_courses;
  668. $table_row[] = $nb_sessions;
  669. $table_row[] = '<center><a href="session.php?id_coach='.$a_coachs['user_id'].'"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
  670. $all_datas[] = $table_row;
  671. $csv_content[] = array(
  672. html_entity_decode($a_coachs['firstname']),
  673. html_entity_decode($a_coachs['lastname']),
  674. $time_on_platform,
  675. $last_connection,
  676. $nb_courses,
  677. $nb_sessions
  678. );
  679. }
  680. if($tracking_column != 3){
  681. usort($all_datas, 'sort_users');
  682. if($tracking_direction == 'DESC')
  683. rsort($all_datas);
  684. }
  685. if($export_csv && $tracking_column != 3)
  686. {
  687. usort($csv_content, 'sort_users');
  688. }
  689. foreach($all_datas as $row)
  690. {
  691. $table -> addRow($row,'align="right"');
  692. }
  693. $table -> updateColAttributes(0,array('align'=>'left'));
  694. $table -> updateColAttributes(1,array('align'=>'left'));
  695. $table -> updateColAttributes(3,array('align'=>'left'));
  696. $table -> updateColAttributes(7,array('align'=>'center'));
  697. $table -> display();
  698. }
  699. }
  700. // send the csv file if asked
  701. if($export_csv)
  702. {
  703. ob_end_clean();
  704. /*echo "<pre>";
  705. print_r($csv_content);
  706. echo "</pre>";*/
  707. Export :: export_table_csv($csv_content, 'reporting_index');
  708. }
  709. //footer
  710. if(!$export_csv)
  711. {
  712. Display::display_footer();
  713. }
  714. /**
  715. * This function exports the table that we see in display_tracking_user_overview()
  716. *
  717. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  718. * @version Dokeos 1.8.6
  719. * @since October 2008
  720. */
  721. function export_tracking_user_overview()
  722. {
  723. // database table definitions
  724. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  725. // the values of the sortable table
  726. if ($_GET['tracking_user_overview_page_nr'])
  727. {
  728. $from = $_GET['tracking_user_overview_page_nr'];
  729. }
  730. else
  731. {
  732. $from = 0;
  733. }
  734. if ($_GET['tracking_user_overview_column'])
  735. {
  736. $orderby = $_GET['tracking_user_overview_column'];
  737. }
  738. else
  739. {
  740. $orderby = 0;
  741. }
  742. if ($_GET['tracking_user_overview_direction'])
  743. {
  744. $direction = $_GET['tracking_user_overview_direction'];
  745. }
  746. else
  747. {
  748. $direction = 'ASC';
  749. }
  750. $user_data = get_user_data_tracking_overview($from, 1000 , $orderby, $direction);
  751. // the first line of the csv file with the column headers
  752. $csv_row = array();
  753. $csv_row[] = get_lang('OfficialCode');
  754. $csv_row[] = get_lang('LastName');
  755. $csv_row[] = get_lang('FirstName');
  756. $csv_row[] = get_lang('LoginName');
  757. $csv_row[] = get_lang('CourseCode');
  758. // the additional user defined fields (only those that were selected to be exported)
  759. require_once (api_get_path(LIBRARY_PATH).'usermanager.lib.php');
  760. $fields = UserManager::get_extra_fields(0,50,5,'ASC');
  761. foreach ($_SESSION['additional_export_fields'] as $key=>$extra_field_export)
  762. {
  763. $csv_row[] = $fields[$extra_field_export][3];
  764. $field_names_to_be_exported[] = 'extra_'.$fields[$extra_field_export][1];
  765. }
  766. $csv_row[] = get_lang('AvgTimeSpentInTheCourse');
  767. $csv_row[] = get_lang('AvgStudentsProgress');
  768. $csv_row[] = get_lang('AvgCourseScore');
  769. $csv_row[] = get_lang('AvgExercisesScore');
  770. $csv_row[] = get_lang('AvgMessages');
  771. $csv_row[] = get_lang('AvgAssignments');
  772. $csv_row[] = get_lang('TotalExercisesScoreObtained');
  773. $csv_row[] = get_lang('TotalExercisesScorePossible');
  774. $csv_row[] = get_lang('TotalExercisesAnswered');
  775. $csv_row[] = get_lang('TotalExercisesScorePercentage');
  776. $csv_row[] = get_lang('FirstLogin');
  777. $csv_row[] = get_lang('LatestLogin');
  778. $csv_content[] = $csv_row;
  779. // the other lines (the data)
  780. foreach($user_data as $key=>$user)
  781. {
  782. // getting all the courses of the user
  783. $sql = "SELECT * FROM $tbl_course_user WHERE user_id = '".Database::escape_string($user[4])."'";
  784. $result = api_sql_query($sql, __FILE__, __LINE__);
  785. while ($row = Database::fetch_row($result))
  786. {
  787. $csv_row = array();
  788. // user official code
  789. $csv_row[] = $user[0];
  790. // user last name
  791. $csv_row[] = $user[1];
  792. // user first name
  793. $csv_row[] = $user[2];
  794. // user login name
  795. $csv_row[] = $user[3];
  796. // course code
  797. $csv_row[] = $row[0];
  798. // the additional defined user fields
  799. $extra_fields = get_user_overview_export_extra_fields($user[4]);
  800. foreach ($field_names_to_be_exported as $key=>$extra_field_export)
  801. {
  802. $csv_row[] = $extra_fields[$extra_field_export];
  803. }
  804. // time spent in the course
  805. $csv_row[] = api_time_to_hms(Tracking :: get_time_spent_on_the_course ($user[4], $row[0]));
  806. // student progress in course
  807. $csv_row[] = round(Tracking :: get_avg_student_progress ($user[4], $row[0]),2);
  808. // student score
  809. $csv_row[] = round(Tracking :: get_avg_student_score ($user[4], $row[0]),2);
  810. // student tes score
  811. $csv_row[] = round(Tracking :: get_avg_student_exercise_score ($user[4], $row[0]),2);
  812. // student messages
  813. $csv_row[] = Tracking :: count_student_messages ($user[4], $row[0]);
  814. // student assignments
  815. $csv_row[] = Tracking :: count_student_assignments ($user[4], $row[0]);
  816. // student exercises results
  817. $exercises_results = exercises_results($user[4], $row[0]);
  818. $csv_row[] = $exercises_results['score_obtained'];
  819. $csv_row[] = $exercises_results['score_possible'];
  820. $csv_row[] = $exercises_results['questions_answered'];
  821. $csv_row[] = $exercises_results['percentage'];
  822. // first connection
  823. $csv_row[] = Tracking :: get_first_connection_date_on_the_course ($user[4], $row[0]);
  824. // last connection
  825. $csv_row[] = strip_tags(Tracking :: get_last_connection_date_on_the_course ($user[4], $row[0]));
  826. $csv_content[] = $csv_row;
  827. }
  828. }
  829. Export :: export_table_csv($csv_content, 'reporting_user_overview');
  830. }
  831. /**
  832. * Display a sortable table that contains an overview off all the reporting progress of all users and all courses the user is subscribed to
  833. *
  834. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  835. * @version Dokeos 1.8.6
  836. * @since October 2008
  837. */
  838. function display_tracking_user_overview()
  839. {
  840. display_user_overview_export_options();
  841. $table = new SortableTable('tracking_user_overview', 'get_number_of_users_tracking_overview', 'get_user_data_tracking_overview',1);
  842. $table->set_header(0, get_lang('OfficialCode'));
  843. $table->set_header(1, get_lang('LastName'));
  844. $table->set_header(2, get_lang('FirstName'));
  845. $table->set_header(3, get_lang('LoginName'));
  846. $table->set_header(4, get_lang('CourseInformation'), false);
  847. $table->set_column_filter(4, 'course_info_tracking_filter');
  848. $table -> display();
  849. }
  850. /**
  851. * get the numer of users of the platform
  852. *
  853. * @return integer
  854. *
  855. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  856. * @version Dokeos 1.8.6
  857. * @since October 2008
  858. */
  859. function get_number_of_users_tracking_overview()
  860. {
  861. // database table definition
  862. $main_user_table = Database :: get_main_table(TABLE_MAIN_USER);
  863. // query
  864. $sql = 'SELECT user_id FROM '.$main_user_table;
  865. $result = api_sql_query($sql, __FILE__, __LINE__);
  866. // return the number of results
  867. return Database::num_rows($result);
  868. }
  869. /**
  870. * get all the data for the sortable table of the reporting progress of all users and all the courses the user is subscribed to.
  871. *
  872. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  873. * @version Dokeos 1.8.6
  874. * @since October 2008
  875. */
  876. function get_user_data_tracking_overview($from, $number_of_items, $column, $direction)
  877. {
  878. // database table definition
  879. $main_user_table = Database :: get_main_table(TABLE_MAIN_USER);
  880. $sql = "SELECT
  881. official_code AS col0,
  882. lastname AS col1,
  883. firstname AS col2,
  884. username AS col3,
  885. user_id AS col4
  886. FROM
  887. $main_user_table
  888. ";
  889. $sql .= " ORDER BY col$column $direction ";
  890. $sql .= " LIMIT $from,$number_of_items";
  891. $result = api_sql_query($sql, __FILE__, __LINE__);
  892. $return = array ();
  893. while ($user = Database::fetch_row($result))
  894. {
  895. $return[] = $user;
  896. }
  897. return $return;
  898. }
  899. /**
  900. * Creates a small table in the last column of the table with the user overview
  901. *
  902. * @param integer $user_id the id of the user
  903. * @param array $url_params additonal url parameters
  904. * @param array $row the row information (the other columns)
  905. * @return html code
  906. *
  907. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  908. * @version Dokeos 1.8.6
  909. * @since October 2008
  910. */
  911. function course_info_tracking_filter($user_id,$url_params,$row)
  912. {
  913. // the table header
  914. $return .= '<table class="data_table">';
  915. $return .= ' <tr>';
  916. $return .= ' <th>'.get_lang('Course').'</th>';
  917. $return .= ' <th>'.get_lang('AvgTimeSpentInTheCourse').'</th>';
  918. $return .= ' <th>'.get_lang('AvgStudentsProgress').'</th>';
  919. $return .= ' <th>'.get_lang('AvgCourseScore').'</th>';
  920. $return .= ' <th>'.get_lang('AvgExercisesScore').'</th>';
  921. $return .= ' <th>'.get_lang('AvgMessages').'</th>';
  922. $return .= ' <th>'.get_lang('AvgAssignments').'</th>';
  923. $return .= ' <th>'.get_lang('TotalExercisesScoreObtained').'</th>';
  924. $return .= ' <th>'.get_lang('TotalExercisesScorePossible').'</th>';
  925. $return .= ' <th>'.get_lang('TotalExercisesAnswered').'</th>';
  926. $return .= ' <th>'.get_lang('TotalExercisesScorePercentage').'</th>';
  927. $return .= ' <th>'.get_lang('FirstLogin').'</th>';
  928. $return .= ' <th>'.get_lang('LatestLogin').'</th>';
  929. $return .= ' </tr>';
  930. // database table definition
  931. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  932. // getting all the courses of the user
  933. $sql = "SELECT * FROM $tbl_course_user WHERE user_id = '".Database::escape_string($user_id)."'";
  934. $result = api_sql_query($sql, __FILE__, __LINE__);
  935. while ($row = Database::fetch_row($result))
  936. {
  937. $return .= '<tr>';
  938. // course code
  939. $return .= ' <td>'.$row[0].'</td>';
  940. // time spent in the course
  941. $return .= ' <td>'.api_time_to_hms(Tracking :: get_time_spent_on_the_course ($user_id, $row[0])).'</td>';
  942. // student progress in course
  943. $return .= ' <td>'.round(Tracking :: get_avg_student_progress ($user_id, $row[0]),2).'</td>';
  944. // student score
  945. $return .= ' <td>'.round(Tracking :: get_avg_student_score ($user_id, $row[0]),2).'</td>';
  946. // student tes score
  947. $return .= ' <td>'.round(Tracking :: get_avg_student_exercise_score ($user_id, $row[0]),2).'%</td>';
  948. // student messages
  949. $return .= ' <td>'.Tracking :: count_student_messages ($user_id, $row[0]).'</td>';
  950. // student assignments
  951. $return .= ' <td>'.Tracking :: count_student_assignments ($user_id, $row[0]).'</td>';
  952. // student exercises results (obtained score, maximum score, number of exercises answered, score percentage)
  953. $exercises_results = exercises_results($user_id, $row[0]);
  954. $return .= ' <td>'.$exercises_results['score_obtained'].'</td>';
  955. $return .= ' <td>'.$exercises_results['score_possible'].'</td>';
  956. $return .= ' <td>'.$exercises_results['questions_answered'].'</td>';
  957. $return .= ' <td>'.$exercises_results['percentage'].'% </td>';
  958. // first connection
  959. $return .= ' <td>'.Tracking :: get_first_connection_date_on_the_course ($user_id, $row[0]).'</td>';
  960. // last connection
  961. $return .= ' <td>'.Tracking :: get_last_connection_date_on_the_course ($user_id, $row[0]).'</td>';
  962. $return .= '<tr>';
  963. }
  964. $return .= '</table>';
  965. return $return;
  966. }
  967. /**
  968. * Get general information about the exercise performance of the user
  969. * the total obtained score (all the score on all the questions)
  970. * the maximum score that could be obtained
  971. * the number of questions answered
  972. * the success percentage
  973. *
  974. * @param integer $user_id the id of the user
  975. * @param string $course_code the course code
  976. *
  977. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  978. * @version Dokeos 1.8.6
  979. * @since November 2008
  980. */
  981. function exercises_results($user_id, $course_code)
  982. {
  983. $questions_answered = 0;
  984. $sql = 'SELECT exe_result , exe_weighting
  985. FROM '.Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES)."
  986. WHERE exe_cours_id = '".Database::escape_string($course_code)."'
  987. AND exe_user_id = '".Database::escape_string($user_id)."'";
  988. $result = api_sql_query($sql, __FILE__, __LINE__);
  989. $score_obtained = 0;
  990. $score_possible = 0;
  991. $questions_answered = 0;
  992. while ($row = Database::fetch_array($result))
  993. {
  994. $score_obtained += $row['exe_result'];
  995. $score_possible += $row['exe_weighting'];
  996. $questions_answered ++;
  997. }
  998. if ($score_possible != 0) {
  999. $percentage = round(($score_obtained / $score_possible * 100),2);
  1000. }
  1001. return array('score_obtained' => $score_obtained, 'score_possible' => $score_possible, 'questions_answered' => $questions_answered, 'percentage' => $percentage);
  1002. }
  1003. /**
  1004. * Displays a form with all the additionally defined user fields of the profile
  1005. * and give you the opportunity to include these in the CSV export
  1006. *
  1007. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  1008. * @version Dokeos 1.8.6
  1009. * @since November 2008
  1010. */
  1011. function display_user_overview_export_options()
  1012. {
  1013. // include the user manager and formvalidator library
  1014. require_once (api_get_path(LIBRARY_PATH).'usermanager.lib.php');
  1015. require_once (api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php');
  1016. if ($_GET['export'] == 'options')
  1017. {
  1018. // get all the defined extra fields
  1019. $extrafields = UserManager::get_extra_fields(0,50,5,'ASC');
  1020. // creating the form with all the defined extra fields
  1021. $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']));
  1022. foreach ($extrafields as $key=>$extra)
  1023. {
  1024. $form->addElement('checkbox', 'extra_export_field'.$extra[0], '', $extra[3]);
  1025. }
  1026. $form->addElement('submit', null, get_lang('Ok'));
  1027. // setting the default values for the form that contains all the extra fields
  1028. if(is_array($_SESSION['additional_export_fields']))
  1029. foreach($_SESSION['additional_export_fields'] as $key => $value)
  1030. {
  1031. $defaults['extra_export_field'.$value]=1;
  1032. }
  1033. $form->setDefaults($defaults);
  1034. if ($form->validate())
  1035. {
  1036. // exporting the form values
  1037. $values = $form->exportValues();
  1038. // re-initialising the session that contains the additional fields that need to be exported
  1039. $_SESSION['additional_export_fields'] = array();
  1040. // adding the fields that are checked to the session
  1041. $message='';
  1042. foreach ($values as $field_ids => $value)
  1043. {
  1044. if ($value == 1 AND strstr($field_ids,'extra_export_field'))
  1045. {
  1046. $_SESSION['additional_export_fields'][] = str_replace('extra_export_field','',$field_ids);
  1047. }
  1048. }
  1049. // adding the fields that will be also exported to a message string
  1050. foreach ($_SESSION['additional_export_fields'] as $key=>$extra_field_export)
  1051. {
  1052. $message .= '<li>'.$extrafields[$extra_field_export][3].'</li>';
  1053. }
  1054. // Displaying a feedback message
  1055. if (!empty($_SESSION['additional_export_fields']))
  1056. {
  1057. Display::display_confirmation_message(get_lang('FollowingFieldsWillAlsoBeExported').': <br /><ul>'.$message.'</ul>',false);
  1058. }
  1059. else
  1060. {
  1061. Display::display_confirmation_message(get_lang('NoAdditionalFieldsWillBeExported'),false);
  1062. }
  1063. $message = '';
  1064. }
  1065. else
  1066. {
  1067. $form->display();
  1068. }
  1069. }
  1070. else
  1071. {
  1072. if (!empty($_SESSION['additional_export_fields']))
  1073. {
  1074. // get all the defined extra fields
  1075. $extrafields = UserManager::get_extra_fields(0,50,5,'ASC');
  1076. foreach ($_SESSION['additional_export_fields'] as $key=>$extra_field_export)
  1077. {
  1078. $message .= '<li>'.$extrafields[$extra_field_export][3].'</li>';
  1079. }
  1080. Display::display_normal_message(get_lang('FollowingFieldsWillAlsoBeExported').': <br /><ul>'.$message.'</ul>',false);
  1081. $message = '';
  1082. }
  1083. }
  1084. }
  1085. /**
  1086. * Get all information that the user with user_id = $user_data has
  1087. * entered in the additionally defined profile fields
  1088. *
  1089. * @param integer $user_id the id of the user
  1090. *
  1091. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  1092. * @version Dokeos 1.8.6
  1093. * @since November 2008
  1094. */
  1095. function get_user_overview_export_extra_fields($user_id)
  1096. {
  1097. // include the user manager
  1098. require_once (api_get_path(LIBRARY_PATH).'usermanager.lib.php');
  1099. $extra_data = UserManager::get_extra_user_data($user_id,true);
  1100. return $extra_data;
  1101. }
  1102. ?>