gradebook_view_result.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. <?php // $Id: $
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2008 Dokeos Latinoamerica SAC
  6. Copyright (c) 2006 Dokeos SPRL
  7. Copyright (c) 2006 Ghent University (UGent)
  8. Copyright (c) various contributors
  9. For a full list of contributors, see "credits.txt".
  10. The full license can be read in "license.txt".
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15. See the GNU General Public License for more details.
  16. Contact address: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium
  17. Mail: info@dokeos.com
  18. ==============================================================================
  19. */
  20. $language_file[] = 'gradebook';
  21. //$cidReset= true;
  22. require_once ('../inc/global.inc.php');
  23. require_once ('lib/be.inc.php');
  24. require_once ('lib/gradebook_functions.inc.php');
  25. require_once ('lib/fe/displaygradebook.php');
  26. require_once ('lib/fe/evalform.class.php');
  27. require_once ('lib/fe/dataform.class.php');
  28. require_once (api_get_path(LIBRARY_PATH) . 'fileManage.lib.php');
  29. require_once (api_get_path(LIBRARY_PATH) . 'export.lib.inc.php');
  30. require_once (api_get_path(LIBRARY_PATH) . 'import.lib.php');
  31. require_once (api_get_path(LIBRARY_PATH) . 'usermanager.lib.php');
  32. require_once ('lib/results_data_generator.class.php');
  33. require_once ('lib/fe/resulttable.class.php');
  34. require_once ('lib/fe/exportgradebook.php');
  35. require_once ('lib/scoredisplay.class.php');
  36. require_once (api_get_path(LIBRARY_PATH).'ezpdf/class.ezpdf.php');
  37. api_block_anonymous_users();
  38. block_students();
  39. $interbreadcrumb[]= array (
  40. 'url' => $_SESSION['gradebook_dest'],
  41. 'name' => get_lang('Gradebook'
  42. ));
  43. //load the evaluation & category
  44. $select_eval=Security::remove_XSS($_GET['selecteval']);
  45. if (empty($select_eval)) {
  46. api_not_allowed();
  47. }
  48. $displayscore = Scoredisplay :: instance();
  49. $eval= Evaluation :: load($select_eval);
  50. $overwritescore= 0;
  51. if ($eval[0]->get_category_id() < 0) {
  52. // if category id is negative, then the evaluation's origin is a link
  53. $link= LinkFactory :: get_evaluation_link($eval[0]->get_id());
  54. $currentcat= Category :: load($link->get_category_id());
  55. } else
  56. $currentcat= Category :: load($eval[0]->get_category_id());
  57. //load the result with the evaluation id
  58. function overwritescore($resid, $importscore, $eval_max) {
  59. $result= Result :: load($resid);
  60. if ($importscore > $eval_max) {
  61. header('Location: gradebook_view_result.php?selecteval=' .Security::remove_XSS($_GET['selecteval']) . '&overwritemax=');
  62. exit;
  63. }
  64. $result[0]->set_score($importscore);
  65. $result[0]->save();
  66. unset ($result);
  67. }
  68. if (isset ($_GET['selecteval'])) {
  69. $allresults= Result :: load(null,null,$select_eval);
  70. $iscourse= $currentcat[0]->get_course_code() == null ? 1 : 0;
  71. }
  72. /**
  73. * XML-parser: handle start of element
  74. */
  75. function element_start($parser, $data) {
  76. global $user;
  77. global $current_tag;
  78. switch ($data) {
  79. case 'Result' :
  80. $user= array ();
  81. break;
  82. default :
  83. $current_tag= $data;
  84. }
  85. }
  86. /**
  87. * XML-parser: handle end of element
  88. */
  89. function element_end($parser, $data) {
  90. global $user;
  91. global $users;
  92. global $current_value;
  93. switch ($data) {
  94. case 'Result' :
  95. $users[]= $user;
  96. break;
  97. default :
  98. $user[$data]= $current_value;
  99. break;
  100. }
  101. }
  102. /**
  103. * XML-parser: handle character data
  104. */
  105. function character_data($parser, $data) {
  106. global $current_value;
  107. $current_value= $data;
  108. }
  109. /**
  110. * Read the XML-file
  111. * @param string $file Path to the XML-file
  112. * @return array All userinformation read from the file
  113. */
  114. function parse_xml_data($file) {
  115. global $current_tag;
  116. global $current_value;
  117. global $user;
  118. global $users;
  119. $users= array ();
  120. $parser= xml_parser_create();
  121. xml_set_element_handler($parser, 'element_start', 'element_end');
  122. xml_set_character_data_handler($parser, "character_data");
  123. xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
  124. xml_parse($parser, file_get_contents($file));
  125. xml_parser_free($parser);
  126. return $users;
  127. }
  128. if (isset ($_GET['editres'])) {
  129. $edit_res_xml=Security::remove_XSS($_GET['editres']);
  130. $select_eval_edit=Security::remove_XSS($_GET['selecteval']);
  131. $resultedit= Result :: load($edit_res_xml);
  132. $edit_res_form= new EvalForm(EvalForm :: TYPE_RESULT_EDIT, $eval[0], $resultedit[0], 'edit_result_form', null, api_get_self() . '?editres=' . $resultedit[0]->get_id() . '&selecteval=' .$select_eval_edit);
  133. if ($edit_res_form->validate()) {
  134. $values= $edit_res_form->exportValues();
  135. $result= new Result();
  136. $resultlog=new Result();
  137. $resultlog->add_result__log($values['hid_user_id'],$select_eval_edit);
  138. $result->set_id($edit_res_xml);
  139. $result->set_user_id($values['hid_user_id']);
  140. $result->set_evaluation_id($select_eval_edit);
  141. $row_value=isset($values['score']) ? (int)$values['score'] : 0 ;
  142. if ((!empty ($row_value)) || ($row_value == 0)) {
  143. $result->set_score($row_value);
  144. }
  145. $result->save();
  146. unset ($result);
  147. header('Location: gradebook_view_result.php?selecteval=' . $select_eval_edit . '&editresmessage=');
  148. exit;
  149. }
  150. }
  151. if (isset ($_GET['import'])) {
  152. $interbreadcrumb[]= array (
  153. 'url' => 'gradebook_view_result.php?selecteval=' . Security::remove_XSS($_GET['selecteval']),
  154. 'name' => get_lang('ViewResult'
  155. ));
  156. $import_result_form = new DataForm(DataForm :: TYPE_IMPORT, 'import_result_form', null, api_get_self() . '?import=&selecteval=' . Security::remove_XSS($_GET['selecteval']));
  157. if (!$import_result_form->validate()) {
  158. Display :: display_header(get_lang('Import'));
  159. }
  160. if ($_POST['formSent'] ) {
  161. if (!empty ($_FILES['import_file']['name'])) {
  162. $values= $import_result_form->exportValues();
  163. $file_type= $_POST['file_type'];
  164. $file_name= $_FILES['import_file']['tmp_name'];
  165. if ($file_type == 'csv') {
  166. $results= Import :: csv_to_array($file_name);
  167. } else {
  168. $results= parse_xml_data($file_name);
  169. }
  170. $nr_results_added= 0;
  171. foreach ($results as $index => $importedresult) {
  172. //check username & score
  173. $importedresult['user_id'] = UserManager::get_user_id_from_username($importedresult['username']);
  174. $added= '0';
  175. foreach ($allresults as $allresult) {
  176. if (($importedresult['user_id'] == $allresult->get_user_id())) {
  177. if ($importedresult['score'] != $allresult->get_score()) {
  178. if (!isset ($values['overwrite'])) {
  179. header('Location: gradebook_view_result.php?selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&import_score_error=' . $importedresult['user_id']);
  180. exit;
  181. break;
  182. } else {
  183. overwritescore($allresult->get_id(), $importedresult['score'], $eval[0]->get_max());
  184. $overwritescore++;
  185. $added= '1';
  186. }
  187. } else {
  188. $added= '1';
  189. }
  190. }
  191. }
  192. if ($importedresult['user_id'] == null) {
  193. header('Location: gradebook_view_result.php?selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&incorrectdata=');
  194. exit;
  195. }
  196. $userinfo= get_user_info_from_id($importedresult['user_id']);
  197. if ($userinfo['lastname'] != $importedresult['lastname'] || $userinfo['firstname'] != $importedresult['firstname'] || $userinfo['official_code'] != $importedresult['official_code']) {
  198. if (!isset ($values['ignoreerrors'])) {
  199. header('Location: gradebook_view_result.php?selecteval=' .Security::remove_XSS($_GET['selecteval']) . '&import_user_error=' . $importedresult['user_id']);
  200. exit;
  201. }
  202. }
  203. if ($added != '1') {
  204. if ($importedresult['score'] > $eval[0]->get_max()) {
  205. header('Location: gradebook_view_result.php?selecteval=' .Security::remove_XSS($_GET['selecteval']) . '&overwritemax=');
  206. exit;
  207. }
  208. $result= new Result();
  209. $result->set_user_id($importedresult['user_id']);
  210. if (!empty ($importedresult['score'])) {
  211. $result->set_score($importedresult['score']);
  212. }
  213. if (!empty ($importedresult['date'])) {
  214. $result->set_date(strtotime($importedresult['date']));
  215. } else {
  216. $result->set_date(time());
  217. }
  218. $result->set_evaluation_id($_GET['selecteval']);
  219. $result->add();
  220. $nr_results_added++;
  221. }
  222. }
  223. } else {
  224. header('Location: ' . api_get_self() . '?import=&selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&importnofile=');
  225. exit;
  226. }
  227. if ($overwritescore != 0) {
  228. header('Location: ' . api_get_self() . '?selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&importoverwritescore=' . $overwritescore);
  229. exit;
  230. }
  231. if ($nr_results_added == 0) {
  232. header('Location: ' . api_get_self() . '?selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&nothingadded=');
  233. exit;
  234. }
  235. header('Location: ' . api_get_self() . '?selecteval=' . Security::remove_XSS($_GET['selecteval']) . '&importok=');
  236. exit;
  237. }
  238. }
  239. if (isset ($_GET['export'])) {
  240. $interbreadcrumb[]= array (
  241. 'url' => 'gradebook_view_result.php?selecteval=' . Security::remove_XSS($_GET['selecteval']),
  242. 'name' => get_lang('ViewResult'
  243. ));
  244. $export_result_form= new DataForm(DataForm :: TYPE_EXPORT, 'export_result_form', null, api_get_self() . '?export=&selecteval=' . $_GET['selecteval'], '_blank');
  245. if (!$export_result_form->validate()) {
  246. Display :: display_header(get_lang('Export'));
  247. }
  248. if ($export_result_form->validate()) {
  249. $export= $export_result_form->exportValues();
  250. $file_type= $export['file_type'];
  251. $filename= 'export_results_' . date('Y-m-d_H-i-s');
  252. $results= Result :: load(null, null, Security::remove_XSS($_GET['selecteval']));
  253. $data= array (); //when file type is csv, add a header to the output file
  254. if ($file_type == 'csv') {
  255. $alldata[]= array (
  256. 'username',
  257. 'official_code',
  258. 'lastname',
  259. 'firstname',
  260. 'score',
  261. 'date'
  262. );
  263. }
  264. if ($file_type == 'pdf') {
  265. if (($eval[0]->has_results())) {
  266. $score= $eval[0]->calc_score();
  267. if ($score != null) {
  268. $average= get_lang('Average') . ' : ' . round(100 * ($score[0] / $score[1]),2) . ' %';
  269. }
  270. }
  271. if ($eval[0]->get_course_code() == null) {
  272. $course= get_lang('CourseIndependent');
  273. } else {
  274. $course= get_course_name_from_code($eval[0]->get_course_code());
  275. }
  276. $pdf= new Cezpdf();
  277. $pdf->selectFont(api_get_path(LIBRARY_PATH).'ezpdf/fonts/Courier.afm');
  278. $pdf->ezSetMargins(30, 30, 50, 30);
  279. $pdf->ezSetY(800);
  280. $pdf->ezText(get_lang('EvaluationName') . ' : ' . $eval[0]->get_name() . ' (' . date('j/n/Y g:i', $eval[0]->get_date()) . ')', 12, array (
  281. 'justification' => 'left'
  282. ));
  283. $pdf->ezText(get_lang('Description') . ' : ' . $eval[0]->get_description());
  284. $pdf->ezText(get_lang('Course') . ' : ' . $course, 12, array (
  285. 'justification' => 'left'
  286. ));
  287. $pdf->ezText(get_lang('Weight') . ' : ' . $eval[0]->get_weight(), 12, array (
  288. 'justification' => 'left'
  289. ));
  290. $pdf->ezText(get_lang('Max') . ' : ' . $eval[0]->get_max(), 12, array (
  291. 'justification' => 'left'
  292. ));
  293. $pdf->ezText($average, 12, array (
  294. 'justification' => 'left'
  295. ));
  296. $datagen = new ResultsDataGenerator ($eval[0],$allresults);
  297. if (api_sort_by_first_name()) {
  298. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_FIRSTNAME, 0, null, true);
  299. } else {
  300. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_LASTNAME,0,null,true);
  301. }
  302. $newarray = array();
  303. $is_western_name_order = api_is_western_name_order();
  304. foreach ($data_array as $data) {
  305. $newitem = array();
  306. if ($is_western_name_order) {
  307. $newitem[] = $data['firstname'];
  308. $newitem[] = $data['lastname'];
  309. } else {
  310. $newitem[] = $data['lastname'];
  311. $newitem[] = $data['firstname'];
  312. }
  313. $newitem[] = $data['score'];
  314. if ($displayscore->is_custom())
  315. $newitem[] = $data['display'];
  316. $newarray[] = $newitem;
  317. }
  318. $pdf->ezSetY(650);
  319. if ($displayscore->is_custom()) {
  320. if ($is_western_name_order) {
  321. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'),get_lang('Display'));
  322. } else {
  323. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'),get_lang('Display'));
  324. }
  325. } else {
  326. if ($is_western_name_order) {
  327. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'));
  328. } else {
  329. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'));
  330. }
  331. }
  332. $pdf->ezTable($newarray,$header_names,'',array('showHeadings'=>1,'shaded'=>1,'showLines'=>1,'rowGap'=>3,'width'=> 500));
  333. $pdf->ezStream();
  334. exit;
  335. }
  336. foreach ($results as $result) {
  337. $userinfo= get_user_info_from_id($result->get_user_id());
  338. $data['username']= $userinfo['username']; //$result->get_user_id();
  339. $data['official_code']= $userinfo['official_code'];
  340. $data['lastname']= $userinfo['lastname'];
  341. $data['firstname']= $userinfo['firstname'];
  342. $data['score']= $result->get_score();
  343. $data['date']= date('Y-n-j g:i', $result->get_date());
  344. $alldata[]= $data;
  345. }
  346. switch ($file_type) {
  347. case 'xml' :
  348. Export :: export_table_xml($alldata, $filename, 'Result', 'XMLResults');
  349. exit;
  350. break;
  351. case 'csv' :
  352. Export :: export_table_csv($alldata, $filename);
  353. exit;
  354. break;
  355. }
  356. }
  357. }
  358. if (isset ($_GET['resultdelete'])) {
  359. $result= Result :: load($_GET['resultdelete']);
  360. $result[0]->delete();
  361. header('Location: gradebook_view_result.php?deleteresult=&selecteval=' .Security::remove_XSS($_GET['selecteval']));
  362. exit;
  363. }
  364. if (isset ($_POST['action'])) {
  365. $number_of_selected_items= count($_POST['id']);
  366. if ($number_of_selected_items == '0') {
  367. Display :: display_warning_message(get_lang('NoItemsSelected'),false);
  368. } else {
  369. switch ($_POST['action']) {
  370. case 'delete' :
  371. $number_of_deleted_results= 0;
  372. foreach ($_POST['id'] as $indexstr) {
  373. $result= Result :: load($indexstr);
  374. $result[0]->delete();
  375. $number_of_deleted_results++;
  376. }
  377. header('Location: gradebook_view_result.php?massdelete=&selecteval=' .Security::remove_XSS($_GET['selecteval']));
  378. exit;
  379. break;
  380. }
  381. }
  382. } // TODO - what if selecteval not set ?
  383. $addparams = array ('selecteval' => $eval[0]->get_id());
  384. if (isset ($_GET['print'])) {
  385. $datagen = new ResultsDataGenerator ($eval[0],$allresults);
  386. if (api_sort_by_first_name()) {
  387. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_FIRSTNAME, 0, null, true);
  388. } else {
  389. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_LASTNAME,0,null,true);
  390. }
  391. if ($displayscore->is_custom()) {
  392. if (api_is_western_name_order()) {
  393. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'),get_lang('Display'));
  394. } else {
  395. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'),get_lang('Display'));
  396. }
  397. } else {
  398. if (api_is_western_name_order()) {
  399. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'));
  400. }else {
  401. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'));
  402. }
  403. }
  404. $newarray = array();
  405. foreach ($data_array as $data) {
  406. $newarray[] = array_slice($data, 2);
  407. }
  408. echo print_table($newarray, $header_names,get_lang('ViewResult'), $eval[0]->get_name());
  409. exit;
  410. } else
  411. $resulttable= new ResultTable($eval[0], $allresults, $iscourse, $addparams);
  412. $htmlHeadXtra[]= '<script type="text/javascript">
  413. function confirmationuser ()
  414. {
  415. if (confirm("' . get_lang('DeleteUser') . '?"))
  416. {return true;}
  417. else
  418. {return false;}
  419. }
  420. function confirmationall ()
  421. {
  422. if (confirm("' . get_lang('DeleteAll') . '?"))
  423. {return true;}
  424. else
  425. {return false;}
  426. }
  427. </script>';
  428. if (isset ($_GET['deleteall'])) {
  429. $eval[0]->delete_results();
  430. header('Location: gradebook_view_result.php?allresdeleted=&selecteval=' . Security::remove_XSS($_GET['selecteval']));
  431. exit;
  432. }
  433. if ((!isset ($_GET['export'])) && (!isset ($_GET['import']))) {
  434. if (!isset($_GET['selectcat'])) {
  435. $interbreadcrumb[]= array (
  436. 'url' => $_SESSION['gradebook_dest'].'?selectcat=' .$currentcat[0]->get_id(),
  437. 'name' => get_lang('Details')
  438. );
  439. }
  440. $interbreadcrumb[]= array (
  441. 'url' => 'gradebook_view_result.php'.'?selecteval='.Security::remove_XSS($_GET['selecteval']),
  442. 'name' => get_lang('ViewResult'
  443. ));
  444. Display :: display_header('');
  445. }
  446. if (isset ($_GET['addresultnostudents'])) {
  447. Display :: display_warning_message(get_lang('AddResultNoStudents'),false);
  448. }
  449. if (isset ($_GET['editresmessage'])) {
  450. Display :: display_confirmation_message(get_lang('ResultEdited'),false);
  451. }
  452. if (isset ($_GET['addresult'])) {
  453. Display :: display_confirmation_message(get_lang('ResultAdded'),false);
  454. }
  455. if (isset ($_GET['adduser'])) {
  456. Display :: display_confirmation_message(get_lang('UserAdded'),false);
  457. }
  458. if (isset ($_GET['deleteresult'])) {
  459. Display :: display_confirmation_message(get_lang('ResultDeleted'),false);
  460. }
  461. if (isset ($_GET['editallresults'])) {
  462. Display :: display_confirmation_message(get_lang('AllResultsEdited'),false);
  463. }
  464. if (isset ($_GET['importok'])) {
  465. Display :: display_confirmation_message(get_lang('FileUploadComplete'),false);
  466. }
  467. if (isset ($_GET['importnofile'])) {
  468. Display :: display_warning_message(get_lang('ImportNoFile'),false);
  469. }
  470. if (isset ($_GET['incorrectdata'])) {
  471. Display :: display_warning_message(get_lang('IncorrectData'),false);
  472. }
  473. if (isset ($_GET['nothingadded'])) {
  474. Display :: display_warning_message(get_lang('ProblemUploadingFile'),false);
  475. }
  476. if (isset ($_GET['massdelete'])) {
  477. Display :: display_confirmation_message(get_lang('ResultsDeleted'),false);
  478. }
  479. if (isset ($_GET['nouser'])) {
  480. Display :: display_warning_message(get_lang('NoUser'),false);
  481. }
  482. if (isset ($_GET['overwritemax'])) {
  483. Display :: display_warning_message(get_lang('OverWriteMax'),false);
  484. }
  485. if (isset ($_GET['importoverwritescore'])) {
  486. Display :: display_confirmation_message(get_lang('ImportOverWriteScore') . ' ' . $_GET['importoverwritescore']);
  487. }
  488. if (isset ($_GET['import_user_error'])) {
  489. $userinfo= get_user_info_from_id($_GET['import_user_error']);
  490. Display :: display_warning_message(get_lang('UserInfoDoesNotMatch') . ' ' . api_get_person_name($userinfo['firstname'], $userinfo['lastname']));
  491. }
  492. if (isset ($_GET['allresdeleted'])) {
  493. Display :: display_confirmation_message(get_lang('AllResultDeleted'));
  494. }
  495. if (isset ($_GET['import_score_error'])) {
  496. $userinfo= get_user_info_from_id($_GET['import_score_error']);
  497. Display :: display_warning_message(get_lang('ScoreDoesNotMatch') . ' ' . api_get_person_name($userinfo['firstname'], $userinfo['lastname']));
  498. }
  499. if ($file_type == null) { //show the result header
  500. if (isset ($export_result_form) && !(isset ($edit_res_form))) {
  501. echo '<div class ="normal-message">';
  502. echo $export_result_form->display();
  503. echo '</div>';
  504. DisplayGradebook :: display_header_result($eval[0], $currentcat[0]->get_id(), 1);
  505. } else {
  506. if (isset ($import_result_form)){
  507. echo '<div class ="normal-message">';
  508. echo $import_result_form->display();
  509. echo '</div>';
  510. }
  511. if (isset ($edit_res_form)) {
  512. Display :: display_normal_message($edit_res_form->toHtml(),false);
  513. }
  514. DisplayGradebook :: display_header_result($eval[0], $currentcat[0]->get_id(), 1);
  515. }
  516. $resulttable->display();
  517. Display :: display_footer();
  518. }