gradebook_view_result.php 18 KB

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