PageRenderTime 64ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/claroline/exercise/connector/tracking.cnr.php

https://github.com/TeamRocketScience/Claroline-TRS-Edition
PHP | 272 lines | 216 code | 38 blank | 18 comment | 11 complexity | 9d85c4cd1921d4083a9e5b456b1ef483 MD5 | raw file
  1. <?php // $Id$
  2. if ( count( get_included_files() ) == 1 ) die( '---' );
  3. /**
  4. * CLAROLINE
  5. *
  6. * @version 1.8 $Revision: 415 $
  7. *
  8. * @copyright (c) 2001-2011, Universite catholique de Louvain (UCL)
  9. *
  10. * @license http://www.gnu.org/copyleft/gpl.html (GPL) GENERAL PUBLIC LICENSE
  11. *
  12. * @package CLQWZ
  13. *
  14. * @author Claro Team <cvs@claroline.net>
  15. * @author Sebastien Piraux <pir@cerdecam.be>
  16. */
  17. class CLQWZ_CourseTrackingRenderer extends CourseTrackingRenderer
  18. {
  19. private $tbl_qwz_exercise;
  20. private $tbl_qwz_tracking;
  21. public function __construct($courseId)
  22. {
  23. $this->courseId = $courseId;
  24. $tbl_cdb_names = get_module_course_tbl( array( 'qwz_exercise', 'qwz_tracking' ), $courseId );
  25. $this->tbl_qwz_exercise = $tbl_cdb_names['qwz_exercise'];
  26. $this->tbl_qwz_tracking = $tbl_cdb_names['qwz_tracking'];
  27. }
  28. protected function renderHeader()
  29. {
  30. return claro_get_tool_name('CLQWZ');
  31. }
  32. protected function renderContent()
  33. {
  34. $html = '';
  35. $sql = "SELECT TEX.`exo_id`,
  36. COUNT(DISTINCT TEX.`user_id`) AS `nbr_distinct_user_attempts`,
  37. COUNT(TEX.`exo_id`) AS `nbr_total_attempts`,
  38. EX.`title`
  39. FROM `".$this->tbl_qwz_tracking."` AS TEX, `".$this->tbl_qwz_exercise."` AS EX
  40. WHERE TEX.`exo_id` = EX.`id`
  41. GROUP BY TEX.`exo_id`";
  42. $results = claro_sql_query_fetch_all($sql);
  43. $html .= '<table class="claroTable" cellpadding="2" cellspacing="1" border="0" align="center" style="width: 99%;">'."\n"
  44. . '<thead><tr class="headerX">'."\n"
  45. . '<th>&nbsp;'.get_lang('Exercises').'&nbsp;</th>'."\n"
  46. . '<th>&nbsp;'.get_lang('User attempts').'&nbsp;</th>'."\n"
  47. . '<th>&nbsp;'.get_lang('Total attempts').'&nbsp;</th>'."\n"
  48. . '</tr></thead>'."\n"
  49. . '<tbody>'."\n"
  50. ;
  51. if( !empty($results) && is_array($results) )
  52. {
  53. foreach( $results as $result )
  54. {
  55. $html .= '<tr>'."\n"
  56. . '<td><a href="../exercise/track_exercises.php?exId='.$result['exo_id'].'">'.$result['title'].'</a></td>'."\n"
  57. . '<td align="right">'.$result['nbr_distinct_user_attempts'].'</td>'."\n"
  58. . '<td align="right">'.$result['nbr_total_attempts'].'</td>'."\n"
  59. . '</tr>'."\n\n"
  60. ;
  61. }
  62. }
  63. else
  64. {
  65. $html .= '<tr>' . "\n"
  66. . '<td colspan="3">'
  67. . '<div align="center">' . get_lang('No result') . '</div>'
  68. . '</td>' . "\n"
  69. . '</tr>' . "\n"
  70. ;
  71. }
  72. $html .= '</tbody>'."\n"
  73. . '</table>'."\n"
  74. ;
  75. return $html;
  76. }
  77. protected function renderFooter()
  78. {
  79. return '';
  80. }
  81. }
  82. TrackingRendererRegistry::registerCourse('CLQWZ_CourseTrackingRenderer');
  83. /*
  84. *
  85. */
  86. class CLQWZ_UserTrackingRenderer extends UserTrackingRenderer
  87. {
  88. private $tbl_qwz_exercise;
  89. private $tbl_qwz_tracking;
  90. public function __construct($courseId, $userId)
  91. {
  92. $this->courseId = $courseId;
  93. $this->userId = (int) $userId;
  94. $tbl_cdb_names = get_module_course_tbl( array( 'qwz_exercise', 'qwz_tracking' ), $courseId );
  95. $this->tbl_qwz_exercise = $tbl_cdb_names['qwz_exercise'];
  96. $this->tbl_qwz_tracking = $tbl_cdb_names['qwz_tracking'];
  97. }
  98. protected function renderHeader()
  99. {
  100. return claro_get_tool_name('CLQWZ');
  101. }
  102. protected function renderContent()
  103. {
  104. if( isset($_REQUEST['exId']) && is_numeric($_REQUEST['exId']) ) $exId = (int) $_REQUEST['exId'];
  105. else $exId = null;
  106. $exerciseResults = $this->prepareContent();
  107. $jsloader = JavascriptLoader::getInstance();
  108. $jsloader->load('jquery');
  109. $html = '<script language="javascript" type="text/javascript">' . "\n"
  110. . ' $(document).ready(function() {'
  111. . ' $(\'.exerciseDetails\').hide();'
  112. . ' $(\'.exerciseDetailsToggle\').click( function()'
  113. . ' {'
  114. . ' $(this).next(".exerciseDetails").toggle();'
  115. . ' return false;'
  116. . ' });'
  117. . ' });'
  118. . '</script>'."\n\n";
  119. $html .= '<table class="claroTable emphaseLine" cellpadding="2" cellspacing="1" border="0" align="center" style="width: 99%;">' . "\n"
  120. . '<thead>' . "\n"
  121. . '<tr class="headerX">' . "\n"
  122. . '<th>' . get_lang('Exercises').'</th>' . "\n"
  123. . '<th>' . get_lang('Worst score').'</th>' . "\n"
  124. . '<th>' . get_lang('Best score').'</th>' . "\n"
  125. . '<th>' . get_lang('Average score').'</th>' . "\n"
  126. . '<th>' . get_lang('Average Time').'</th>' . "\n"
  127. . '<th>' . get_lang('Attempts').'</th>' . "\n"
  128. . '<th>' . get_lang('Last attempt').'</th>' . "\n"
  129. . '</tr>' . "\n"
  130. . '</thead>' . "\n"
  131. ;
  132. if( !empty($exerciseResults) && is_array($exerciseResults) )
  133. {
  134. $html .= '<tbody>' . "\n";
  135. foreach( $exerciseResults as $result )
  136. {
  137. $html .= '<tr class="exerciseDetailsToggle">' . "\n"
  138. . '<td><a href="#">'.htmlspecialchars($result['title']).'</td>' . "\n"
  139. . '<td>'.(int) $result['minimum'].'</td>' . "\n"
  140. . '<td>'.(int) $result['maximum'].'</td>' . "\n"
  141. . '<td>'.(round($result['average']*10)/10).'</td>' . "\n"
  142. . '<td>'.claro_html_duration(floor($result['avgTime'])).'</td>' . "\n"
  143. . '<td>'.(int) $result['attempts'].'</td>' . "\n"
  144. . '<td>'. claro_html_localised_date(
  145. get_locale('dateTimeFormatLong'),
  146. strtotime($result['lastAttempt'])
  147. ) . "</td> \n"
  148. . '</tr>' . "\n";
  149. // details
  150. $exerciseDetails = $this->getUserExerciceDetails($result['id']);
  151. if( is_array($exerciseDetails) && !empty($exerciseDetails) )
  152. {
  153. $html .= '<tr class="exerciseDetails" >'
  154. . '<td>&nbsp;</td>' . "\n"
  155. . '<td colspan="6" class="noHover">' . "\n"
  156. . '<table class="claroTable emphaseLine" cellspacing="1" cellpadding="2" border="0" width="100%" style="width: 99%;">' . "\n"
  157. . '<thead>' . "\n"
  158. . '<tr class="headerX">' . "\n"
  159. . '<th><small>' . get_lang('Date').'</small></th>' . "\n"
  160. . '<th><small>' . get_lang('Score').'</small></th>' . "\n"
  161. . '<th><small>' . get_lang('Time').'</small></th>' . "\n"
  162. . '</tr>' . "\n"
  163. . '</thead>' . "\n"
  164. . '<tbody>' . "\n";
  165. foreach ( $exerciseDetails as $details )
  166. {
  167. $html .= '<tr>' . "\n"
  168. . '<td><small>' . "\n"
  169. . '<a href="'.get_module_url('CLQWZ') . '/track_exercise_details.php?trackedExId='.$details['id'].'">'
  170. . claro_html_localised_date(
  171. get_locale('dateTimeFormatLong'),
  172. strtotime($details['date'])
  173. )
  174. . '</a></small></td>' . "\n"
  175. . '<td><small>'.$details['result'].'/'.$details['weighting'].'</small></td>' . "\n"
  176. . '<td><small>'.claro_html_duration($details['time']).'</small></td>' . "\n"
  177. . '</tr>' . "\n";
  178. }
  179. $html .= '</tbody>' . "\n"
  180. . '</table>' . "\n\n"
  181. . '</td>' . "\n"
  182. . '</tr>' . "\n";
  183. }
  184. }
  185. $html .= '</tbody>' . "\n";
  186. }
  187. else
  188. {
  189. $html .= '<tbody>' . "\n"
  190. . '<tr>' . "\n"
  191. . '<td colspan="7" align="center">' . get_lang('No result').'</td>' . "\n"
  192. . '</tr>' . "\n"
  193. . '</tbody>' . "\n"
  194. ;
  195. }
  196. $html .= '</table>' . "\n\n";
  197. return $html;
  198. }
  199. protected function renderFooter()
  200. {
  201. return get_lang('Click on exercise title for more details');
  202. }
  203. private function prepareContent()
  204. {
  205. $sql = "SELECT `E`.`title`,
  206. `E`.`id`,
  207. MIN(`TEX`.`result`) AS `minimum`,
  208. MAX(`TEX`.`result`) AS `maximum`,
  209. AVG(`TEX`.`result`) AS `average`,
  210. MAX(`TEX`.`weighting`) AS `weighting`,
  211. COUNT(`TEX`.`user_id`) AS `attempts`,
  212. MAX(`TEX`.`date`) AS `lastAttempt`,
  213. AVG(`TEX`.`time`) AS `avgTime`
  214. FROM `" . $this->tbl_qwz_exercise . "` AS `E`
  215. , `" . $this->tbl_qwz_tracking . "` AS `TEX`
  216. WHERE `TEX`.`user_id` = " . (int) $this->userId . "
  217. AND `TEX`.`exo_id` = `E`.`id`
  218. GROUP BY `TEX`.`exo_id`
  219. ORDER BY `E`.`title` ASC";
  220. $results = claro_sql_query_fetch_all($sql);
  221. return $results;
  222. }
  223. private function getUserExerciceDetails($exerciseId)
  224. {
  225. $sql = "SELECT `id`, `date`, `result`, `weighting`, `time`
  226. FROM `" . $this->tbl_qwz_tracking . "`
  227. WHERE `exo_id` = ". (int) $exerciseId."
  228. AND `user_id` = ". (int) $this->userId."
  229. ORDER BY `date` ASC";
  230. $results = claro_sql_query_fetch_all($sql);
  231. return $results;
  232. }
  233. }
  234. TrackingRendererRegistry::registerUser('CLQWZ_UserTrackingRenderer');