[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/mod/quiz/ -> processattempt.php (source)

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * This page deals with processing responses during an attempt at a quiz.
  19   *
  20   * People will normally arrive here from a form submission on attempt.php or
  21   * summary.php, and once the responses are processed, they will be redirected to
  22   * attempt.php or summary.php.
  23   *
  24   * This code used to be near the top of attempt.php, if you are looking for CVS history.
  25   *
  26   * @package   mod_quiz
  27   * @copyright 2009 Tim Hunt
  28   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  29   */
  30  
  31  require_once(dirname(__FILE__) . '/../../config.php');
  32  require_once($CFG->dirroot . '/mod/quiz/locallib.php');
  33  
  34  // Remember the current time as the time any responses were submitted
  35  // (so as to make sure students don't get penalized for slow processing on this page).
  36  $timenow = time();
  37  
  38  // Get submitted parameters.
  39  $attemptid     = required_param('attempt',  PARAM_INT);
  40  $thispage      = optional_param('thispage', 0, PARAM_INT);
  41  $nextpage      = optional_param('nextpage', 0, PARAM_INT);
  42  $next          = optional_param('next',          false, PARAM_BOOL);
  43  $finishattempt = optional_param('finishattempt', false, PARAM_BOOL);
  44  $timeup        = optional_param('timeup',        0,      PARAM_BOOL); // True if form was submitted by timer.
  45  $scrollpos     = optional_param('scrollpos',     '',     PARAM_RAW);
  46  
  47  $transaction = $DB->start_delegated_transaction();
  48  $attemptobj = quiz_attempt::create($attemptid);
  49  
  50  // Set $nexturl now.
  51  if ($next) {
  52      $page = $nextpage;
  53  } else {
  54      $page = $thispage;
  55  }
  56  if ($page == -1) {
  57      $nexturl = $attemptobj->summary_url();
  58  } else {
  59      $nexturl = $attemptobj->attempt_url(null, $page);
  60      if ($scrollpos !== '') {
  61          $nexturl->param('scrollpos', $scrollpos);
  62      }
  63  }
  64  
  65  // If there is only a very small amount of time left, there is no point trying
  66  // to show the student another page of the quiz. Just finish now.
  67  $graceperiodmin = null;
  68  $accessmanager = $attemptobj->get_access_manager($timenow);
  69  $timeclose = $accessmanager->get_end_time($attemptobj->get_attempt());
  70  
  71  // Don't enforce timeclose for previews
  72  if ($attemptobj->is_preview()) {
  73      $timeclose = false;
  74  }
  75  $toolate = false;
  76  if ($timeclose !== false && $timenow > $timeclose - QUIZ_MIN_TIME_TO_CONTINUE) {
  77      $timeup = true;
  78      $graceperiodmin = get_config('quiz', 'graceperiodmin');
  79      if ($timenow > $timeclose + $graceperiodmin) {
  80          $toolate = true;
  81      }
  82  }
  83  
  84  // Check login.
  85  require_login($attemptobj->get_course(), false, $attemptobj->get_cm());
  86  require_sesskey();
  87  
  88  // Check that this attempt belongs to this user.
  89  if ($attemptobj->get_userid() != $USER->id) {
  90      throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'notyourattempt');
  91  }
  92  
  93  // Check capabilities.
  94  if (!$attemptobj->is_preview_user()) {
  95      $attemptobj->require_capability('mod/quiz:attempt');
  96  }
  97  
  98  // If the attempt is already closed, send them to the review page.
  99  if ($attemptobj->is_finished()) {
 100      throw new moodle_quiz_exception($attemptobj->get_quizobj(),
 101              'attemptalreadyclosed', null, $attemptobj->review_url());
 102  }
 103  
 104  // If time is running out, trigger the appropriate action.
 105  $becomingoverdue = false;
 106  $becomingabandoned = false;
 107  if ($timeup) {
 108      if ($attemptobj->get_quiz()->overduehandling == 'graceperiod') {
 109          if (is_null($graceperiodmin)) {
 110              $graceperiodmin = get_config('quiz', 'graceperiodmin');
 111          }
 112          if ($timenow > $timeclose + $attemptobj->get_quiz()->graceperiod + $graceperiodmin) {
 113              // Grace period has run out.
 114              $finishattempt = true;
 115              $becomingabandoned = true;
 116          } else {
 117              $becomingoverdue = true;
 118          }
 119      } else {
 120          $finishattempt = true;
 121      }
 122  }
 123  
 124  // Don't log - we will end with a redirect to a page that is logged.
 125  
 126  if (!$finishattempt) {
 127      // Just process the responses for this page and go to the next page.
 128      if (!$toolate) {
 129          try {
 130              $attemptobj->process_submitted_actions($timenow, $becomingoverdue);
 131  
 132          } catch (question_out_of_sequence_exception $e) {
 133              print_error('submissionoutofsequencefriendlymessage', 'question',
 134                      $attemptobj->attempt_url(null, $thispage));
 135  
 136          } catch (Exception $e) {
 137              // This sucks, if we display our own custom error message, there is no way
 138              // to display the original stack trace.
 139              $debuginfo = '';
 140              if (!empty($e->debuginfo)) {
 141                  $debuginfo = $e->debuginfo;
 142              }
 143              print_error('errorprocessingresponses', 'question',
 144                      $attemptobj->attempt_url(null, $thispage), $e->getMessage(), $debuginfo);
 145          }
 146  
 147      } else {
 148          // The student is too late.
 149          $attemptobj->process_going_overdue($timenow, true);
 150      }
 151  
 152      $transaction->allow_commit();
 153      if ($becomingoverdue) {
 154          redirect($attemptobj->summary_url());
 155      } else {
 156          redirect($nexturl);
 157      }
 158  }
 159  
 160  // Update the quiz attempt record.
 161  try {
 162      if ($becomingabandoned) {
 163          $attemptobj->process_abandon($timenow, true);
 164      } else {
 165          $attemptobj->process_finish($timenow, !$toolate);
 166      }
 167  
 168  } catch (question_out_of_sequence_exception $e) {
 169      print_error('submissionoutofsequencefriendlymessage', 'question',
 170              $attemptobj->attempt_url(null, $thispage));
 171  
 172  } catch (Exception $e) {
 173      // This sucks, if we display our own custom error message, there is no way
 174      // to display the original stack trace.
 175      $debuginfo = '';
 176      if (!empty($e->debuginfo)) {
 177          $debuginfo = $e->debuginfo;
 178      }
 179      print_error('errorprocessingresponses', 'question',
 180              $attemptobj->attempt_url(null, $thispage), $e->getMessage(), $debuginfo);
 181  }
 182  
 183  // Send the user to the review page.
 184  $transaction->allow_commit();
 185  redirect($attemptobj->review_url());


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1