Ejemplo n.º 1
0
 /**
  * Create a question_attempt_step from records loaded from the database.
  *
  * For internal use only.
  *
  * @param Iterator $records Raw records loaded from the database.
  * @param int $questionattemptid The id of the question_attempt to extract.
  * @return question_attempt The newly constructed question_attempt_step.
  */
 public static function load_from_records($records, $questionattemptid, question_usage_observer $observer, $preferredbehaviour)
 {
     $record = $records->current();
     while ($record->questionattemptid != $questionattemptid) {
         $record = $records->next();
         if (!$records->valid()) {
             throw new coding_exception("Question attempt {$questionattemptid} not found in the database.");
         }
         $record = $records->current();
     }
     try {
         $question = question_bank::load_question($record->questionid);
     } catch (Exception $e) {
         // The question must have been deleted somehow. Create a missing
         // question to use in its place.
         $question = question_bank::get_qtype('missingtype')->make_deleted_instance($record->questionid, $record->maxmark + 0);
     }
     $qa = new question_attempt($question, $record->questionusageid, null, $record->maxmark + 0);
     $qa->set_database_id($record->questionattemptid);
     $qa->set_number_in_usage($record->slot);
     $qa->variant = $record->variant + 0;
     $qa->minfraction = $record->minfraction + 0;
     $qa->set_flagged($record->flagged);
     $qa->questionsummary = $record->questionsummary;
     $qa->rightanswer = $record->rightanswer;
     $qa->responsesummary = $record->responsesummary;
     $qa->timemodified = $record->timemodified;
     $qa->behaviour = question_engine::make_behaviour($record->behaviour, $qa, $preferredbehaviour);
     $i = 0;
     while ($record && $record->questionattemptid == $questionattemptid && !is_null($record->attemptstepid)) {
         $qa->steps[$i] = question_attempt_step::load_from_records($records, $record->attemptstepid);
         if ($i == 0) {
             $question->apply_attempt_state($qa->steps[0]);
         }
         $i++;
         if ($records->valid()) {
             $record = $records->current();
         } else {
             $record = false;
         }
     }
     $qa->observer = $observer;
     return $qa;
 }
 /**
  * Add another question to this usage.
  *
  * The added question is not started until you call {@link start_question()}
  * on it.
  *
  * @param question_definition $question the question to add.
  * @param number $maxmark the maximum this question will be marked out of in
  *      this attempt (optional). If not given, $question->defaultmark is used.
  * @return int the number used to identify this question within this usage.
  */
 public function add_question(question_definition $question, $maxmark = null)
 {
     $qa = new question_attempt($question, $this->get_id(), $this->observer, $maxmark);
     if (count($this->questionattempts) == 0) {
         $this->questionattempts[1] = $qa;
     } else {
         $this->questionattempts[] = $qa;
     }
     $qa->set_number_in_usage(end(array_keys($this->questionattempts)));
     $this->observer->notify_attempt_added($qa);
     return $qa->get_slot();
 }