2009-11-04 11:58:30 +00:00
|
|
|
<?php
|
2008-07-08 16:33:47 +00:00
|
|
|
/**
|
|
|
|
* This page deals with starting a new attempt at a quiz.
|
|
|
|
*
|
|
|
|
* Normally, it will end up redirecting to attempt.php - unless a password form is displayed.
|
|
|
|
*
|
2008-07-15 16:31:22 +00:00
|
|
|
* This code used to be at the top of attempt.php, if you are looking for CVS history.
|
|
|
|
*
|
2008-07-08 16:33:47 +00:00
|
|
|
* @author Tim Hunt.
|
|
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
|
|
|
|
* @package quiz
|
|
|
|
*/
|
|
|
|
|
|
|
|
require_once(dirname(__FILE__) . '/../../config.php');
|
|
|
|
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
|
|
|
|
|
|
|
|
/// Get submitted parameters.
|
|
|
|
$id = required_param('cmid', PARAM_INT); // Course Module ID
|
|
|
|
$forcenew = optional_param('forcenew', false, PARAM_BOOL); // Used to force a new preview
|
|
|
|
|
|
|
|
if (!$cm = get_coursemodule_from_id('quiz', $id)) {
|
|
|
|
print_error('invalidcoursemodule');
|
|
|
|
}
|
|
|
|
if (!$course = $DB->get_record('course', array('id' => $cm->course))) {
|
|
|
|
print_error("coursemisconf");
|
|
|
|
}
|
|
|
|
if (!$quiz = $DB->get_record('quiz', array('id' => $cm->instance))) {
|
|
|
|
print_error('invalidcoursemodule');
|
|
|
|
}
|
|
|
|
|
|
|
|
$quizobj = new quiz($quiz, $cm, $course);
|
|
|
|
|
2008-07-09 17:00:26 +00:00
|
|
|
/// Check login and sesskey.
|
2008-07-08 16:33:47 +00:00
|
|
|
require_login($quizobj->get_courseid(), false, $quizobj->get_cm());
|
2008-07-09 17:00:26 +00:00
|
|
|
if (!confirm_sesskey()) {
|
|
|
|
throw new moodle_exception('confirmsesskeybad', 'error', $quizobj->view_url());
|
|
|
|
}
|
2008-07-08 16:33:47 +00:00
|
|
|
|
|
|
|
/// if no questions have been set up yet redirect to edit.php
|
|
|
|
if (!$quizobj->get_question_ids() && $quizobj->has_capability('mod/quiz:manage')) {
|
|
|
|
redirect($quizobj->edit_url());
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Create an object to manage all the other (non-roles) access rules.
|
|
|
|
$accessmanager = $quizobj->get_access_manager(time());
|
|
|
|
if ($quizobj->is_preview_user() && $forcenew) {
|
|
|
|
$accessmanager->clear_password_access();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Check capabilites.
|
|
|
|
if (!$quizobj->is_preview_user()) {
|
|
|
|
$quizobj->require_capability('mod/quiz:attempt');
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Check to see if a new preview was requested.
|
|
|
|
if ($quizobj->is_preview_user() && $forcenew) {
|
|
|
|
/// To force the creation of a new preview, we set a finish time on the
|
|
|
|
/// current attempt (if any). It will then automatically be deleted below
|
|
|
|
$DB->set_field('quiz_attempts', 'timefinish', time(), array('quiz' => $quiz->id, 'userid' => $USER->id));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Look for an existing attempt.
|
|
|
|
$lastattempt = quiz_get_latest_attempt_by_user($quiz->id, $USER->id);
|
|
|
|
|
|
|
|
if ($lastattempt && !$lastattempt->timefinish) {
|
|
|
|
/// Continuation of an attempt - check password then redirect.
|
|
|
|
$accessmanager->do_password_check($quizobj->is_preview_user());
|
|
|
|
redirect($quizobj->attempt_url($lastattempt->id));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get number for the next or unfinished attempt
|
|
|
|
if ($lastattempt && !$lastattempt->preview && !$quizobj->is_preview_user()) {
|
|
|
|
$lastattemptid = $lastattempt->id;
|
|
|
|
$attemptnumber = $lastattempt->attempt + 1;
|
|
|
|
} else {
|
|
|
|
$lastattempt = false;
|
|
|
|
$lastattemptid = false;
|
|
|
|
$attemptnumber = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Check access.
|
|
|
|
$messages = $accessmanager->prevent_access() +
|
|
|
|
$accessmanager->prevent_new_attempt($attemptnumber - 1, $lastattempt);
|
|
|
|
if (!$quizobj->is_preview_user() && $messages) {
|
|
|
|
print_error('attempterror', 'quiz', $quizobj->view_url(),
|
|
|
|
$accessmanager->print_messages($messages, true));
|
|
|
|
}
|
|
|
|
$accessmanager->do_password_check($quizobj->is_preview_user());
|
|
|
|
|
|
|
|
/// Delete any previous preview attempts belonging to this user.
|
2009-02-27 08:45:05 +00:00
|
|
|
quiz_delete_previews($quiz, $USER->id);
|
2008-07-08 16:33:47 +00:00
|
|
|
|
|
|
|
/// Create the new attempt and initialize the question sessions
|
|
|
|
$attempt = quiz_create_attempt($quiz, $attemptnumber, $lastattempt, time(), $quizobj->is_preview_user());
|
|
|
|
|
|
|
|
/// Save the attempt in the database.
|
2009-06-13 18:16:08 +00:00
|
|
|
$attempt->id = $DB->insert_record('quiz_attempts', $attempt);
|
2008-07-08 16:33:47 +00:00
|
|
|
|
|
|
|
/// Log the new attempt.
|
|
|
|
if ($attempt->preview) {
|
2008-07-09 17:00:26 +00:00
|
|
|
add_to_log($course->id, 'quiz', 'preview', 'view.php?id=' . $quizobj->get_cmid(),
|
|
|
|
$quizobj->get_quizid(), $quizobj->get_cmid());
|
2008-07-08 16:33:47 +00:00
|
|
|
} else {
|
2008-07-09 17:00:26 +00:00
|
|
|
add_to_log($course->id, 'quiz', 'attempt', 'review.php?attempt=' . $attempt->id,
|
|
|
|
$quizobj->get_quizid(), $quizobj->get_cmid());
|
2008-07-08 16:33:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Fully load all the questions in this quiz.
|
|
|
|
$quizobj->preload_questions();
|
|
|
|
$quizobj->load_questions();
|
|
|
|
|
|
|
|
/// Create initial states for all questions in this quiz.
|
|
|
|
if (!$states = get_question_states($quizobj->get_questions(), $quizobj->get_quiz(), $attempt, $lastattemptid)) {
|
|
|
|
print_error('cannotrestore', 'quiz');
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Save all the newly created states.
|
|
|
|
foreach ($quizobj->get_questions() as $i => $question) {
|
|
|
|
save_question_session($question, $states[$i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Redirect to the attempt page.
|
|
|
|
redirect($quizobj->attempt_url($attempt->id));
|