, lots of cleanup + several improvements * @version $Id:exercice.php 12269 2007-05-03 14:17:37Z elixir_julian $ */ // name of the language file that needs to be included $language_file = 'exercice'; // including the global library require_once '../inc/global.inc.php'; require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once '../gradebook/lib/be.inc.php'; // setting the tabs $this_section = SECTION_COURSES; // access control api_protect_course_script(true); $show = (isset ($_GET['show']) && $_GET['show'] == 'result') ? 'result' : 'test'; // moved down to fix bug: http://www.dokeos.com/forum/viewtopic.php?p=18609#18609 // including additional libraries require_once 'exercise.class.php'; require_once 'exercise.lib.php'; require_once 'question.class.php'; require_once 'answer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'fileManage.lib.php'; require_once api_get_path(LIBRARY_PATH) . 'fileUpload.lib.php'; require_once 'hotpotatoes.lib.php'; require_once api_get_path(LIBRARY_PATH) . 'document.lib.php'; require_once api_get_path(LIBRARY_PATH) . 'mail.lib.inc.php'; require_once api_get_path(LIBRARY_PATH) . 'usermanager.lib.php'; /* Constants and variables */ $is_allowedToEdit = api_is_allowed_to_edit(null,true); $is_tutor = api_is_allowed_to_edit(true); $is_tutor_course = api_is_course_tutor(); $tbl_course_rel_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); $TBL_USER = Database :: get_main_table(TABLE_MAIN_USER); $TBL_DOCUMENT = Database :: get_course_table(TABLE_DOCUMENT); $TBL_ITEM_PROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY); $TBL_EXERCICE_ANSWER = Database :: get_course_table(TABLE_QUIZ_ANSWER); $TBL_EXERCICE_QUESTION = Database :: get_course_table(TABLE_QUIZ_TEST_QUESTION); $TBL_EXERCICES = Database :: get_course_table(TABLE_QUIZ_TEST); $TBL_QUESTIONS = Database :: get_course_table(TABLE_QUIZ_QUESTION); $TBL_TRACK_EXERCICES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES); $TBL_TRACK_HOTPOTATOES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES); $TBL_TRACK_ATTEMPT = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); $TBL_TRACK_ATTEMPT_RECORDING= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING); $TBL_LP_ITEM_VIEW = Database :: get_course_table(TABLE_LP_ITEM_VIEW); $TBL_LP_ITEM = Database :: get_course_table(TABLE_LP_ITEM); $TBL_LP_VIEW = Database :: get_course_table(TABLE_LP_VIEW); // document path $documentPath = api_get_path(SYS_COURSE_PATH) . $_course['path'] . "/document"; // picture path $picturePath = $documentPath . '/images'; // audio path $audioPath = $documentPath . '/audio'; // hotpotatoes $uploadPath = DIR_HOTPOTATOES; //defined in main_api $exercicePath = api_get_self(); $exfile = explode('/', $exercicePath); $exfile = strtolower($exfile[sizeof($exfile) - 1]); $exercicePath = substr($exercicePath, 0, strpos($exercicePath, $exfile)); $exercicePath = $exercicePath . "exercice.php"; // maximum number of exercises on a same page $limitExPage = 50; // Clear the exercise session if (isset ($_SESSION['objExercise'])) { api_session_unregister('objExercise'); } if (isset ($_SESSION['objQuestion'])) { api_session_unregister('objQuestion'); } if (isset ($_SESSION['objAnswer'])) { api_session_unregister('objAnswer'); } if (isset ($_SESSION['questionList'])) { api_session_unregister('questionList'); } if (isset ($_SESSION['exerciseResult'])) { api_session_unregister('exerciseResult'); } //general POST/GET/SESSION/COOKIES parameters recovery if (empty ($origin)) { $origin = Security::remove_XSS($_REQUEST['origin']); } if (empty ($choice)) { $choice = $_REQUEST['choice']; } if (empty ($hpchoice)) { $hpchoice = $_REQUEST['hpchoice']; } if (empty ($exerciseId)) { $exerciseId = Database :: escape_string($_REQUEST['exerciseId']); } if (empty ($file)) { $file = Database :: escape_string($_REQUEST['file']); } $learnpath_id = intval($_REQUEST['learnpath_id']); $learnpath_item_id = intval($_REQUEST['learnpath_item_id']); $page = Database :: escape_string($_REQUEST['page']); if ($origin == 'learnpath') { $show = 'result'; } if ($_GET['delete'] == 'delete' && ($is_allowedToEdit || api_is_coach()) && !empty ($_GET['did']) && $_GET['did'] == strval(intval($_GET['did']))) { $sql = 'DELETE FROM ' . Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES) . ' WHERE exe_id = ' . $_GET['did']; //_GET[did] filtered by entry condition Database::query($sql); $filter=Security::remove_XSS($_GET['filter']); header('Location: exercice.php?cidReq=' . Security::remove_XSS($_GET['cidReq']) . '&show=result&filter=' . $filter . ''); exit; } if ($show == 'result' && $_REQUEST['comments'] == 'update' && ($is_allowedToEdit || $is_tutor) && $_GET['exeid']== strval(intval($_GET['exeid']))) { $id = intval($_GET['exeid']); //filtered by post-condition $track_exercise_info = get_exercise_track_exercise_info($id); if (empty($track_exercise_info)) { api_not_allowed(); } $test = $track_exercise_info['title']; $student_id = $track_exercise_info['exe_user_id']; $course_id = $track_exercise_info['exe_cours_id']; $session_id = $track_exercise_info['session_id']; $lp_id = $track_exercise_info['orig_lp_id']; $lp_item_id = $track_exercise_info['orig_lp_item_id']; $lp_item_view_id = $track_exercise_info['orig_lp_item_view_id']; $user_info = api_get_user_info($student_id); $emailid = $user_info['mail']; $from = $_SESSION['_user']['mail']; $from_name = api_get_person_name($_SESSION['_user']['firstName'], $_SESSION['_user']['lastName'], null, PERSON_NAME_EMAIL_ADDRESS); $url = api_get_path(WEB_CODE_PATH) . 'exercice/exercice.php?' . api_get_cidreq() . '&show=result'; $total_weighting = $_REQUEST['totalWeighting']; $my_post_info=array(); $post_content_id=array(); $comments_exist=false; foreach ($_POST as $key_index=>$key_value) { $my_post_info=explode('_',$key_index); $post_content_id[]=$my_post_info[1]; if ($my_post_info[0]=='comments') { $comments_exist=true; } } $loop_in_track=($comments_exist===true) ? (count($_POST)/2) : count($_POST); $array_content_id_exe=array(); if ($comments_exist===true) { $array_content_id_exe=array_slice($post_content_id,$loop_in_track); } else { $array_content_id_exe=$post_content_id; } for ($i=0;$i<$loop_in_track;$i++) { $my_marks = Database::escape_string($_POST['marks_'.$array_content_id_exe[$i]]); $contain_comments = Database::escape_string($_POST['comments_'.$array_content_id_exe[$i]]); if (isset($contain_comments)) { $my_comments = Database::escape_string($_POST['comments_'.$array_content_id_exe[$i]]); } else { $my_comments = ''; } $my_questionid=$array_content_id_exe[$i]; $sql = "SELECT question from $TBL_QUESTIONS WHERE id = '$my_questionid'"; $result =Database::query($sql); $ques_name = Database::result($result,0,"question"); $query = "UPDATE $TBL_TRACK_ATTEMPT SET marks = '$my_marks',teacher_comment = '$my_comments' WHERE question_id = '".$my_questionid."' AND exe_id='".$id."'"; Database::query($query); //Not necessary to update the weight /* $qry = 'SELECT sum(marks) as tot FROM '.$TBL_TRACK_ATTEMPT.' WHERE exe_id = '.$id; $res = Database::query($qry); $tot = Database::result($res,0,'tot'); //updating also the total weight $totquery = "UPDATE $TBL_TRACK_EXERCICES SET exe_result = '".intval($tot)."', exe_weighting = '".Database::escape_string($total_weighting)."' WHERE exe_Id='".$id."'"; Database::query($totquery); */ //@todo Why we insert this? $recording_changes = 'INSERT INTO '.$TBL_TRACK_ATTEMPT_RECORDING.' (exe_id, question_id, marks, insert_date, author, teacher_comment) VALUES ('."'$id','".$my_questionid."','$my_marks','".api_get_utc_datetime()."','".api_get_user_id()."'".',"'.$my_comments.'")'; Database::query($recording_changes); } $qry = 'SELECT DISTINCT question_id, marks FROM ' . $TBL_TRACK_ATTEMPT . ' where exe_id = ' . $id . ' GROUP BY question_id'; $res = Database::query($qry); $tot = 0; while ($row = Database :: fetch_array($res, 'ASSOC')) { $tot += $row['marks']; } $totquery = "UPDATE $TBL_TRACK_EXERCICES SET exe_result = '" . intval($tot) . "' WHERE exe_id='" . $id . "'"; Database::query($totquery); //search items /* if (isset($_POST['my_exe_exo_id']) && isset($_POST['student_id'])) { $sql_lp='SELECT li.id as lp_item_id,li.lp_id,li.item_type,li.path,liv.id AS lp_view_id,liv.user_id,max(liv.view_count) AS view_count FROM '.$TBL_LP_ITEM.' li INNER JOIN '.$TBL_LP_VIEW.' liv ON li.lp_id=liv.lp_id WHERE li.path="'.Database::escape_string($_POST['my_exe_exo_id']).'" AND li.item_type="quiz" AND user_id="'.Database::escape_string($_POST['student_id']).'" '; $rs_lp=Database::query($sql_lp); if (!($rs_lp===false)) { $row_lp=Database::fetch_array($rs_lp); //update score in learnig path $sql_lp_view='UPDATE '.$TBL_LP_ITEM_VIEW.' liv SET score ="'.$tot.'" WHERE liv.lp_item_id="'.(int)$row_lp['lp_item_id'].'" AND liv.lp_view_id="'.(int)$row_lp['lp_view_id'].'" AND liv.view_count="'.(int)$row_lp['view_count'].'" ;'; $rs_lp_view=Database::query($sql_lp_view); } } Database::query($totquery);*/ $subject = get_lang('ExamSheetVCC'); $htmlmessage = '' . '' . '' . '' . '' . '
' . '

