/** * 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(); }