gradebook_view_result.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  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. if (api_sort_by_first_name()) {
  296. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_FIRSTNAME, 0, null, true);
  297. } else {
  298. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_LASTNAME,0,null,true);
  299. }
  300. $newarray = array();
  301. $is_western_name_order = api_is_western_name_order();
  302. foreach ($data_array as $data) {
  303. $newitem = array();
  304. if ($is_western_name_order) {
  305. $newitem[] = $data['firstname'];
  306. $newitem[] = $data['lastname'];
  307. } else {
  308. $newitem[] = $data['lastname'];
  309. $newitem[] = $data['firstname'];
  310. }
  311. $newitem[] = $data['score'];
  312. if ($displayscore->is_custom())
  313. $newitem[] = $data['display'];
  314. $newarray[] = $newitem;
  315. }
  316. $pdf->ezSetY(650);
  317. if ($displayscore->is_custom()) {
  318. if ($is_western_name_order) {
  319. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'),get_lang('Display'));
  320. } else {
  321. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'),get_lang('Display'));
  322. }
  323. } else {
  324. if ($is_western_name_order) {
  325. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'));
  326. } else {
  327. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'));
  328. }
  329. }
  330. $pdf->ezTable($newarray,$header_names,'',array('showHeadings'=>1,'shaded'=>1,'showLines'=>1,'rowGap'=>3,'width'=> 500));
  331. $pdf->ezStream();
  332. exit;
  333. }
  334. foreach ($results as $result) {
  335. $userinfo= get_user_info_from_id($result->get_user_id());
  336. $data['user_id']= $result->get_user_id();
  337. $data['official_code']= $userinfo['official_code'];
  338. $data['lastname']= $userinfo['lastname'];
  339. $data['firstname']= $userinfo['firstname'];
  340. $data['score']= $result->get_score();
  341. $data['date']= date('Y-n-j g:i', $result->get_date());
  342. $alldata[]= $data;
  343. }
  344. switch ($file_type) {
  345. case 'xml' :
  346. Export :: export_table_xml($alldata, $filename, 'Result', 'XMLResults');
  347. break;
  348. case 'csv' :
  349. Export :: export_table_csv($alldata, $filename);
  350. break;
  351. }
  352. }
  353. }
  354. if (isset ($_GET['resultdelete'])) {
  355. $result= Result :: load($_GET['resultdelete']);
  356. $result[0]->delete();
  357. header('Location: gradebook_view_result.php?deleteresult=&selecteval=' .Security::remove_XSS($_GET['selecteval']));
  358. exit;
  359. }
  360. if (isset ($_POST['action'])) {
  361. $number_of_selected_items= count($_POST['id']);
  362. if ($number_of_selected_items == '0') {
  363. Display :: display_warning_message(get_lang('NoItemsSelected'),false);
  364. } else {
  365. switch ($_POST['action']) {
  366. case 'delete' :
  367. $number_of_deleted_results= 0;
  368. foreach ($_POST['id'] as $indexstr) {
  369. $result= Result :: load($indexstr);
  370. $result[0]->delete();
  371. $number_of_deleted_results++;
  372. }
  373. header('Location: gradebook_view_result.php?massdelete=&selecteval=' .Security::remove_XSS($_GET['selecteval']));
  374. exit;
  375. break;
  376. }
  377. }
  378. } // TODO - what if selecteval not set ?
  379. $addparams = array ('selecteval' => $eval[0]->get_id());
  380. if (isset ($_GET['print'])) {
  381. $datagen = new ResultsDataGenerator ($eval[0],$allresults);
  382. if (api_sort_by_first_name()) {
  383. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_FIRSTNAME, 0, null, true);
  384. } else {
  385. $data_array = $datagen->get_data(ResultsDataGenerator :: RDG_SORT_LASTNAME,0,null,true);
  386. }
  387. if ($displayscore->is_custom()) {
  388. if (api_is_western_name_order()) {
  389. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'),get_lang('Display'));
  390. } else {
  391. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'),get_lang('Display'));
  392. }
  393. } else {
  394. if (api_is_western_name_order()) {
  395. $header_names = array(get_lang('FirstName'),get_lang('LastName'),get_lang('Score'));
  396. }else {
  397. $header_names = array(get_lang('LastName'),get_lang('FirstName'),get_lang('Score'));
  398. }
  399. }
  400. $newarray = array();
  401. foreach ($data_array as $data) {
  402. $newarray[] = array_slice($data, 2);
  403. }
  404. echo print_table($newarray, $header_names,get_lang('ViewResult'), $eval[0]->get_name());
  405. exit;
  406. } else
  407. $resulttable= new ResultTable($eval[0], $allresults, $iscourse, $addparams);
  408. $htmlHeadXtra[]= '<script type="text/javascript">
  409. function confirmationuser ()
  410. {
  411. if (confirm("' . get_lang('DeleteUser') . '?"))
  412. {return true;}
  413. else
  414. {return false;}
  415. }
  416. function confirmationall ()
  417. {
  418. if (confirm("' . get_lang('DeleteAll') . '?"))
  419. {return true;}
  420. else
  421. {return false;}
  422. }
  423. </script>';
  424. if (isset ($_GET['deleteall'])) {
  425. $eval[0]->delete_results();
  426. header('Location: gradebook_view_result.php?allresdeleted=&selecteval=' . Security::remove_XSS($_GET['selecteval']));
  427. exit;
  428. }
  429. if ((!isset ($_GET['export'])) && (!isset ($_GET['import']))) {
  430. if (!isset($_GET['selectcat'])) {
  431. $interbreadcrumb[]= array (
  432. 'url' => $_SESSION['gradebook_dest'].'?selectcat=' .$currentcat[0]->get_id(),
  433. 'name' => get_lang('Details')
  434. );
  435. }
  436. $interbreadcrumb[]= array (
  437. 'url' => 'gradebook_view_result.php'.'?selecteval='.Security::remove_XSS($_GET['selecteval']),
  438. 'name' => get_lang('ViewResult'
  439. ));
  440. Display :: display_header('');
  441. }
  442. if (isset ($_GET['addresultnostudents'])) {
  443. Display :: display_warning_message(get_lang('AddResultNoStudents'),false);
  444. }
  445. if (isset ($_GET['editresmessage'])) {
  446. Display :: display_confirmation_message(get_lang('ResultEdited'),false);
  447. }
  448. if (isset ($_GET['addresult'])) {
  449. Display :: display_confirmation_message(get_lang('ResultAdded'),false);
  450. }
  451. if (isset ($_GET['adduser'])) {
  452. Display :: display_confirmation_message(get_lang('UserAdded'),false);
  453. }
  454. if (isset ($_GET['deleteresult'])) {
  455. Display :: display_confirmation_message(get_lang('ResultDeleted'),false);
  456. }
  457. if (isset ($_GET['editallresults'])) {
  458. Display :: display_confirmation_message(get_lang('AllResultsEdited'),false);
  459. }
  460. if (isset ($_GET['importok'])) {
  461. Display :: display_confirmation_message(get_lang('FileUploadComplete'),false);
  462. }
  463. if (isset ($_GET['importnofile'])) {
  464. Display :: display_warning_message(get_lang('ImportNoFile'),false);
  465. }
  466. if (isset ($_GET['incorrectdata'])) {
  467. Display :: display_warning_message(get_lang('IncorrectData'),false);
  468. }
  469. if (isset ($_GET['nothingadded'])) {
  470. Display :: display_warning_message(get_lang('ProblemUploadingFile'),false);
  471. }
  472. if (isset ($_GET['massdelete'])) {
  473. Display :: display_confirmation_message(get_lang('ResultsDeleted'),false);
  474. }
  475. if (isset ($_GET['nouser'])) {
  476. Display :: display_warning_message(get_lang('NoUser'),false);
  477. }
  478. if (isset ($_GET['overwritemax'])) {
  479. Display :: display_warning_message(get_lang('OverWriteMax'),false);
  480. }
  481. if (isset ($_GET['importoverwritescore'])) {
  482. Display :: display_confirmation_message(get_lang('ImportOverWriteScore') . ' ' . $_GET['importoverwritescore']);
  483. }
  484. if (isset ($_GET['import_user_error'])) {
  485. $userinfo= get_user_info_from_id($_GET['import_user_error']);
  486. Display :: display_warning_message(get_lang('UserInfoDoesNotMatch') . ' ' . api_get_person_name($userinfo['firstname'], $userinfo['lastname']));
  487. }
  488. if (isset ($_GET['allresdeleted'])) {
  489. Display :: display_confirmation_message(get_lang('AllResultDeleted'));
  490. }
  491. if (isset ($_GET['import_score_error'])) {
  492. $userinfo= get_user_info_from_id($_GET['import_score_error']);
  493. Display :: display_warning_message(get_lang('ScoreDoesNotMatch') . ' ' . api_get_person_name($userinfo['firstname'], $userinfo['lastname']));
  494. }
  495. if ($file_type == null) { //show the result header
  496. if (isset ($export_result_form) && !(isset ($edit_res_form))) {
  497. echo '<div class ="normal-message">';
  498. echo $export_result_form->display();
  499. echo '</div>';
  500. DisplayGradebook :: display_header_result($eval[0], $currentcat[0]->get_id(), 1);
  501. } else {
  502. if (isset ($import_result_form)){
  503. echo '<div class ="normal-message">';
  504. echo $import_result_form->display();
  505. echo '</div>';
  506. }
  507. if (isset ($edit_res_form)) {
  508. Display :: display_normal_message($edit_res_form->toHtml(),false);
  509. }
  510. DisplayGradebook :: display_header_result($eval[0], $currentcat[0]->get_id(), 1);
  511. }
  512. $resulttable->display();
  513. Display :: display_footer();
  514. }