' . get_lang('DearStudentEmailIntroduction') . '

' . '

' . get_lang('AttemptVCC') . '

' . ' ' . ' ' . ' ' . ' ' . ' ' . ' ' . ' ' . ' ' . ' ' . '
  ' . get_lang('Question') . '#ques_name#
  ' . get_lang('Exercice') . '#test#
' . '

' . get_lang('ClickLinkToViewComment') . ' #url#
' . '
' . ' ' . get_lang('Regards') . '

' . '
' . ' ' . ' '; $message = '

' . sprintf(get_lang('AttemptVCCLong'), Security::remove_XSS($test)) . ' #url#


'; $mess = str_replace("#test#", Security::remove_XSS($test), $message); //$message= str_replace("#ques_name#",$ques_name,$mess); $message = str_replace("#url#", $url, $mess); $mess = $message; $headers = " MIME-Version: 1.0 \r\n"; $headers .= "User-Agent: Dokeos/1.6"; $headers .= "Content-Transfer-Encoding: 7bit"; $headers .= 'From: ' . $from_name . ' <' . $from . '>' . "\r\n"; $headers = "From:$from_name\r\nReply-to: $to"; //mail($emailid, $subject, $mess,$headers); @api_mail_html($emailid, $emailid, $subject, $mess, $from_name, $from); //Updating LP score here if (in_array($origin, array ('tracking_course','user_course','correct_exercise_in_lp'))) { /* * We do not need this because lp_item_view_id comes to the rescue * //Checking if this is the lastest attempt $sql = "SELECT exe_id FROM $TBL_TRACK_EXERCICES WHERE exe_user_id = '" . Database :: escape_string($_POST['student_id']) . "' AND exe_cours_id = '" . api_get_course_id() . "' AND orig_lp_id = '$lp_item_id' AND orig_lp_item_id = '$lp_item_view_id' AND session_id = '" . api_get_session_id() . "' AND status = '' ORDER BY exe_id DESC LIMIT 1 "; $res_view_count = Database::query($sql); $res_view_count = Database :: fetch_row($res_view_count); $my_view_count = intval($res_view_count[0]); //Update lp_item_view if this attempts is the latest $sql = "SELECT MAX(view_count) FROM $TBL_LP_ITEM_VIEW WHERE lp_item_id = '" . (int) $lp_item_view_id . "' AND lp_view_id = (SELECT id from $TBL_LP_VIEW WHERE user_id = '" . (int) $student_id . "' and lp_id='" . (int) $lp_item_id . "')"; $res_max_view_count = Database::query($sql); $row_max_view_count = Database :: fetch_row($res_max_view_count); $max_view_count = intval($row_max_view_count[0]); //Only update if is the last attempt if ($my_view_count == $_GET['exeid']) { // update score and total_time from last attempt when you qualify the exercise in Learning path detail $sql_update_score = "UPDATE $TBL_LP_ITEM_VIEW SET score = '" . intval($tot) . "' WHERE lp_item_id = '" . (int) $lp_item_view_id . "' AND lp_view_id = (SELECT id from $TBL_LP_VIEW WHERE user_id = '" . (int) $student_id . "' and lp_id='" . (int) $lp_item_id . "') AND view_count = '$max_view_count'"; Database::query($sql_update_score); }*/ $sql_update_score = "UPDATE $TBL_LP_ITEM_VIEW SET score = '" . intval($tot) . "' WHERE id = " .$lp_item_view_id; Database::query($sql_update_score); if ($origin == 'tracking_course') { //Redirect to the course detail in lp header('location: exercise.php?course=' . Security :: remove_XSS($_GET['course'])); //header('location: ../mySpace/lp_tracking.php?course=' . api_get_course_id() . '&origin=' . $origin . '&my_lp_id=' . $lp_item_id . '&lp_id=' . $lp_id . '&student_id=' . $student_id.'&extend_attempt=1&from='.Security::remove_XSS($_GET['from'])); exit; } else { //Redirect to the reporting header('location: ../mySpace/myStudents.php?origin=' . $origin . '&student=' . $student_id . '&details=true&course=' . $course_id.'&session_id='.$session_id); exit; } } } if (!empty($_GET['gradebook']) && $_GET['gradebook']=='view' ) { $_SESSION['gradebook']=Security::remove_XSS($_GET['gradebook']); $gradebook= $_SESSION['gradebook']; } elseif (empty($_GET['gradebook'])) { unset($_SESSION['gradebook']); $gradebook= ''; } if (!empty($gradebook) && $gradebook=='view') { $interbreadcrumb[] = array ( 'url' => '../gradebook/' . $_SESSION['gradebook_dest'], 'name' => get_lang('ToolGradebook') ); } if ($show != 'result') { $nameTools = get_lang('Exercices'); } else { if ($is_allowedToEdit || $is_tutor) { $nameTools = get_lang('StudentScore'); $interbreadcrumb[] = array ( "url" => "exercice.php?gradebook=$gradebook", "name" => get_lang('Exercices') ); } else { $nameTools = get_lang('YourScore'); $interbreadcrumb[] = array ( "url" => "exercice.php?gradebook=$gradebook", "name" => get_lang('Exercices') ); } } // need functions of statsutils lib to display previous exercices scores require_once (api_get_path(LIBRARY_PATH) . 'statsUtils.lib.inc.php'); if ($is_allowedToEdit && !empty ($choice) && $choice == 'exportqti2') { require_once 'export/qti2/qti2_export.php'; $export = export_exercise($exerciseId, true); require_once api_get_path(LIBRARY_PATH) . 'pclzip/pclzip.lib.php'; $archive_path = api_get_path(SYS_ARCHIVE_PATH); $temp_dir_short = uniqid(); $temp_zip_dir = $archive_path . "/" . $temp_dir_short; if (!is_dir($temp_zip_dir)) mkdir($temp_zip_dir, api_get_permissions_for_new_directories()); $temp_zip_file = $temp_zip_dir . "/" . md5(time()) . ".zip"; $temp_xml_file = $temp_zip_dir . "/qti2export_" . $exerciseId . '.xml'; file_put_contents($temp_xml_file, $export); $zip_folder = new PclZip($temp_zip_file); $zip_folder->add($temp_xml_file, PCLZIP_OPT_REMOVE_ALL_PATH); $name = 'qti2_export_' . $exerciseId . '.zip'; //DocumentManager::string_send_for_download($export,true,'qti2export_'.$exerciseId.'.xml'); DocumentManager :: file_send_for_download($temp_zip_file, true, $name); unlink($temp_zip_file); unlink($temp_xml_file); rmdir($temp_zip_dir); exit (); //otherwise following clicks may become buggy } if (!empty ($_POST['export_user_fields'])) { switch ($_POST['export_user_fields']) { case 'export_user_fields' : $_SESSION['export_user_fields'] = true; break; case 'do_not_export_user_fields' : default : $_SESSION['export_user_fields'] = false; break; } } if (!empty ($_POST['export_report']) && $_POST['export_report'] == 'export_report') { if (api_is_platform_admin() || api_is_course_admin() || api_is_course_tutor() || api_is_course_coach()) { $user_id = null; if (empty ($_SESSION['export_user_fields'])) $_SESSION['export_user_fields'] = false; if (!$is_allowedToEdit and !$is_tutor) { $user_id = api_get_user_id(); } require_once ('exercise_result.class.php'); switch ($_POST['export_format']) { case 'xls' : $export = new ExerciseResult(); $export->exportCompleteReportXLS($documentPath, $user_id, $_SESSION['export_user_fields'], $_POST['export_filter']); exit; break; case 'csv' : default : $export = new ExerciseResult(); $export->exportCompleteReportCSV($documentPath, $user_id, $_SESSION['export_user_fields'], $_POST['export_filter']); exit; break; } } else { api_not_allowed(true); } } if ($origin != 'learnpath') { //so we are not in learnpath tool Display :: display_header($nameTools, "Exercise"); if (isset ($_GET['message'])) { if (in_array($_GET['message'], array ( 'ExerciseEdited' ))) { Display :: display_confirmation_message(get_lang($_GET['message'])); } } } else { echo ''; } event_access_tool(TOOL_QUIZ); // Tool introduction Display :: display_introduction_section(TOOL_QUIZ); // selects $limitExPage exercises at the same time $from = $page * $limitExPage; $sql = "SELECT count(id) FROM $TBL_EXERCICES"; $res = Database::query($sql); list ($nbrexerc) = Database :: fetch_array($res); HotPotGCt($documentPath, 1, $_user['user_id']); $tbl_grade_link = Database :: get_main_table(TABLE_MAIN_GRADEBOOK_LINK); // only for administrator if ($is_allowedToEdit) { if (!empty ($choice)) { // construction of Exercise $objExerciseTmp = new Exercise(); $check = Security::check_token('get'); if ($objExerciseTmp->read($exerciseId)) { if ($check) { switch ($choice) { case 'delete' : // deletes an exercise $objExerciseTmp->delete(); //delete link of exercise of gradebook tool $sql = 'SELECT gl.id FROM ' . $tbl_grade_link . ' gl WHERE gl.type="1" AND gl.ref_id="' . $exerciseId . '";'; $result = Database::query($sql); $row = Database :: fetch_array($result, 'ASSOC'); //see if (!empty($row['id'])) { $link = LinkFactory :: load($row['id']); if ($link[0] != null) { $link[0]->delete(); } } Display :: display_confirmation_message(get_lang('ExerciseDeleted')); break; case 'enable' : // enables an exercise $objExerciseTmp->enable(); $objExerciseTmp->save(); // "WHAT'S NEW" notification: update table item_property (previously last_tooledit) Display :: display_confirmation_message(get_lang('VisibilityChanged')); break; case 'disable' : // disables an exercise $objExerciseTmp->disable(); $objExerciseTmp->save(); Display :: display_confirmation_message(get_lang('VisibilityChanged')); break; case 'disable_results' : //disable the results for the learners $objExerciseTmp->disable_results(); $objExerciseTmp->save(); Display :: display_confirmation_message(get_lang('ResultsDisabled')); break; case 'enable_results' : //disable the results for the learners $objExerciseTmp->enable_results(); $objExerciseTmp->save(); Display :: display_confirmation_message(get_lang('ResultsEnabled')); break; case 'clean_results' : //clean student results $quantity_results_deleted= $objExerciseTmp->clean_results(); Display :: display_confirmation_message(sprintf(get_lang('XResultsCleaned'),$quantity_results_deleted)); break; case 'copy_exercise' : //copy an exercise $objExerciseTmp->copy_exercise(); Display :: display_confirmation_message(get_lang('ExerciseCopied')); break; } } } // destruction of Exercise unset ($objExerciseTmp); Security::clear_token(); } if (!empty ($hpchoice)) { switch ($hpchoice) { case 'delete' : // deletes an exercise $imgparams = array (); $imgcount = 0; GetImgParams($file, $documentPath, $imgparams, $imgcount); $fld = GetFolderName($file); for ($i = 0; $i < $imgcount; $i++) { my_delete($documentPath . $uploadPath . "/" . $fld . "/" . $imgparams[$i]); update_db_info("delete", $uploadPath . "/" . $fld . "/" . $imgparams[$i]); } if (my_delete($documentPath . $file)) { update_db_info("delete", $file); } my_delete($documentPath . $uploadPath . "/" . $fld . "/"); break; case 'enable' : // enables an exercise $newVisibilityStatus = "1"; //"visible" $query = "SELECT id FROM $TBL_DOCUMENT WHERE path='" . Database :: escape_string($file) . "'"; $res = Database::query($query); $row = Database :: fetch_array($res, 'ASSOC'); api_item_property_update($_course, TOOL_DOCUMENT, $row['id'], 'visible', $_user['user_id']); //$dialogBox = get_lang('ViMod'); break; case 'disable' : // disables an exercise $newVisibilityStatus = "0"; //"invisible" $query = "SELECT id FROM $TBL_DOCUMENT WHERE path='" . Database :: escape_string($file) . "'"; $res = Database::query($query); $row = Database :: fetch_array($res, 'ASSOC'); api_item_property_update($_course, TOOL_DOCUMENT, $row['id'], 'invisible', $_user['user_id']); break; default : break; } } if ($show == 'test') { $sql = "SELECT id,title,type,active,description, results_disabled FROM $TBL_EXERCICES WHERE active<>'-1' ORDER BY title LIMIT " . (int) $from . "," . (int) ($limitExPage +1); $result = Database::query($sql); } } elseif ($show == 'test') { // only for students $sql = "SELECT id,title,type,description, results_disabled FROM $TBL_EXERCICES WHERE active='1' ORDER BY title LIMIT " . (int) $from . "," . (int) ($limitExPage +1); $result = Database::query($sql); } // the actions echo '
'; // display the next and previous link if needed $from = $page * $limitExPage; $sql = "SELECT count(id) FROM $TBL_EXERCICES"; $res = Database::query($sql); list ($nbrexerc) = Database :: fetch_array($res); HotPotGCt($documentPath, 1, $_user['user_id']); //condition for the session $session_id = api_get_session_id(); $condition_session = api_get_session_condition($session_id,true,true); // only for administrator if ($is_allowedToEdit) { if ($show == 'test') { $sql = "SELECT id, title, type, active, description, results_disabled, session_id, start_time, end_time, random,max_attempt FROM $TBL_EXERCICES WHERE active<>'-1' $condition_session ORDER BY title LIMIT " . (int) $from . "," . (int) ($limitExPage +1); $result = Database::query($sql); } } elseif ($show == 'test') { // only for students $sql = "SELECT id, title, type, description, results_disabled, session_id, start_time, end_time FROM $TBL_EXERCICES WHERE active='1' $condition_session ORDER BY title LIMIT " . (int) $from . "," . (int) ($limitExPage +1); $result = Database::query($sql); } if ($show == 'test') { $nbrExercises = Database :: num_rows($result); //get HotPotatoes files (active and inactive) $res = Database::query("SELECT * FROM $TBL_DOCUMENT WHERE path LIKE '" . Database :: escape_string($uploadPath) . "/%/%'"); $nbrTests = Database :: num_rows($res); $res = Database::query("SELECT * FROM $TBL_DOCUMENT d, $TBL_ITEM_PROPERTY ip WHERE d.id = ip.ref AND ip.tool = '" . TOOL_DOCUMENT . "' AND d.path LIKE '" . Database :: escape_string($uploadPath) . "/%/%' AND ip.visibility='1'"); $nbrActiveTests = Database :: num_rows($res); if ($is_allowedToEdit) { //if user is allowed to edit, also show hidden HP tests $nbrHpTests = $nbrTests; } else { $nbrHpTests = $nbrActiveTests; } $nbrNextTests = $nbrexerc - $nbrHpTests - (($page * $limitExPage)); echo ''; //show pages navigation link for previous page if ($page) { echo "" . Display :: return_icon('previous.gif') . get_lang("PreviousPage") . " | "; } elseif ($nbrExercises + $nbrNextTests > $limitExPage) { echo Display :: return_icon('previous.gif') . get_lang('PreviousPage') . " | "; } //show pages navigation link for previous page if ($nbrExercises + $nbrNextTests > $limitExPage) { echo "" . get_lang("NextPage") . Display :: return_icon('next.gif') . ""; } elseif ($page) { echo get_lang("NextPage") . Display :: return_icon('next.gif'); } echo ''; } if (($is_allowedToEdit) and ($origin != 'learnpath')) { if ($_GET['show'] != 'result') { echo '' . Display :: return_icon('new_test.gif', get_lang('NewEx')) . get_lang('NewEx') . ''; echo '' . Display :: return_icon('question_add.gif', get_lang('AddQuestionToExercise')) . get_lang('AddQuestionToExercise') . ''; echo '' . Display :: return_icon('hotpotatoes_s.png', get_lang('ImportHotPotatoesQuiz')) . get_lang('ImportHotPotatoesQuiz') . ''; // link to import qti2 ... echo '' . Display :: return_icon('import_db.png', get_lang('ImportQtiQuiz')) . get_lang('ImportQtiQuiz') . ''; echo '' . Display :: return_icon('show_test_results.gif', get_lang('Results')) . get_lang('Results') . ''; } // the actions for the statistics if ($show == 'result') { // the form if (api_is_platform_admin() || api_is_course_admin() || api_is_course_tutor() || api_is_course_coach()) { if ($_SESSION['export_user_fields']) { $alt = get_lang('ExportWithUserFields'); $extra_user_fields = ''; } else { $alt = get_lang('ExportWithoutUserFields'); $extra_user_fields = ''; } echo '' . Display :: return_icon('back.png', get_lang('GoBackToQuestionList')) . get_lang('GoBackToQuestionList') . ''; echo ''.Display::return_icon('csv.gif',get_lang('ExportAsCSV')).get_lang('ExportAsCSV').''; echo '' . Display :: return_icon('excel.gif', get_lang('ExportAsXLS')) . get_lang('ExportAsXLS') . ''; echo '
'; echo ''; echo ''; if ($_GET['filter'] == '1' or !isset ($_GET['filter']) or $_GET['filter'] == 0 ) { $filter = 1; } else { $filter = 2; } echo ''; echo '
'; echo '
'; echo ''; echo ''; echo ''; echo '
'; } } } else { //the student view if ($show == 'result') { echo '' . Display :: return_icon('back.png', get_lang('GoBackToQuestionList')) . get_lang('GoBackToQuestionList') . ''; } else { echo '' . Display :: return_icon('show_test_results.gif', get_lang('Results')) . get_lang('Results') . ''; } } if ($_configuration['tracking_enabled']) { if ($show == 'result') { if (api_is_allowed_to_edit(null,true)) { if (!$_GET['filter']) { $filter_by_not_revised = true; $filter = 1; } else { $filter=Security::remove_XSS($_GET['filter']); } $filter = (int) $_GET['filter']; switch ($filter) { case 1 : $filter_by_not_revised = true; break; case 2 : $filter_by_revised = true; break; default : null; } if ($_GET['filter'] == '1' or !isset ($_GET['filter']) or $_GET['filter'] == 0 ) { $view_result = ''.Display :: return_icon('check.gif', get_lang('ShowCorrectedOnly')).get_lang('ShowCorrectedOnly').''; } else { $view_result = ''.Display :: return_icon('un_check.gif', get_lang('ShowUnCorrectedOnly')).get_lang('ShowUnCorrectedOnly').''; } echo $view_result; } } } echo '
'; // closing the actions div if ($show == 'test') { ?> $start_time && $end_time > $now ) { $is_actived_time = true; } } if ($i % 2 == 0) $s_class = "row_odd"; else $s_class = "row_even"; // prof only if ($is_allowedToEdit) { echo ''; echo ''; echo ''; //Showing exercise title $row['title']=text_filter($row['title']); echo ''; echo ''; } else { echo $rowi . ' ' . api_strtolower(get_lang(($rowi > 1 ? 'Questions' : 'Question'))) . ''; } echo '"; } else { // student only ?> '; echo ''; /*} else { echo get_lang('NotAttempted'); }*/ } // skips the last exercise, that is only used to know if we have or not to create a link "Next page" if ($i == $limitExPage) { break; } $i++; } // end while() $ind = $i; if (($from + $limitExPage -1) > $nbrexerc) { if ($from > $nbrexerc) { $from = $from - $nbrexerc; $to = $limitExPage; } else { $to = $limitExPage - ($nbrexerc - $from); $from = 0; } } else { $to = $limitExPage; } if ($is_allowedToEdit) { $sql = "SELECT d.path as path, d.comment as comment, ip.visibility as visibility FROM $TBL_DOCUMENT d, $TBL_ITEM_PROPERTY ip WHERE d.id = ip.ref AND ip.tool = '" . TOOL_DOCUMENT . "' AND (d.path LIKE '%htm%') AND d.path LIKE '" . Database :: escape_string($uploadPath) . "/%/%' LIMIT " . (int) $from . "," . (int) $to; // only .htm or .html files listed } else { $sql = "SELECT d.path as path, d.comment as comment, ip.visibility as visibility FROM $TBL_DOCUMENT d, $TBL_ITEM_PROPERTY ip WHERE d.id = ip.ref AND ip.tool = '" . TOOL_DOCUMENT . "' AND (d.path LIKE '%htm%') AND d.path LIKE '" . Database :: escape_string($uploadPath) . "/%/%' AND ip.visibility='1' LIMIT " . (int) $from . "," . (int) $to; } $result = Database::query($sql); while ($row = Database :: fetch_array($result, 'ASSOC')) { $attribute['path'][] = $row['path']; $attribute['visibility'][] = $row['visibility']; $attribute['comment'][] = $row['comment']; } $nbrActiveTests = 0; if (is_array($attribute['path'])) { while (list ($key, $path) = each($attribute['path'])) { list ($a, $vis) = each($attribute['visibility']); if (strcmp($vis, "1") == 0) { $active = 1; } else { $active = 0; } echo "\n"; $title = GetQuizName($path, $documentPath); if ($title == '') { $title = basename($path); } // prof only if ($is_allowedToEdit) { echo ' '. ' '. ' '. ' '. ' '. ' '; } else { // student only if ($active == 1) { $nbrActiveTests = $nbrActiveTests +1; echo ' '. ' ' . ' '. ' '. ' '; } } if ($ind == $limitExPage) { break; } if ($is_allowedToEdit) { $ind++; } else { if ($active == 1) { $ind++; } } } } } //end if ($origin != 'learnpath') { echo '
>
'.Display::return_icon('quiz.gif', get_lang('Exercice')) .''.($i+($page*$limitExPage)).'.'.''; $class_invisible = ''; if (!$row['active']) { $class_invisible = 'class="invisible"'; } echo ''; echo Security::remove_XSS($row['title']); echo ''; echo $session_img; echo ''; $exid = $row['id']; //count number exercice - teacher $sqlquery = "SELECT count(*) FROM $TBL_EXERCICE_QUESTION WHERE exercice_id = '" . Database :: escape_string($exid) . "'"; $sqlresult = Database::query($sqlquery); $rowi = Database :: result($sqlresult, 0); //useless query /*$sql_random_query = 'SELECT type,random,active,results_disabled,max_attempt FROM ' . $TBL_EXERCICES . ' WHERE id="' . Database :: escape_string($exid) . '" '; $rs_random = Database::query($sql_random_query); $row_random = Database :: fetch_array($rs_random);*/ $random_label = ''; if ($row['random'] > 0) { $random_label = ' ('.get_lang('Random').') '; echo $row['random'] . ' ' . api_strtolower(get_lang(($row['random'] > 1 ? 'Questions' : 'Question'))) .$random_label. ''; if ($session_id == $row['session_id']) { ?> <?php echo api_htmlentities(get_lang('Edit'),ENT_QUOTES,$charset); ?> ')) return false;"><?php echo api_htmlentities(get_lang('CopyExercise'),ENT_QUOTES,$charset); ?> ')) return false;" ><?php echo api_htmlentities(get_lang('CleanStudentResults'),ENT_QUOTES,$charset); ?> ')) return false;"> <?php echo api_htmlentities(get_lang('Delete'),ENT_QUOTES,$charset); ?> <?php echo api_htmlentities(get_lang('Deactivate'),ENT_QUOTES,$charset); ?> <?php echo api_htmlentities(get_lang('Activate'),ENT_QUOTES,$charset); ?> '; } else { // not session resource echo Display::return_icon('wizard_gray_small.gif', get_lang('ExerciseEditionNotAvailableInSession'), array('title'=>get_lang('ExerciseEditionNotAvailableInSession'))); ?> ')) return false;"><?php echo api_htmlentities(get_lang('CopyExercise'),ENT_QUOTES,$charset); ?> "; echo "
'.$row['title'].''; } else { echo $row['title']; } } else { echo ''.$row['title'].''; } echo ''; $exid = $row['id']; //count number exercise questions $sqlquery = "SELECT count(*) FROM $TBL_EXERCICE_QUESTION WHERE exercice_id = '" . Database :: escape_string($exid) . "'"; $sqlresult = Database::query($sqlquery); $rowi = Database :: result($sqlresult, 0); //count number random exercice $sql_random_query = 'SELECT type,random,active,results_disabled,max_attempt FROM ' . $TBL_EXERCICES . ' WHERE id="' . Database :: escape_string($exid) . '" '; $rs_random = Database::query($sql_random_query); $row_random = Database :: fetch_array($rs_random); if ($row_random['random'] > 0) { echo $row_random['random'] . ' ' . api_strtolower(get_lang(($row_random['random'] > 1 ? 'Questions' : 'Question'))); } else { //show results student echo $rowi . ' ' . api_strtolower(get_lang(($rowi > 1 ? 'Questions' : 'Question'))); } echo ''; $eid = $row['id']; $uid = api_get_user_id(); //this query might be improved later on by ordering by the new "tms" field rather than by exe_id $qry = "SELECT * FROM $TBL_TRACK_EXERCICES WHERE exe_exo_id = '" . Database :: escape_string($eid) . "' and exe_user_id = '" . Database :: escape_string($uid) . "' AND exe_cours_id = '" . api_get_course_id() . "' AND status <>'incomplete' AND orig_lp_id = 0 AND orig_lp_item_id = 0 AND session_id = '" . api_get_session_id() . "' ORDER BY exe_id DESC"; $qryres = Database::query($qry); $num = Database :: num_rows($qryres); //hide the results $my_result_disabled = $row['results_disabled']; if ($time_limits) { if ($my_result_disabled == 0) { if ($num > 0) { echo sprintf(get_lang('ExerciseWillBeActivatedFromXToY'), api_get_local_time($row['start_time']), api_get_local_time($row['end_time'])); } else { echo get_lang('NotAttempted'); } } else { echo get_lang('CantShowResults'); } } else { if ($my_result_disabled == 0) { if ($num > 0) { $row = Database :: fetch_array($qryres); $percentage = 0; if ($row['exe_weighting'] != 0) { $percentage = ($row['exe_result'] / $row['exe_weighting']) * 100; } echo get_lang('Attempted') . ' (' . get_lang('Score') . ': '; printf("%1.2f\n", $percentage); echo " %)"; } else { //echo get_lang('WillBeActivated' .' '. $row['start_time']); echo get_lang('NotAttempted'); } } else { echo get_lang('CantShowResults'); } } echo '
HotPotatoes'.($ind+($page*$limitExPage)).'.'.$title.'-' . ' '. ' '.api_htmlentities(get_lang('Modify'),ENT_QUOTES,$charset).'' . ' '. ' '.api_htmlentities(get_lang('Delete'),ENT_QUOTES,$charset).''; // if active if ($active) { $nbrActiveTests = $nbrActiveTests +1; echo ' '.api_htmlentities(get_lang('Deactivate'),ENT_QUOTES,$charset).''; } else { // else if not active echo ' '.api_htmlentities(get_lang('Activate'),ENT_QUOTES,$charset).''; } echo ''; echo '
'.($ind+($page*$limitExPage)).'.'.$title.'--
'; } /* Exercise Results (uses tracking tool) */ // if tracking is enabled if ($_configuration['tracking_enabled'] && ($show == 'result')) { $session_id_and = ' AND te.session_id = ' . api_get_session_id() . ' '; if ($is_allowedToEdit || $is_tutor) { $user_id_and = ''; if (!empty ($_POST['filter_by_user'])) { if ($_POST['filter_by_user'] == 'all') { $user_id_and = " AND user_id like '%'"; } else { $user_id_and = " AND user_id = '" . Database :: escape_string((int) $_POST['filter_by_user']) . "' "; } } if ($_GET['gradebook'] == 'view') { $exercise_where_query = 'te.exe_exo_id =ce.id AND '; } //@todo fix to work with COURSE_RELATION_TYPE_RRHH in both queries /*$sql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").", ce.title as extitle, te.exe_result as exresult , te.exe_weighting as exweight, te.exe_date as exdate, te.exe_id as exid, email as exemail, te.start_date as exstart, steps_counter as exstep,cuser.user_id as excruid,te.exe_duration as exduration FROM $TBL_EXERCICES AS ce , $TBL_TRACK_EXERCICES AS te, $TBL_USER AS user,$tbl_course_rel_user AS cuser WHERE user.user_id=cuser.user_id AND cuser.relation_type<>".COURSE_RELATION_TYPE_RRHH." AND te.exe_exo_id = ce.id AND te.status != 'incomplete' AND cuser.user_id=te.exe_user_id AND te.exe_cours_id='" . Database :: escape_string($_cid) . "' $user_id_and $session_id_and AND ce.active <>-1 AND orig_lp_id = 0 AND orig_lp_item_id = 0 AND cuser.course_code=te.exe_cours_id ORDER BY userpart2, te.exe_cours_id ASC, ce.title ASC, te.exe_date DESC";*/ $sql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").", ce.title as extitle, te.exe_result as exresult , te.exe_weighting as exweight, te.exe_date as exdate, te.exe_id as exid, email as exemail, te.start_date as exstart, steps_counter as exstep, exe_user_id as excruid,te.exe_duration as exduration FROM $TBL_EXERCICES AS ce INNER JOIN $TBL_TRACK_EXERCICES AS te ON (te.exe_exo_id = ce.id) INNER JOIN $TBL_USER AS user ON (user.user_id = exe_user_id) WHERE te.status != 'incomplete' AND te.exe_cours_id='" . Database :: escape_string($_cid) . "' $user_id_and $session_id_and AND ce.active <>-1 AND orig_lp_id = 0 AND orig_lp_item_id = 0"; $hpsql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").", tth.exe_name, tth.exe_result , tth.exe_weighting, tth.exe_date FROM $TBL_TRACK_HOTPOTATOES tth, $TBL_USER tu WHERE tu.user_id=tth.exe_user_id AND tth.exe_cours_id = '" . Database :: escape_string($_cid) . " $user_id_and ' ORDER BY tth.exe_cours_id ASC, tth.exe_date DESC"; } else { // get only this user's results $user_id_and = ' AND te.exe_user_id = ' . api_get_user_id() . ' '; /*$sql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").", ce.title as extitle, te.exe_result as exresult, " . "te.exe_weighting as exweight, te.exe_date as exdate, te.exe_id as exid, email as exemail, " . "te.start_date as exstart, steps_counter as exstep, cuser.user_id as excruid, te.exe_duration as exduration, ce.results_disabled as exdisabled FROM $TBL_EXERCICES AS ce , $TBL_TRACK_EXERCICES AS te, $TBL_USER AS user,$tbl_course_rel_user AS cuser WHERE user.user_id=cuser.user_id AND te.exe_exo_id = ce.id AND te.status != 'incomplete' AND cuser.user_id=te.exe_user_id AND te.exe_cours_id='" . Database :: escape_string($_cid) . "' AND cuser.relation_type<>".COURSE_RELATION_TYPE_RRHH." $user_id_and $session_id_and AND ce.active <>-1 AND" . " orig_lp_id = 0 AND orig_lp_item_id = 0 AND cuser.course_code=te.exe_cours_id ORDER BY userpart2, te.exe_cours_id ASC, ce.title ASC, te.exe_date DESC";*/ $sql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").", ce.title as extitle, te.exe_result as exresult, " . "te.exe_weighting as exweight, te.exe_date as exdate, te.exe_id as exid, email as exemail, " . "te.start_date as exstart, steps_counter as exstep, exe_user_id as excruid, te.exe_duration as exduration, ce.results_disabled as exdisabled FROM $TBL_EXERCICES AS ce INNER JOIN $TBL_TRACK_EXERCICES AS te ON (te.exe_exo_id = ce.id) INNER JOIN $TBL_USER AS user ON (user.user_id = exe_user_id) WHERE te.status != 'incomplete' AND te.exe_cours_id='" . Database :: escape_string($_cid) . "' $user_id_and $session_id_and AND ce.active <>-1 AND" . " orig_lp_id = 0 AND orig_lp_item_id = 0 ORDER BY userpart2, te.exe_cours_id ASC, ce.title ASC, te.exe_date DESC"; $hpsql = "SELECT '',exe_name, exe_result , exe_weighting, exe_date FROM $TBL_TRACK_HOTPOTATOES WHERE exe_user_id = '" . $_user['user_id'] . "' AND exe_cours_id = '" . Database :: escape_string($_cid) . "' ORDER BY exe_cours_id ASC, exe_date DESC"; } $results = array(); $resx = Database::query($sql); while ($rowx = Database::fetch_array($resx,'ASSOC')) { $results[] = $rowx; } $hpresults = getManyResultsXCol($hpsql, 5); $has_test_results = false; $list_info = array(); // Print test results. $lang_nostartdate = get_lang('NoStartDate') . ' / '; if (is_array($results)) { $has_test_results = true; $users_array_id = array (); if ($_GET['gradebook'] == 'view') { $filter_by_no_revised = true; $from_gradebook = true; } $sizeof = sizeof($results); $user_list_id = array (); $user_last_name = ''; $user_first_name = ''; $quiz_name_list = ''; $duration_list = ''; $date_list = ''; $result_list = ''; $more_details_list = ''; for ($i = 0; $i < $sizeof; $i++) { $revised = false; $sql_exe = 'SELECT exe_id FROM ' . $TBL_TRACK_ATTEMPT_RECORDING . ' WHERE author != ' . "''" . ' AND exe_id = ' . "'" . Database :: escape_string($results[$i]['exid']) . "'" . ' LIMIT 1'; $query = Database::query($sql_exe); if (Database :: num_rows($query) > 0) { $revised = true; } if ($filter_by_not_revised && $revised) { continue; } if ($filter_by_revised && !$revised) { continue; } if ($from_gradebook && ($is_allowedToEdit || $is_tutor)) { if (in_array($results[$i]['extitle'] . $results[$i]['userpart1'] . $results[$i]['userpart2'], $users_array_id)) { continue; } $users_array_id[] = $results[$i]['extitle'] . $results[$i]['userpart1'] . $results[$i]['userpart2']; } $user_first_name = $results[$i]['userpart1']; $user_last_name = $results[$i]['userpart2']; $user_list_id[] = $results[$i]['excruid']; $id = $results[$i]['exid']; $user = $results[$i]['userpart1'] . $results[$i]['userpart2'];; $test = $results[$i]['extitle']; $quiz_name_list = $test; $dt = api_convert_and_format_date($results[$i]['exweight'], null, date_default_timezone_get()); $res = $results[$i]['exresult']; $duration = intval($results[$i]['exduration']); // we filter the results if we have the permission to if (isset ($results[$i]['exdisabled'])) $result_disabled = intval($results[$i]['exdisabled']); else $result_disabled = 0; if ($result_disabled == 0) { $add_start_date = $lang_nostartdate; if ($is_allowedToEdit || $is_tutor) { $user = $results[$i]['userpart1'] . $results[$i]['userpart2']; } if ($results[$i]['exstart'] != "0000-00-00 00:00:00") { //echo ceil((($results[$i][4] - $results[$i][7]) / 60)) . ' ' . get_lang('MinMinutes'); $exe_date_timestamp = api_strtotime($results[$i]['exdate'], date_default_timezone_get()); $start_date_timestamp = api_strtotime($results[$i]['exstart'], date_default_timezone_get()); $my_duration = ceil((($exe_date_timestamp - $start_date_timestamp) / 60)); if ($my_duration == 1 ) { $duration_list = $my_duration . ' ' . get_lang('MinMinute'); } else { $duration_list = $my_duration. ' ' . get_lang('MinMinutes'); } if ($results[$i]['exstep'] > 1) { //echo ' ( ' . $results[$i][8] . ' ' . get_lang('Steps') . ' )'; $duration_list = ' ( ' . $results[$i]['exstep'] . ' ' . get_lang('Steps') . ' )'; } $add_start_date = api_convert_and_format_date($results[$i]['exstart'], null, date_default_timezone_get()) . ' / '; } else { $duration_list = get_lang('NoLogOfDuration'); //echo get_lang('NoLogOfDuration'); } // Date conversion $date_list = api_get_local_time($results[$i]['exstart']). ' / ' . api_get_local_time($results[$i]['exdate']); // there are already a duration test period calculated?? //echo ''.sprintf(get_lang('DurationFormat'), $duration).''; // if the float look like 10.00 we show only 10 $my_res = float_format($results[$i]['exresult'],1); $my_total = float_format($results[$i]['exweight'],1); $result_list = round(($my_res / ($my_total != 0 ? $my_total : 1)) * 100, 2) . '% (' . $my_res . ' / ' . $my_total . ')'; $html_link = ''; if ($is_allowedToEdit || $is_tutor) { if ($revised) { $html_link.= "".Display :: return_icon('edit.gif', get_lang('Edit')); $html_link.= ' '; } else { $html_link.="".Display :: return_icon('quizz_small.gif', get_lang('Qualify')); $html_link.=' '; } $html_link.=""; if (api_is_platform_admin() || $is_tutor) { $html_link.=' '.Display :: return_icon('delete.gif', get_lang('Delete')).''; $html_link.=' '; } if ($is_allowedToEdit) { if ($filter==2){ $html_link.=' ' .Display :: return_icon('history.gif', get_lang('ViewHistoryChange')).''; } } } else { if ($revised) { $html_link.="" . get_lang('Show') . " "; } else { $html_link.=' ' . get_lang('NoResult'); } } $more_details_list = $html_link; if ($is_allowedToEdit || $is_tutor) { $list_info [] = array($user_first_name,$user_last_name,$quiz_name_list,$duration_list,$date_list,$result_list,$more_details_list); } else { $list_info [] = array($quiz_name_list,$duration_list,$date_list,$result_list,$more_details_list); } } } } // Print HotPotatoes test results. if (is_array($hpresults)) { $has_test_results = true; for ($i = 0; $i < sizeof($hpresults); $i++) { $hp_title = GetQuizName($hpresults[$i][1], $documentPath); if ($hp_title == '') { $hp_title = basename($hpresults[$i][1]); } //$hp_date = api_convert_and_format_date($hpresults[$i][4], null, date_default_timezone_get()); $hp_date = api_get_local_time($hpresults[$i][4], null, date_default_timezone_get()); $hp_result = round(($hpresults[$i][2] / ($hpresults[$i][3] != 0 ? $hpresults[$i][3] : 1)) * 100, 2).'% ('.$hpresults[$i][2].' / '.$hpresults[$i][3].')'; if ($is_allowedToEdit) { $list_info[] = array($hpresults[$i][0], $hp_title, '-', $hp_date , $hp_result , '-'); } else { $list_info[] = array($hp_title, '-', $hp_date , $hp_result , '-'); } } } if ($has_test_results) { $parameters=array('cidReq'=>Security::remove_XSS($_GET['cidReq']),'show'=>Security::remove_XSS($_GET['show']),'filter' => Security::remove_XSS($_GET['filter']),'gradebook' =>Security::remove_XSS($_GET['gradebook'])); $table = new SortableTableFromArrayConfig($list_info, 1,20,'quiz_table'); $table->set_additional_parameters($parameters); $secuence = 2; if ($is_allowedToEdit || $is_tutor) { $secuence = 0; if (api_is_western_name_order()) { $table->set_header(0, get_lang('FirstName')); $table->set_header(1, get_lang('LastName')); } else { $table->set_header(0, get_lang('LastName')); $table->set_header(1, get_lang('FirstName')); } } $table->set_header(-$secuence + 2, get_lang('Exercice')); $table->set_header(-$secuence + 3, get_lang('Duration'),false); $table->set_header(-$secuence + 4, get_lang('Date')); $table->set_header(-$secuence + 5, get_lang('Result'),false); $table->set_header(-$secuence + 6, (($is_allowedToEdit||$is_tutor) ? get_lang('CorrectTest') : get_lang('ViewTest')), false); $table->display(); } else { echo get_lang('NoResult'); } } if ($origin != 'learnpath') { //so we are not in learnpath tool Display :: display_footer(); } else { ?>