gradebooktable.class.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <?php
  2. /* For licensing terms, see license.txt */
  3. require_once (dirname(__FILE__).'/../../../inc/global.inc.php');
  4. require_once (dirname(__FILE__).'/../be.inc.php');
  5. /**
  6. * Table to display categories, evaluations and links
  7. * @author Stijn Konings
  8. * @author Bert Steppé (refactored, optimised)
  9. *
  10. */
  11. class GradebookTable extends SortableTable
  12. {
  13. private $currentcat;
  14. private $datagen;
  15. private $evals_links;
  16. /**
  17. * Constructor
  18. */
  19. function GradebookTable ($currentcat, $cats = array(), $evals = array(), $links = array(), $addparams = null) {
  20. $status=CourseManager::get_user_in_course_status(api_get_user_id(), api_get_course_id());
  21. parent :: __construct ('gradebooklist', null, null, (api_is_allowed_to_create_course()?1:0));
  22. $this->evals_links = array_merge($evals, $links);
  23. $this->currentcat = $currentcat;
  24. $this->datagen = new GradebookDataGenerator($cats, $evals, $links);
  25. if (isset($addparams)) {
  26. $this->set_additional_parameters($addparams);
  27. }
  28. $column= 0;
  29. if ((($status==1 || is_null($status)) && api_is_allowed_to_create_course()) && ($_SESSION['studentview']<>'studentview') || (isset($_GET['isStudentView']) && $_GET['isStudentView']=='false')) {
  30. $this->set_header($column++,'','','width="25px"');
  31. }
  32. $this->set_header($column++, get_lang('Type'),'','width="35px"');
  33. $this->set_header($column++, get_lang('Name'));
  34. $this->set_header($column++, get_lang('Description'));
  35. if (($status==1 || is_null($status)) && api_is_allowed_to_create_course() && $_SESSION['studentview']<>'studentview' || (isset($_GET['isStudentView']) && $_GET['isStudentView']=='false')) {
  36. $this->set_header($column++, get_lang('Weight'),'','width="50px"');
  37. } else {
  38. if (empty($_GET['selectcat']) ) {
  39. $this->set_header($column++, get_lang('Evaluation'));
  40. }
  41. else {
  42. $this->set_header($column++, get_lang('Weight'));
  43. }
  44. }
  45. if (($status==1 || is_null($status)) && api_is_allowed_to_create_course()) {
  46. $this->set_header($column++, get_lang('Date'),true, 'width="100px"');
  47. } elseif (($status<>1) && !api_is_allowed_to_create_course() && (!isset($_GET['selectcat']) || $_GET['selectcat']==0)) {
  48. $this->set_header($column++, get_lang('Date'),true, 'width="100px"');
  49. }
  50. //admins get an edit column
  51. if (($status==1 || is_null($status)) && api_is_allowed_to_create_course() && $_SESSION['studentview']<>'studentview' || (isset($_GET['isStudentView']) && $_GET['isStudentView']=='false')) {
  52. $this->set_header($column++, get_lang('Modify'), false, 'width="100"');
  53. //actions on multiple selected documents
  54. $this->set_form_actions(array (
  55. 'deleted' => get_lang('DeleteSelected'),
  56. 'setvisible' => get_lang('SetVisible'),
  57. 'setinvisible' => get_lang('SetInvisible')));
  58. } else {
  59. if (empty($_GET['selectcat']) && !api_is_allowed_to_create_course()) {
  60. $this->set_header($column++, get_lang('Certificates'),false);
  61. } else {
  62. $evals_links = array_merge($evals, $links);
  63. if(count($evals_links)>0) {
  64. $this->set_header($column++, get_lang('Results'), false);
  65. }
  66. }
  67. }
  68. }
  69. /**
  70. * Function used by SortableTable to get total number of items in the table
  71. */
  72. function get_total_number_of_items() {
  73. return $this->datagen->get_total_items_count();
  74. }
  75. /**
  76. * Function used by SortableTable to generate the data to display
  77. */
  78. function get_table_data($from = 1) {
  79. // determine sorting type
  80. $col_adjust = (api_is_allowed_to_create_course() ? 1 : 0);
  81. switch ($this->column) {
  82. // Type
  83. case (0 + $col_adjust) :
  84. $sorting = GradebookDataGenerator :: GDG_SORT_TYPE;
  85. break;
  86. case (1 + $col_adjust) :
  87. $sorting = GradebookDataGenerator :: GDG_SORT_NAME;
  88. break;
  89. case (2 + $col_adjust) :
  90. $sorting = GradebookDataGenerator :: GDG_SORT_DESCRIPTION;
  91. break;
  92. case (3 + $col_adjust) :
  93. $sorting = GradebookDataGenerator :: GDG_SORT_WEIGHT;
  94. break;
  95. case (4 + $col_adjust) :
  96. $sorting = GradebookDataGenerator :: GDG_SORT_DATE;
  97. break;
  98. }
  99. if ($this->direction == 'DESC') {
  100. $sorting |= GradebookDataGenerator :: GDG_SORT_DESC;
  101. } else {
  102. $sorting |= GradebookDataGenerator :: GDG_SORT_ASC;
  103. }
  104. //status de user in course
  105. $user_id=api_get_user_id();
  106. $course_code=api_get_course_id();
  107. $status_user=api_get_status_of_user_in_course ($user_id,$course_code);
  108. $data_array = $this->datagen->get_data($sorting, $from, $this->per_page);
  109. // generate the data to display
  110. $sortable_data = array();
  111. $weight_total_links = 0;
  112. foreach ($data_array as $data) {
  113. $row = array ();
  114. $item = $data[0];
  115. $id = $item->get_id();
  116. if (empty($_GET['selectcat']) ) {
  117. $certificate_min_score = $this->build_certificate_min_score($item);
  118. }
  119. //if the item is invisible, wrap it in a span with class invisible
  120. $invisibility_span_open = (api_is_allowed_to_create_course() && $item->is_visible() == '0') ? '<span class="invisible">' : '';
  121. $invisibility_span_close = (api_is_allowed_to_create_course() && $item->is_visible() == '0') ? '</span>' : '';
  122. if (/*($status_user==1 ||is_null($status_user)) && */api_is_allowed_to_create_course() && ($_SESSION['studentview']<>'studentview') || (isset($_GET['isStudentView']) && $_GET['isStudentView']=='false')) {
  123. $row[] = $this->build_id_column ($item);
  124. }
  125. $row[] = $this->build_type_column ($item);
  126. $row[] = $invisibility_span_open . $this->build_name_link ($item) . $invisibility_span_close;
  127. $row[] = $invisibility_span_open . $data[2] . $invisibility_span_close;
  128. if (($status_user==1 || is_null($status_user)) && api_is_allowed_to_create_course()) {
  129. $row[] = $invisibility_span_open . $data[3] . $invisibility_span_close;
  130. $weight_total_links += intval($data[3]);
  131. } else {
  132. if (empty($_GET['selectcat'])) {
  133. // generating the total score for a course
  134. $stud_id= api_get_user_id();
  135. $cats_course = Category :: load ($id, null, null, null, null, null, false);
  136. $alleval_course= $cats_course[0]->get_evaluations($stud_id,true);
  137. $alllink_course= $cats_course[0]->get_links($stud_id,true);
  138. $evals_links = array_merge($alleval_course, $alllink_course);
  139. $item_value=0;
  140. $item_total=0;
  141. for ($count=0; $count < count($evals_links); $count++) {
  142. $item = $evals_links[$count];
  143. $score = $item->calc_score($stud_id);
  144. $score_denom=($score[1]==0) ? 1 : $score[1];
  145. $item_value+=$score[0]/$score_denom*$item->get_weight();
  146. $item_total+=$item->get_weight();
  147. }
  148. $item_value = number_format($item_value, 2, '.', ' ');
  149. $cattotal = Category :: load($id);
  150. $scoretotal= $cattotal[0]->calc_score(api_get_user_id());
  151. $scoretotal_display = (isset($scoretotal)? round($scoretotal[0],2).'/'.round($scoretotal[1],2).'('.round(($scoretotal[0] / $scoretotal[1]) * 100,2) . ' %)': '-');
  152. $row[] = $item_value;
  153. } else {
  154. $row[] = $invisibility_span_open . $data[3] . $invisibility_span_close;
  155. }
  156. }
  157. $row[] = $invisibility_span_open . str_replace(' ','&nbsp;',$data[4]) . $invisibility_span_close;
  158. //admins get an edit column
  159. if (($status_user==1 || is_null($status_user)) && api_is_allowed_to_create_course() && ($_SESSION['studentview']<>'studentview' || (isset($_GET['isStudentView']) && $_GET['isStudentView']=='false'))) {
  160. $cat=new Category();
  161. $show_message=$cat->show_message_resource_delete($item->get_course_code());
  162. if ($show_message===false) {
  163. $row[] = $this->build_edit_column ($item);
  164. }
  165. } else {
  166. //students get the results and certificates columns
  167. if (count($this->evals_links)>0 && $status_user!=1 ) {
  168. $value_data=isset($data[5]) ? $data[5] : null;
  169. if (!is_null($value_data)) {
  170. $row[] = $value_data;
  171. }
  172. }
  173. //variables load in index.php
  174. global $my_score_in_gradebook, $certificate_min_score, $item_value, $certificate_min_score;
  175. if (empty($_GET['selectcat'])) {
  176. if (isset($certificate_min_score) && (int)$item_value >= (int)$certificate_min_score) {
  177. $certificates = '<a href="'.api_get_path(WEB_CODE_PATH) .'gradebook/'.$_SESSION['gradebook_dest'].'?export_certificate=yes&cat_id='.$id.'" target="_blank">
  178. <img src="'.api_get_path(WEB_CODE_PATH) . 'img/dokeos.gif" /></a>&nbsp;'.$scoretotal_display;
  179. //register gradebook certificate
  180. $current_user_id=api_get_user_id();
  181. $date_certificate=date('Y-m-d H:i:s',time());
  182. register_user_info_about_certificate($id,$current_user_id,$my_score_in_gradebook,$date_certificate);
  183. } else {
  184. $certificates = '-';
  185. }
  186. //show certificate date
  187. $get_date=get_certificate_date_by_user_id($id,$current_user_id);
  188. if ($get_date=='' || is_null($get_date)) {
  189. $row[4]='-';
  190. } else {
  191. $row[4] = date('d/m/y H:i:s',strtotime($get_date));
  192. }
  193. $row[] = $certificates;
  194. } elseif ($_GET['selectcat'] == 1) {
  195. if (isset($certificate_min_score) && (int)$item_value >= (int)$certificate_min_score) {
  196. //register gradebook certificate
  197. $current_user_id=api_get_user_id();
  198. $date_certificate=date('Y-m-d H:i:s',time());
  199. register_user_info_about_certificate($id,$current_user_id,$my_score_in_gradebook,$date_certificate);
  200. }
  201. }
  202. }
  203. $sortable_data[] = $row;
  204. }
  205. // warning messages
  206. if (api_is_allowed_to_edit()) {
  207. if (isset($_GET['selectcat']) && $_GET['selectcat'] > 0 && $_GET['view'] <> 'presence') {
  208. $id_cat = intval($_GET['selectcat']);
  209. $category = Category :: load($id_cat);
  210. $weight_category = intval($this->build_weight($category[0]));
  211. $course_code = $this->build_course_code($category[0]);
  212. if ($weight_total_links > $weight_category) {
  213. $warning_message = get_lang('TotalWeightMustNotBeMoreThan').'&nbsp;'.$weight_category;
  214. Display::display_warning_message($warning_message,false);
  215. }
  216. $content_html=DocumentManager::replace_user_info_into_html($course_code);
  217. $new_content=explode('</head>',$content_html);
  218. if (empty($new_content[0])) {
  219. $warning_message = get_lang('ThereIsNotACertificateAvailableByDefault');
  220. Display::display_warning_message($warning_message);
  221. }
  222. }
  223. if (empty($_GET['selectcat'])) {
  224. $categories = Category :: load();
  225. $weight_categories = $certificate_min_scores = $course_codes = array();
  226. foreach ($categories as $category) {
  227. $course_code_category = $this->build_course_code($category);
  228. if (!empty($course_code)) {
  229. if ($course_code_category == $course_code) {
  230. $weight_categories[] = intval($this->build_weight($category));
  231. $certificate_min_scores[] = intval($this->build_certificate_min_score($category));
  232. $course_codes[] = $course_code;
  233. break;
  234. }
  235. } else {
  236. $weight_categories[] = intval($this->build_weight($category));
  237. $certificate_min_scores[] = intval($this->build_certificate_min_score($category));
  238. $course_codes[] = $course_code_category;
  239. }
  240. }
  241. if (is_array($weight_categories) && is_array($certificate_min_scores) && is_array($course_codes)) {
  242. $warning_message = '';
  243. for ($x = 0; $x<count($weight_categories);$x++) {
  244. $weight_category = intval($weight_categories[$x]);
  245. $certificate_min_score = intval($certificate_min_scores[$x]);
  246. $course_code = $course_codes[$x];
  247. if (empty($certificate_min_score) || ($certificate_min_score > $weight_category)) {
  248. $warning_message .= $course_code .'&nbsp;-&nbsp;'.get_lang('CertificateMinimunScoreIsRequiredAndMustNotBeMoreThan').'&nbsp;'.$weight_category.'<br />';
  249. }
  250. }
  251. if (!empty($warning_message)) {
  252. Display::display_warning_message($warning_message,false);
  253. }
  254. }
  255. }
  256. }
  257. return $sortable_data;
  258. }
  259. // Other functions
  260. private function build_certificate_min_score ($item) {
  261. return $item->get_certificate_min_score();
  262. }
  263. private function build_weight ($item) {
  264. return $item->get_weight();
  265. }
  266. private function build_course_code ($item) {
  267. return $item->get_course_code();
  268. }
  269. private function build_id_column ($item) {
  270. switch ($item->get_item_type()) {
  271. // category
  272. case 'C' :
  273. return 'CATE' . $item->get_id();
  274. // evaluation
  275. case 'E' :
  276. return 'EVAL' . $item->get_id();
  277. // link
  278. case 'L' :
  279. return 'LINK' . $item->get_id();
  280. }
  281. }
  282. private function build_type_column ($item) {
  283. return build_type_icon_tag($item->get_icon_name());
  284. }
  285. private function build_name_link ($item) {
  286. switch ($item->get_item_type()) {
  287. // category
  288. case 'C' :
  289. $prms_uri='?selectcat=' . $item->get_id() . '&amp;view='.Security::remove_XSS($_GET['view']);
  290. if (isset($_GET['isStudentView'])) {
  291. if ( isset($is_student) || ( isset($_SESSION['studentview']) && $_SESSION['studentview']=='studentview') ) {
  292. $prms_uri=$prms_uri.'&amp;isStudentView='.Security::remove_XSS($_GET['isStudentView']);
  293. }
  294. }
  295. $cat=new Category();
  296. $show_message=$cat->show_message_resource_delete($item->get_course_code());
  297. return '&nbsp;<a href="'.Security::remove_XSS($_SESSION['gradebook_dest']).$prms_uri.'">'
  298. . $item->get_name()
  299. . '</a>'
  300. . ($item->is_course() ? ' &nbsp;[' . $item->get_course_code() . ']'.$show_message : '');
  301. // evaluation
  302. case 'E' :
  303. $cat=new Category();
  304. //$dblib=new Database();
  305. $category_id=Security::remove_XSS($_GET['selectcat']);
  306. $course_id=Database::get_course_by_category($category_id);
  307. $show_message=$cat->show_message_resource_delete($course_id);
  308. // course/platform admin can go to the view_results page
  309. if (api_is_allowed_to_create_course() && $show_message===false) {
  310. if ($item->get_type() == 'presence')
  311. {
  312. return '&nbsp;'
  313. . '<a href="gradebook_view_result.php?cidReq='.$course_id.'&amp;selecteval=' . $item->get_id() . '">'
  314. . $item->get_name()
  315. . '</a>';
  316. /*return '&nbsp;'
  317. . '<a href="gradebook_add_result.php?selectcat'.Security::remove_XSS($_GET['selectcat']).'&amp;selecteval=' . $item->get_id() . '">'
  318. . $item->get_name()
  319. . '</a>';
  320. */
  321. }
  322. else
  323. {
  324. return '&nbsp;'
  325. . '<a href="gradebook_view_result.php?cidReq='.$course_id.'&amp;selecteval=' . $item->get_id() . '">'
  326. . $item->get_name()
  327. . '</a>&nbsp;['.get_lang('Evaluation').']';
  328. }
  329. } elseif (ScoreDisplay :: instance()->is_custom() && $show_message===false) {
  330. // students can go to the statistics page (if custom display enabled)
  331. return '&nbsp;'
  332. . '<a href="gradebook_statistics.php?selecteval=' . $item->get_id() . '">'
  333. . $item->get_name()
  334. . '</a>';
  335. } elseif ($show_message===false && !api_is_allowed_to_create_course() && !(ScoreDisplay :: instance()->is_custom())) {
  336. return '&nbsp;'
  337. . '<a href="gradebook_statistics.php?selecteval=' . $item->get_id() . '">'
  338. . $item->get_name()
  339. . '</a>';
  340. } else {
  341. return '['.get_lang('Evaluation').']&nbsp;&nbsp;'.$item->get_name().$show_message;
  342. }
  343. // link
  344. case 'L' :
  345. $cat=new Category();
  346. //$dblib=new Database();
  347. $category_id=Security::remove_XSS($_GET['selectcat']);
  348. $course_id=Database::get_course_by_category($category_id);
  349. $show_message=$cat->show_message_resource_delete($course_id);
  350. $url = $item->get_link();
  351. if (isset($url) && $show_message===false) {
  352. $text = '&nbsp;<a href="' . $item->get_link() . '">'
  353. . $item->get_name()
  354. . '</a>';
  355. } else {
  356. $text = $item->get_name();
  357. }
  358. $text .= '&nbsp;[' . $item->get_type_name() . ']'.$show_message;
  359. $cc = $this->currentcat->get_course_code();
  360. if (empty($cc)) {
  361. $text .= '&nbsp;[<a href="'.api_get_path(REL_COURSE_PATH).$item->get_course_code().'/">'.$item->get_course_code().'</a>]';
  362. }
  363. return $text;
  364. }
  365. }
  366. private function build_edit_column ($item) {
  367. switch ($item->get_item_type()) {
  368. // category
  369. case 'C' :
  370. return build_edit_icons_cat($item, $this->currentcat->get_id());
  371. // evaluation
  372. case 'E' :
  373. return build_edit_icons_eval($item, $this->currentcat->get_id());
  374. // link
  375. case 'L' :
  376. return build_edit_icons_link($item, $this->currentcat->get_id());
  377. }
  378. }
  379. }