@ -43,8 +43,11 @@ $current_course_tool = TOOL_QUIZ;
$nameTools = get_lang('Quiz');
$this_section = SECTION_COURSES;
if ($debug) { error_log('--- Enter to the exercise_submit.php ---- '); error_log('0. POST variables : '.print_r($_POST,1)); }
$debug = true;
if ($debug) {
error_log('--- Enter to the exercise_submit.php ---- ');
error_log('0. POST variables : '.print_r($_POST,1));
}
// Notice for unauthorized people.
api_protect_course_script(true);
@ -311,35 +314,48 @@ $(function(){
// General parameters passed via POST/GET
$learnpath_id = isset($_REQUEST['learnpath_id']) ? intval($_REQUEST['learnpath_id']) : 0;
$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? intval($_REQUEST['learnpath_item_id']) : 0;
$learnpath_item_view_id = isset($_REQUEST['learnpath_item_view_id']) ? intval($_REQUEST['learnpath_item_view_id']) : 0;
$origin = isset($_REQUEST['origin']) ? Security::remove_XSS($_REQUEST['origin']) : '';
$reminder = isset($_REQUEST['reminder']) ? intval($_REQUEST['reminder']) : 0;
$remind_question_id = isset($_REQUEST['remind_question_id']) ? intval($_REQUEST['remind_question_id']) : 0;
/*
< input type = "hidden" name = "formSent" value = "1" / >
< input type = "hidden" name = "exerciseId" value = "'.$exerciseId . '" / >
< input type = "hidden" name = "num" value = "'.$current_question.'" id = "num_current_id" / >
< input type = "hidden" name = "exe_id" value = "'.$exe_id . '" / >
< input type = "hidden" name = "origin" value = "'.$origin . '" / >
< input type = "hidden" name = "learnpath_id" value = "'.$learnpath_id . '" / >
< input type = "hidden" name = "learnpath_item_id" value = "'.$learnpath_item_id . '" / >
< input type = "hidden" name = "learnpath_item_view_id" value = "'.$learnpath_item_view_id . '" / > ';*/
// @todo check get and posts
$learnpath_id = isset($_GET['learnpath_id']) ? intval($_GET['learnpath_id']) : 0;
$learnpath_item_id = isset($_GET['learnpath_item_id']) ? intval($_GET['learnpath_item_id']) : 0;
$learnpath_item_view_id = isset($_GET['learnpath_item_view_id']) ? intval($_GET['learnpath_item_view_id']) : 0;
$origin = isset($_GET['origin']) ? Security::remove_XSS($_GET['origin']) : '';
$reminder = isset($_GET['reminder']) ? intval($_GET['reminder']) : 0;
$remind_question_id = isset($_GET['remind_question_id']) ? intval($_GET['remind_question_id']) : 0;
$exerciseId = isset($_REQUEST['exerciseId']) ? intval($_REQUEST['exerciseId']) : 0;
$formSent = isset($_REQUEST['formSent']) ? $_REQUEST['formSent'] : null;
$exerciseResult = isset($_REQUEST['exerciseResult']) ? $_REQUEST['exerciseResult'] : null;
$choice = isset($_REQUEST['choice']) ? $_REQUEST['choice'] : null;
$choice = empty($choice) ? isset($_REQUEST['choice2']) ? $_REQUEST['choice2'] : null : null;
$exerciseResultCoordinates = isset($_REQUEST['exerciseResultCoordinates']) ? $_REQUEST['exerciseResultCoordinates'] : null;
$formSent = isset($_POST['formSent']) ? $_PO ST['formSent'] : null;
$exerciseResult = isset($_GET['exerciseResult']) ? $_GE T['exerciseResult'] : null;
$choice = isset($_GET['choice']) ? $_GE T['choice'] : null;
$choice = empty($choice) ? isset($_GET['choice2']) ? $_GE T['choice2'] : null : null;
$exerciseResultCoordinates = isset($_GET['exerciseResultCoordinates']) ? $_GE T['exerciseResultCoordinates'] : null;
$current_question = isset($_REQUEST['num']) ? intval($_REQUEST['num']) : null;
//Error message
$error = '';
/* Teacher takes an exam and want to see a preview, we delete the objExercise from the session in order to get the latest changes in the exercise */
/* Teacher takes an exam and want to see a preview,
we delete the objExercise from the session in order to get the latest changes in the exercise */
if (api_is_allowed_to_edit(null,true) & & isset($_GET['preview']) & & $_GET['preview'] == 1) {
Session::erase('objExercise');
}
$exerciseInSession = Session::read('objExercise');
// 1. Loading the $objExercise variable
if (!isset($_SESSION['objExercise']) || isset($_SESSION['objExercise']) & & ($_SESSION['objExercise']->id != $_REQUES T['exerciseId'])) {
if (!isset($exerciseInSession) || isset($exerciseInSession) & & ($exerciseInSession->id != $_GE T['exerciseId'])) {
// Construction of Exercise
/** @var Exercise $objExercise */
$objExercise = new Exercise();
if ($debug) {error_log('1. Setting the $objExercise variable'); };
unset($_SESSION['questionList'] );
Session::erase('questionList' );
// if the specified exercise doesn't exist or is disabled
if (!$objExercise->read($exerciseId) || (!$objExercise->selectStatus() & & !$is_allowedToEdit & & ($origin != 'learnpath'))) {
@ -349,21 +365,25 @@ if (!isset($_SESSION['objExercise']) || isset($_SESSION['objExercise']) && ($_SE
} else {
// Saves the object into the session
Session::write('objExercise', $objExercise);
if ($debug) { error_log('1.1. $_SESSION[objExercise] was unset - set now - end'); };
if ($debug) {
error_log('1.1. $exerciseInSession was unset - set now - end');
};
}
}
// $objExercise = new Exercise(); $objExercise->read($exerciseId);
//2. Checking if $objExercise is set
if (!isset($objExercise) & & isset($_SESSION['objExercise'] )) {
if (!isset($objExercise) & & isset($exerciseInSession )) {
if ($debug) { error_log('2. Loading $objExercise from session'); };
$objExercise = $_SESSION['objExercise'] ;
$objExercise = $exerciseInSession ;
}
//3. $objExercise is not set, then return to the exercise list
if (!is_object($objExercise)) {
if ($debug) {error_log('3. $objExercise was not set, kill the script'); };
if ($debug) {
error_log('3. $objExercise was not set, kill the script');
};
header('Location: '.$urlMainExercise.'exercice.php');
exit;
}
@ -374,7 +394,7 @@ if ($objExercise->review_answers) {
$paramsReminder = "exerciseId=$exerciseId&origin=$origin&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id&learnpath_item_view_id=$learnpath_item_view_id&".api_get_cidreq();
header('Location: '.$urlMainExercise.'exercise_reminder.php?'.$paramsReminder);
exit;
}
}
}
$current_timestamp = time();
@ -388,10 +408,15 @@ if ($objExercise->expired_time != 0) {
//Generating the time control key for the user
$current_expired_time_key = ExerciseLib::get_time_control_key($objExercise->id, $learnpath_id, $learnpath_item_id);
if ($debug) {
error_log("4. current_expired_time_key: $current_expired_time_key ");
error_log("4. current_expired_time_key: $current_expired_time_key");
}
$_SESSION['duration_time'][$current_expired_time_key] = $current_timestamp;
$durationTime = array(
$current_expired_time_key => $current_timestamp
);
Session::write('duration_time', $durationTime);
//$_SESSION['duration_time'][$current_expired_time_key] = $current_timestamp;
if ($time_control) {
// Get the expired time of the current exercise in track_e_exercices.
@ -407,20 +432,33 @@ if ($objExercise->selectAttempts() > 0) {
$attempt_html = null;
$attempt_count = get_attempt_count($user_id, $exerciseId, $learnpath_id, $learnpath_item_id, $learnpath_item_view_id);
$warningMessage = Display::return_message(
sprintf(get_lang('ReachedMaxAttempts'),
$exercise_title,
$objExercise->selectAttempts()),
'warning',
false
);
if ($attempt_count >= $objExercise->selectAttempts()) {
$show_clock = false;
if (!api_is_allowed_to_edit(null,true)) {
if ($objExercise->results_disabled == 0 & & $origin != 'learnpath') {
//Showing latest attempt according with task BT#1628
$exercise_stat_info = getExerciseResultsByUser($user_id, $exerciseId, api_get_course_int_id(), api_get_session_id());
// Showing latest attempt according with task BT#1628.
$exercise_stat_info = getExerciseResultsByUser(
$user_id,
$exerciseId,
api_get_course_int_id(),
api_get_session_id()
);
if (!empty($exercise_stat_info)) {
$max_exe_id = max(array_keys($exercise_stat_info));
$last_attempt_info = $exercise_stat_info[$max_exe_id];
$attempt_html .= Display::div(get_lang('Date').': '.api_get_local_time($last_attempt_info['exe_date']), array('id'=>''));
$attempt_html .= Display::return_message(sprintf(get_lang('ReachedMaxAttempts'), $exercise_title, $objExercise->selectAttempts()), 'warning', false) ;
$attempt_html .= $warningMessage ;
if (!empty($last_attempt_info['question_list'])) {
foreach($last_attempt_info['question_list'] as $question_data) {
@ -435,13 +473,13 @@ if ($objExercise->selectAttempts() > 0) {
$score = ExerciseLib::show_score($last_attempt_info['exe_result'], $last_attempt_info['exe_weighting']);
$attempt_html .= Display::div(get_lang('YourTotalScore').' '.$score, array('id'=>'question_score'));
} else {
$attempt_html .= Display::return_message(sprintf(get_lang('ReachedMaxAttempts'), $exercise_title, $objExercise->selectAttempts()), 'warning', false) ;
$attempt_html .= $warningMessage ;
}
} else {
$attempt_html .= Display::return_message(sprintf(get_lang('ReachedMaxAttempts'), $exercise_title, $objExercise->selectAttempts()), 'warning', false) ;
$attempt_html .= $warningMessage ;
}
} else {
$attempt_html .= Display :: return_message(sprintf(get_lang('ReachedMaxAttempts'), $exercise_title, $objExercise->selectAttempts()), 'warning', false) ;
$attempt_html .= $warningMessage ;
}
if ($origin == 'learnpath') {
@ -462,7 +500,8 @@ if ($objExercise->selectAttempts() > 0) {
$exercise_stat_info = $objExercise->getStatTrackExerciseInfo($learnpath_id, $learnpath_item_id, $learnpath_item_view_id);
//if (1) {
if (!isset($_SESSION['questionList'])) {
$questionListInSession = Session::read('questionList');
if (!isset($questionListInSession)) {
// Selects the list of question ID
$questionList = $objExercise->getQuestionList();
@ -476,7 +515,7 @@ if (!isset($_SESSION['questionList'])) {
Session::write('questionList', $questionList);
if ($debug > 0) { error_log('$_SESSION[questionList] was set'); }
} else {
if (isset($objExercise) & & isset($_SESSION['objExercise'] )) {
if (isset($objExercise) & & isset($exerciseInSession )) {
$questionList = Session::read('questionList');
}
}
@ -503,12 +542,15 @@ if (empty($exercise_stat_info)) {
if ($debug) error_log('5.1. $current_timestamp '.$current_timestamp);
if ($debug) error_log('5.2. $expected_time '.$expected_time);
$clock_expired_time = api_get_utc_datetime($expected_time);
$clock_expired_time = api_get_utc_datetime($expected_time);
if ($debug) error_log('5.3. $expected_time '.$clock_expired_time);
//Sessions that contain the expired time
$_SESSION['expired_time'][$current_expired_time_key] = $clock_expired_time;
if ($debug) { error_log('5.4. Setting the $_SESSION[expired_time]: '.$_SESSION['expired_time'][$current_expired_time_key] ); };
$expiredTime = array(
$current_expired_time_key => $clock_expired_time
);
Session::write('expired_time', $expiredTime);
if ($debug) { error_log('5.4. Setting the $expiredTime: '.$expiredTime[$current_expired_time_key] ); };
}
$exe_id = $objExercise->save_stat_track_exercise_info($clock_expired_time, $learnpath_id, $learnpath_item_id, $learnpath_item_view_id, $questionListUncompressed, $total_weight);
$exercise_stat_info = $objExercise->getStatTrackExerciseInfo($learnpath_id, $learnpath_item_id, $learnpath_item_view_id);
@ -545,26 +587,28 @@ if ($reminder == 2 && empty($my_remind_list)) {
*/
if ($time_control) {
if ($debug) error_log('7.1. Time control is enabled');
if ($debug) error_log('7.2. $current_expired_time_key '.$current_expired_time_key);
if ($debug) error_log('7.3. $_SESSION[expired_time][$current_expired_time_key] '.$_SESSION['expired_time'][$current_expired_time_key]);
$expiredTimeInSession = Session::read('expired_time');
if (!isset($_SESSION['expired_time'][$current_expired_time_key])) {
if ($debug) error_log('7.1. Time control is enabled.');
if ($debug) error_log('7.2. $current_expired_time_key:'.$current_expired_time_key);
if (!isset($expiredTimeInSession[$current_expired_time_key])) {
if ($debug) error_log('7.3. $expiredTimeInSession[$current_expired_time_key] not set.');
//Timer - Get expired_time for a student
if (!empty($exercise_stat_info)) {
if ($debug) {error_log('7.4 Seems that the session ends and the user want to retake the exam'); };
$expired_time_of_this_attempt = $exercise_stat_info['expired_time_control'];
if ($debug) {error_log('7.5 $expired_time_of_this_attempt: '.$expired_time_of_this_attempt); }
//Get the last attempt of an exercice
// Get the last attempt of an exercise.
$last_attempt_date = getLastAttemptDateOfExercise($exercise_stat_info['exe_id']);
//This means that the user enters the exam but do not answer the first question we get the date from the track_e_exercises not from the track_et_attempt see #2069
/* This means that the user enters the exam but do not answer the first question we get the date
from the track_e_exercises not from the track_et_attempt see #2069 */
if (empty($last_attempt_date)) {
$diff = $current_timestamp - api_strtotime($exercise_stat_info['start_date'], 'UTC');
$last_attempt_date = api_get_utc_datetime(api_strtotime($exercise_stat_info['start_date'],'UTC') + $diff);
} else {
//Recalculate the time control due #2069
$diff = $current_timestamp - api_strtotime($last_attempt_date,'UTC');
$diff = $current_timestamp - api_strtotime($last_attempt_date, 'UTC');
$last_attempt_date = api_get_utc_datetime(api_strtotime($last_attempt_date,'UTC') + $diff);
}
if ($debug) {error_log('7.6. $last_attempt_date: '.$last_attempt_date); }
@ -574,7 +618,7 @@ if ($time_control) {
if ($debug) {error_log('7.7. $new_expired_time_in_seconds: '.$new_expired_time_in_seconds); }
$expected_time = $current_timestamp + $new_expired_time_in_seconds;
if ($debug) {error_log('7.8. $expected_time1 : '.$expected_time); }
if ($debug) {error_log('7.8. $expected_time: '.$expected_time); }
$clock_expired_time = api_get_utc_datetime($expected_time);
if ($debug) {error_log('7.9. $clock_expired_time: '.$clock_expired_time); }
@ -583,12 +627,16 @@ if ($time_control) {
// How the expired time is changed into "track_e_exercices" table,then the last attempt for this student should be changed too,so
ExerciseLib::update_attempt_date($exercise_stat_info['exe_id'], $last_attempt_date);
//Sessions that contain the expired time
$_SESSION['expired_time'][$current_expired_time_key] = $clock_expired_time;
if ($debug) {error_log('7.11. Setting the $_SESSION[expired_time]: '.$_SESSION['expired_time'][$current_expired_time_key] ); };
// Sessions that contain the expired time
$expiredTimeInSession[$current_expired_time_key] = $clock_expired_time;
Session::write('expired_time', $expiredTimeInSession);
if ($debug) {
error_log('7.11. Setting the $expiredTimeInSession: '.$expiredTimeInSession[$current_expired_time_key] );
};
}
} else {
$clock_expired_time = $_SESSION['expired_time'][$current_expired_time_key];
if ($debug) error_log('7.3. $expiredTimeInSession[$current_expired_time_key]: '.$expiredTimeInSession[$current_expired_time_key]);
$clock_expired_time = $expiredTimeInSession[$current_expired_time_key];
}
} else {
if ($debug) { error_log("7. No time control"); };
@ -622,8 +670,8 @@ if ($formSent && isset($_POST)) {
}
// Only for hot spot
if (!isset($choice) & & isset($_REQUES T['hidden_hotspot_id'])) {
$hotspot_id = (int)($_REQUES T['hidden_hotspot_id']);
if (!isset($choice) & & isset($_GE T['hidden_hotspot_id'])) {
$hotspot_id = (int)($_GE T['hidden_hotspot_id']);
$choice = array($hotspot_id => '');
}
@ -664,18 +712,18 @@ if ($formSent && isset($_POST)) {
}
}
}
if ($debug) { error_log('9.3. $choice is an array - end'); }
if ($debug) { error_log('9.4. $exerciseResult '.print_r($exerciseResult,1)); }
if ($debug) { error_log('9.3. $choice is an array - end'); }
if ($debug) { error_log('9.4. $exerciseResult '.print_r($exerciseResult,1)); }
}
// the script "exercise_result.php" will take the variable $exerciseResult from the session
Session::write('exerciseResult',$exerciseResult);
Session::write('exerciseResult', $exerciseResult);
//Session::write('remind_list', $remind_list);
Session::write('exerciseResultCoordinates',$exerciseResultCoordinates);
Session::write('exerciseResultCoordinates', $exerciseResultCoordinates);
// if all questions on one page OR if it is the last question (only for an exercise with one question per page)
if (($objExercise->type == ALL_ON_ONE_PAGE || $current_question >= $question_count)) {
if (api_is_allowed_to_session_edit()) {
// goes to the script that will show the result of the exercise
if ($objExercise->type == ALL_ON_ONE_PAGE) {
@ -698,7 +746,8 @@ if ($formSent && isset($_POST)) {
header("Location: ".$urlMainExercise."exercise_result.php?".api_get_cidreq()."&exe_id=$exe_id&origin=$origin&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id&learnpath_item_view_id=$learnpath_item_view_id");
exit;
} else {
//Time control is only enabled for ONE PER PAGE
// Time control is only enabled for ONE PER PAGE
if (!empty($exe_id) & & is_numeric($exe_id)) {
//Verify if the current test is fraudulent
if (ExerciseLib::exercise_time_control_is_valid($exerciseId, $learnpath_id, $learnpath_item_id)) {
@ -1006,7 +1055,7 @@ if (!empty($error)) {
}
if ($number_of_hotspot_questions > 0) {
$onsubmit = "onsubmit=\"return validateFlashVar('" . $number_of_hotspot_questions . "', '" . get_lang('HotspotValidateError1') . "', '" . get_lang('HotspotValidateError2') . "');\"";
$onsubmit = " onsubmit=\"return validateFlashVar('".$number_of_hotspot_questions."', '" .get_lang('HotspotValidateError1')."', '".get_lang('HotspotValidateError2')."');\"";
}
echo '< script >
@ -1192,8 +1241,7 @@ if (!empty($error)) {
if (isset($exercise_stat_info['questions_to_check']) & & !empty($exercise_stat_info['questions_to_check'])) {
$remind_list = explode(',', $exercise_stat_info['questions_to_check']);
}
echo '< form id = "exercise_form" method = "post" action = "'.api_get_path(WEB_CODE_PATH).'exercice/exercise_submit.php?'.api_get_cidreq().'&autocomplete=off&gradebook='.$gradebook." & exerciseId = ".$exerciseId .'" name = "frm_exercise" ' . $ onsubmit . ' >
echo '< form id = "exercise_form" method = "post" action = "'.api_get_path(WEB_PUBLIC_PATH).'main/exercice/exercise_submit.php?'.api_get_cidreq().'&autocomplete=off&gradebook='.$gradebook." & exerciseId = ".$exerciseId .'" name = "frm_exercise" ' . $ onsubmit . ' >
< input type = "hidden" name = "formSent" value = "1" / >
< input type = "hidden" name = "exerciseId" value = "'.$exerciseId . '" / >
< input type = "hidden" name = "num" value = "'.$current_question.'" id = "num_current_id" / >