/** * Creates any controls a the page should have. * * @param quiz_attempt $attemptobj */ public function summary_page_controls($attemptobj) { $output = ''; // Return to place button. if ($attemptobj->get_state() == quiz_attempt::IN_PROGRESS) { $button = new single_button( new moodle_url($attemptobj->attempt_url(null, $attemptobj->get_currentpage())), get_string('returnattempt', 'quiz')); $output .= $this->container($this->container($this->render($button), 'controls'), 'submitbtns mdl-align'); } // Finish attempt button. $options = array( 'attempt' => $attemptobj->get_attemptid(), 'finishattempt' => 1, 'timeup' => 0, 'slots' => '', 'sesskey' => sesskey(), ); $button = new single_button( new moodle_url($attemptobj->processattempt_url(), $options), get_string('submitallandfinish', 'quiz')); $button->id = 'responseform'; if ($attemptobj->get_state() == quiz_attempt::IN_PROGRESS) { $button->add_action(new confirm_action(get_string('confirmclose', 'quiz'), null, get_string('submitallandfinish', 'quiz'))); } $duedate = $attemptobj->get_due_date(); $message = ''; if ($attemptobj->get_state() == quiz_attempt::OVERDUE) { $message = get_string('overduemustbesubmittedby', 'quiz', userdate($duedate)); } else if ($duedate) { $message = get_string('mustbesubmittedby', 'quiz', userdate($duedate)); } $output .= $this->countdown_timer($attemptobj, time()); $output .= $this->container($message . $this->container( $this->render($button), 'controls'), 'submitbtns mdl-align'); return $output; }
protected function process_submitted_data() { global $DB; $qubaids = optional_param('qubaids', null, PARAM_SEQUENCE); $assumedslotforevents = optional_param('slot', null, PARAM_INT); if (!$qubaids) { return; } $qubaids = clean_param_array(explode(',', $qubaids), PARAM_INT); $attempts = $this->load_attempts_by_usage_ids($qubaids); $events = array(); $transaction = $DB->start_delegated_transaction(); foreach ($qubaids as $qubaid) { $attempt = $attempts[$qubaid]; $attemptobj = new quiz_attempt($attempt, $this->quiz, $this->cm, $this->course); $attemptobj->process_submitted_actions(time()); // Add the event we will trigger later. $params = array('objectid' => $attemptobj->get_question_attempt($assumedslotforevents)->get_question()->id, 'courseid' => $attemptobj->get_courseid(), 'context' => context_module::instance($attemptobj->get_cmid()), 'other' => array('quizid' => $attemptobj->get_quizid(), 'attemptid' => $attemptobj->get_attemptid(), 'slot' => $assumedslotforevents)); $events[] = \mod_quiz\event\question_manually_graded::create($params); } $transaction->allow_commit(); // Trigger events for all the questions we manually marked. foreach ($events as $event) { $event->trigger(); } }
/** * Creates any controls a the page should have. * * @param quiz_attempt $attemptobj */ public function summary_page_controls($attemptobj) { $output = ''; // countdown timer $output .= $this->countdown_timer(); // Finish attempt button. $options = array( 'attempt' => $attemptobj->get_attemptid(), 'finishattempt' => 1, 'timeup' => 0, 'slots' => '', 'sesskey' => sesskey(), ); $button = new single_button( new moodle_url($attemptobj->processattempt_url(), $options), get_string('submitallandfinish', 'quiz')); $button->id = 'responseform'; $button->add_action(new confirm_action(get_string('confirmclose', 'quiz'), null, get_string('submitallandfinish', 'quiz'))); $output .= $this->container($this->container($this->render($button), 'controls'), 'submitbtns mdl-align'); return $output; }
if ($attemptobj->get_userid() != $USER->id) { print_error('notyourattempt', 'quiz', $attemptobj->view_url()); } /// If the attempt is alreadyuj closed, redirect them to the review page. if ($attemptobj->is_finished()) { redirect($attemptobj->review_url()); } /// Check access. $accessmanager = $attemptobj->get_access_manager(time()); $messages = $accessmanager->prevent_access(); if (!$attemptobj->is_preview_user() && $messages) { print_error('attempterror', 'quiz', $attemptobj->view_url(), $accessmanager->print_messages($messages, true)); } $accessmanager->do_password_check($attemptobj->is_preview_user()); /// Log this page view. add_to_log($attemptobj->get_courseid(), 'quiz', 'view summary', 'summary.php?attempt=' . $attemptobj->get_attemptid(), $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Load the questions and states. $attemptobj->load_questions(); $attemptobj->load_question_states(); /// Print the page header require_js('mod/quiz/quiz.js'); $title = get_string('summaryofattempt', 'quiz'); if ($accessmanager->securewindow_required($attemptobj->is_preview_user())) { $accessmanager->setup_secure_page($attemptobj->get_course()->shortname . ': ' . format_string($attemptobj->get_quiz_name()), ''); } else { print_header_simple(format_string($attemptobj->get_quiz_name()), '', $attemptobj->navigation($title), '', '', true, $attemptobj->update_module_button()); } /// Print tabs if they should be there. if ($attemptobj->is_preview_user()) { $currenttab = 'preview'; include 'tabs.php';
$questionid = required_param('question', PARAM_INT); // question id $attemptobj = new quiz_attempt($attemptid); /// Can only grade finished attempts. if (!$attemptobj->is_finished()) { print_error('attemptclosed', 'quiz'); } /// Check login and permissions. require_login($attemptobj->get_courseid(), false, $attemptobj->get_cm()); $attemptobj->require_capability('mod/quiz:grade'); /// Load the questions and states. $questionids = array($questionid); $attemptobj->load_questions($questionids); $attemptobj->load_question_states($questionids); /// Log this action. add_to_log($attemptobj->get_courseid(), 'quiz', 'manualgrade', 'comment.php?attempt=' . $attemptobj->get_attemptid() . '&question=' . $questionid, $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Print the page header print_header(); print_heading(format_string($attemptobj->get_question($questionid)->name)); /// Process any data that was submitted. if ($data = data_submitted() and confirm_sesskey()) { $error = $attemptobj->process_comment($questionid, $data->response['comment'], $data->response['grade']); /// If success, notify and print a close button. if (!is_string($error)) { notify(get_string('changessaved'), 'notifysuccess'); close_window(2, true); } /// Otherwise, display the error and fall throug to re-display the form. notify($error); } /// Print the comment form.
$action = new stdClass(); $action->event = QUESTION_EVENTCLOSE; $action->responses = $state->responses; $action->responses['_flagged'] = $state->flagged; $action->timestamp = $state->timestamp; if (question_process_responses($attemptobj->get_question($id), $state, $action, $attemptobj->get_quiz(), $attempt)) { save_question_session($attemptobj->get_question($id), $state); } else { $success = false; } } if (!$success) { print_error('errorprocessingresponses', 'question', $attemptobj->attempt_url(0, $page)); } /// Log the end of this attempt. add_to_log($attemptobj->get_courseid(), 'quiz', 'close attempt', 'review.php?attempt=' . $attemptobj->get_attemptid(), $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Update the quiz attempt record. $attempt->timemodified = $timenow; $attempt->timefinish = $timenow; $DB->update_record('quiz_attempts', $attempt); if (!$attempt->preview) { /// Record this user's best grade (if this is not a preview). quiz_save_best_grade($attemptobj->get_quiz()); /// Send any notification emails (if this is not a preview). $attemptobj->quiz_send_notification_emails(); } /// Clear the password check flag in the session. $accessmanager = $attemptobj->get_access_manager($timenow); $accessmanager->clear_password_access(); /// Send the user to the review page. redirect($attemptobj->review_url());
if (!$options->responses) { $accessmanager = $attemptobj->get_access_manager(time()); notify($accessmanager->cannot_review_message($attemptobj->get_review_options())); close_window_button(); } } /// Load the questions and states. $questionids = array($questionid); $attemptobj->load_questions($questionids); $attemptobj->load_question_states($questionids); /// If it was asked for, load another state, instead of the latest. if ($stateid) { $attemptobj->load_specific_question_state($questionid, $stateid); } /// Work out the base URL of this page. $baseurl = $CFG->wwwroot . '/mod/quiz/reviewquestion.php?attempt=' . $attemptobj->get_attemptid() . '&question=' . $questionid; /// Log this review. add_to_log($attemptobj->get_courseid(), 'quiz', 'review', 'reviewquestion.php?attempt=' . $attemptobj->get_attemptid() . '&question=' . $questionid . ($stateid ? '&state=' . $stateid : ''), $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Print the page header $headtags = $attemptobj->get_question_html_head_contributions($questionid); print_header('', '', '', '', $headtags); echo '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>'; // for overlib /// Print infobox $rows = array(); /// User picture and name. if ($attemptobj->get_userid() != $USER->id) { // Print user picture and name $student = $DB->get_record('user', array('id' => $attemptobj->get_userid())); $picture = print_user_picture($student, $attemptobj->get_courseid(), $student->picture, false, true); $rows[] = '<tr><th scope="row" class="cell">' . $picture . '</th><td class="cell"><a href="' . $CFG->wwwroot . '/user/view.php?id=' . $student->id . '&course=' . $attemptobj->get_courseid() . '">' . fullname($student, true) . '</a></td></tr>';
} else { $attemptobj->require_capability('mod/quiz:attempt'); } /// If the attempt is already closed, send them to the review page. if ($attemptobj->is_finished()) { redirect($attemptobj->review_url(0, $page)); } /// Check the access rules. $accessmanager = $attemptobj->get_access_manager(time()); $messages = $accessmanager->prevent_access(); if (!$attemptobj->is_preview_user() && $messages) { print_error('attempterror', 'quiz', $quizobj->view_url(), $accessmanager->print_messages($messages, true)); } $accessmanager->do_password_check($attemptobj->is_preview_user()); /// This action used to be 'continue attempt' but the database field has only 15 characters. add_to_log($attemptobj->get_courseid(), 'quiz', 'continue attemp', 'review.php?attempt=' . $attemptobj->get_attemptid(), $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Get the list of questions needed by this page. $questionids = $attemptobj->get_question_ids($page); /// Check. if (empty($questionids)) { quiz_error($quiz, 'noquestionsfound'); } /// Load those questions and the associated states. $attemptobj->load_questions($questionids); $attemptobj->load_question_states($questionids); /// Print the quiz page //////////////////////////////////////////////////////// // Print the page header require_js(array('yui_yahoo', 'yui_event')); require_js('mod/quiz/quiz.js'); $title = get_string('attempt', 'quiz', $attemptobj->get_attempt_number()); $headtags = $attemptobj->get_html_head_contributions($page);