public function set_data($question) { question_bank::get_qtype($question->qtype)->set_default_options($question); // Prepare question text. $draftid = file_get_submitted_draft_itemid('questiontext'); if (!empty($question->questiontext)) { $questiontext = $question->questiontext; } else { $questiontext = $this->_form->getElement('questiontext')->getValue(); $questiontext = $questiontext['text']; } $questiontext = file_prepare_draft_area($draftid, $this->context->id, 'question', 'questiontext', empty($question->id) ? null : (int) $question->id, $this->fileoptions, $questiontext); $question->questiontext = array(); $question->questiontext['text'] = $questiontext; $question->questiontext['format'] = empty($question->questiontextformat) ? editors_get_preferred_format() : $question->questiontextformat; $question->questiontext['itemid'] = $draftid; // Prepare general feedback. $draftid = file_get_submitted_draft_itemid('generalfeedback'); if (empty($question->generalfeedback)) { $generalfeedback = $this->_form->getElement('generalfeedback')->getValue(); $question->generalfeedback = $generalfeedback['text']; } $feedback = file_prepare_draft_area($draftid, $this->context->id, 'question', 'generalfeedback', empty($question->id) ? null : (int) $question->id, $this->fileoptions, $question->generalfeedback); $question->generalfeedback = array(); $question->generalfeedback['text'] = $feedback; $question->generalfeedback['format'] = empty($question->generalfeedbackformat) ? editors_get_preferred_format() : $question->generalfeedbackformat; $question->generalfeedback['itemid'] = $draftid; // Remove unnecessary trailing 0s form grade fields. if (isset($question->defaultgrade)) { $question->defaultgrade = 0 + $question->defaultgrade; } if (isset($question->penalty)) { $question->penalty = 0 + $question->penalty; } // Set any options. $extraquestionfields = question_bank::get_qtype($question->qtype)->extra_question_fields(); if (is_array($extraquestionfields) && !empty($question->options)) { array_shift($extraquestionfields); foreach ($extraquestionfields as $field) { if (property_exists($question->options, $field)) { $question->{$field} = $question->options->{$field}; } } } // Subclass adds data_preprocessing code here. $question = $this->data_preprocessing($question); parent::set_data($question); }
public function set_data($question) { $formdata = array(); $fromform = new stdClass(); if (isset($question->options)) { $answers = $question->options->answers; if (count($answers)) { if (optional_param('updateanswers', false, PARAM_BOOL) || optional_param('updatedatasets', false, PARAM_BOOL)) { foreach ($answers as $key => $answer) { $fromform->tolerance[$key] = $this->_form->getElementValue('tolerance[' . $key . ']'); $answer->tolerance = $fromform->tolerance[$key]; $fromform->tolerancetype[$key] = $this->_form->getElementValue('tolerancetype[' . $key . ']'); if (is_array($fromform->tolerancetype[$key])) { $fromform->tolerancetype[$key] = $fromform->tolerancetype[$key][0]; } $answer->tolerancetype = $fromform->tolerancetype[$key]; $fromform->correctanswerlength[$key] = $this->_form->getElementValue('correctanswerlength[' . $key . ']'); if (is_array($fromform->correctanswerlength[$key])) { $fromform->correctanswerlength[$key] = $fromform->correctanswerlength[$key][0]; } $answer->correctanswerlength = $fromform->correctanswerlength[$key]; $fromform->correctanswerformat[$key] = $this->_form->getElementValue('correctanswerformat[' . $key . ']'); if (is_array($fromform->correctanswerformat[$key])) { $fromform->correctanswerformat[$key] = $fromform->correctanswerformat[$key][0]; } $answer->correctanswerformat = $fromform->correctanswerformat[$key]; } $this->qtypeobj->save_question_calculated($question, $fromform); } else { foreach ($answers as $key => $answer) { $formdata['tolerance[' . $key . ']'] = $answer->tolerance; $formdata['tolerancetype[' . $key . ']'] = $answer->tolerancetype; $formdata['correctanswerlength[' . $key . ']'] = $answer->correctanswerlength; $formdata['correctanswerformat[' . $key . ']'] = $answer->correctanswerformat; } } } } // Fill out all data sets and also the fields for the next item to add. $j = $this->noofitems * count($this->datasetdefs); for ($itemnumber = $this->noofitems; $itemnumber >= 1; $itemnumber--) { $data = array(); foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j--; } $comment = $this->qtypeobj->comment_on_datasetitems($this->qtypeobj, $question->id, $question->questiontext, $answers, $data, $itemnumber); if ($comment->outsidelimit) { $this->outsidelimit = $comment->outsidelimit; } $totalcomment = ''; foreach ($question->options->answers as $key => $answer) { $totalcomment .= $comment->stranswers[$key] . '<br/>'; } $formdata['answercomment[' . $itemnumber . ']'] = $totalcomment; } $formdata['nextpageparam[forceregeneration]'] = $this->regenerate; $formdata['selectdelete'] = '1'; $formdata['selectadd'] = '1'; $j = $this->noofitems * count($this->datasetdefs) + 1; $data = array(); // Data for comment_on_datasetitems later. // Dataset generation defaults. if ($this->qtypeobj->supports_dataset_item_generation()) { $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { if (!optional_param('updatedatasets', false, PARAM_BOOL) && !optional_param('updateanswers', false, PARAM_BOOL)) { $formdata["number[{$j}]"] = $this->qtypeobj->generate_dataset_item($datasetdef->options); } else { $formdata["number[{$j}]"] = $this->_form->getElementValue("number[{$j}]"); } $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = isset($datasetdef->items[$itemnumber]) ? $datasetdef->items[$itemnumber]->id : 0; $data[$datasetdef->name] = $formdata["number[{$j}]"]; $j++; } } // Existing records override generated data depending on radio element. $j = $this->noofitems * count($this->datasetdefs) + 1; if (!$this->regenerate && !optional_param('updatedatasets', false, PARAM_BOOL) && !optional_param('updateanswers', false, PARAM_BOOL)) { $idx = 1; $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j++; } } $comment = $this->qtypeobj->comment_on_datasetitems($this->qtypeobj, $question->id, $question->questiontext, $answers, $data, $this->noofitems + 1); if (isset($comment->outsidelimit) && $comment->outsidelimit) { $this->outsidelimit = $comment->outsidelimit; } $key1 = 1; foreach ($question->options->answers as $key => $answer) { $formdata['answercomment[' . ($this->noofitems + $key1) . ']'] = $comment->stranswers[$key]; $key1++; } if ($this->outsidelimit) { $formdata['outsidelimit'] = '<span class="error">' . get_string('oneanswertrueansweroutsidelimits', 'qtype_calculated') . '</span>'; } $formdata = $this->qtypeobj->custom_generator_set_data($this->datasetdefs, $formdata); parent::set_data((object) ($formdata + (array) $question)); }