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));
 }