/** * Construct the class. if a dbattempt object is passed in set it, otherwise initialize empty class * * @param questionmanager $questionmanager * @param \stdClass * @param \context_module $context */ public function __construct($questionmanager, $dbattempt = null, $context = null) { $this->questionmanager = $questionmanager; $this->context = $context; // if empty create new attempt if (empty($dbattempt)) { $this->attempt = new \stdClass(); // create a new quba since we're creating a new attempt $this->quba = \question_engine::make_questions_usage_by_activity('mod_activequiz', $this->questionmanager->getRTQ()->getContext()); $this->quba->set_preferred_behaviour('immediatefeedback'); $attemptlayout = $this->questionmanager->add_questions_to_quba($this->quba); // add the attempt layout to this instance $this->attempt->qubalayout = implode(',', $attemptlayout); } else { // else load it up in this class instance $this->attempt = $dbattempt; $this->quba = \question_engine::load_questions_usage_by_activity($this->attempt->questionengid); } }
protected function start_attempt_at_question($question, $preferredbehaviour, $maxmark = null, $variant = 1) { $this->quba->set_preferred_behaviour($preferredbehaviour); $this->slot = $this->quba->add_question($question, $maxmark); $this->quba->start_question($this->slot, $variant); }
/** * Create a question_usage_by_activity 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_usage_by_activity The newly constructed usage. */ public static function load_from_records($records, $qubaid) { $record = $records->current(); while ($record->qubaid != $qubaid) { $records->next(); if (!$records->valid()) { throw new coding_exception("Question usage $qubaid not found in the database."); } $record = $records->current(); } $quba = new question_usage_by_activity($record->component, context::instance_by_id($record->contextid, IGNORE_MISSING)); $quba->set_id_from_database($record->qubaid); $quba->set_preferred_behaviour($record->preferredbehaviour); $quba->observer = new question_engine_unit_of_work($quba); // If slot is null then the current pointer in $records will not be // advanced in the while loop below, and we get stuck in an infinite loop, // since this method is supposed to always consume at least one record. // Therefore, in this case, advance the record here. if (is_null($record->slot)) { $records->next(); } while ($record && $record->qubaid == $qubaid && !is_null($record->slot)) { $quba->questionattempts[$record->slot] = question_attempt::load_from_records($records, $record->questionattemptid, $quba->observer, $quba->get_preferred_behaviour()); if ($records->valid()) { $record = $records->current(); } else { $record = false; } } return $quba; }
/** * Create a question_usage_by_activity 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_usage_by_activity The newly constructed usage. */ public static function load_from_records($records, $qubaid) { $record = $records->current(); while ($record->qubaid != $qubaid) { $records->next(); if (!$records->valid()) { throw new coding_exception("Question usage $qubaid not found in the database."); } $record = $records->current(); } $quba = new question_usage_by_activity($record->component, get_context_instance_by_id($record->contextid)); $quba->set_id_from_database($record->qubaid); $quba->set_preferred_behaviour($record->preferredbehaviour); $quba->observer = new question_engine_unit_of_work($quba); while ($record && $record->qubaid == $qubaid && !is_null($record->slot)) { $quba->questionattempts[$record->slot] = question_attempt::load_from_records($records, $record->questionattemptid, $quba->observer, $quba->get_preferred_behaviour()); if ($records->valid()) { $record = $records->current(); } else { $record = false; } } return $quba; }