/** * Create and update question data from the forms. */ public function form_update($formdata, $questionnaire) { global $DB; $this->form_preprocess_data($formdata); if (!empty($formdata->qid)) { // Update existing question. // Handle any attachments in the content. $formdata->itemid = $formdata->content['itemid']; $formdata->format = $formdata->content['format']; $formdata->content = $formdata->content['text']; $formdata->content = file_save_draft_area_files($formdata->itemid, $questionnaire->context->id, 'mod_questionnaire', 'question', $formdata->qid, array('subdirs' => true), $formdata->content); $fields = array('name', 'type_id', 'length', 'precise', 'required', 'content', 'dependquestion', 'dependchoice'); $questionrecord = new \stdClass(); $questionrecord->id = $formdata->qid; foreach ($fields as $f) { if (isset($formdata->{$f})) { $questionrecord->{$f} = trim($formdata->{$f}); } } $result = $this->update($questionrecord, false); if (questionnaire_has_dependencies($questionnaire->questions)) { questionnaire_check_page_breaks($questionnaire); } } else { // Create new question: // Need to update any image content after the question is created, so create then update the content. $formdata->survey_id = $formdata->sid; $fields = array('survey_id', 'name', 'type_id', 'length', 'precise', 'required', 'position', 'dependquestion', 'dependchoice'); $questionrecord = new \stdClass(); foreach ($fields as $f) { if (isset($formdata->{$f})) { $questionrecord->{$f} = trim($formdata->{$f}); } } $questionrecord->content = ''; $this->add($questionrecord); // Handle any attachments in the content. $formdata->itemid = $formdata->content['itemid']; $formdata->format = $formdata->content['format']; $formdata->content = $formdata->content['text']; $content = file_save_draft_area_files($formdata->itemid, $questionnaire->context->id, 'mod_questionnaire', 'question', $this->qid, array('subdirs' => true), $formdata->content); $result = $DB->set_field('questionnaire_question', 'content', $content, array('id' => $this->qid)); } if ($this->has_choices()) { // Now handle any choice updates. $cidx = 0; if (isset($this->choices) && !isset($formdata->makecopy)) { $oldcount = count($this->choices); $echoice = reset($this->choices); $ekey = key($this->choices); } else { $oldcount = 0; } $newchoices = explode("\n", $formdata->allchoices); $nidx = 0; $newcount = count($newchoices); while ($nidx < $newcount && $cidx < $oldcount) { if ($newchoices[$nidx] != $echoice->content) { $choicerecord = new \stdClass(); $choicerecord->id = $ekey; $choicerecord->question_id = $this->qid; $choicerecord->content = trim($newchoices[$nidx]); $r = preg_match_all("/^(\\d{1,2})(=.*)\$/", $newchoices[$nidx], $matches); // This choice has been attributed a "score value" OR this is a rate question type. if ($r) { $newscore = $matches[1][0]; $choicerecord->value = $newscore; } else { // No score value for this choice. $choicerecord->value = null; } $this->update_choice($choicerecord); } $nidx++; $echoice = next($this->choices); $ekey = key($this->choices); $cidx++; } while ($nidx < $newcount) { // New choices... $choicerecord = new \stdClass(); $choicerecord->question_id = $this->qid; $choicerecord->content = trim($newchoices[$nidx]); $r = preg_match_all("/^(\\d{1,2})(=.*)\$/", $choicerecord->content, $matches); // This choice has been attributed a "score value" OR this is a rate question type. if ($r) { $choicerecord->value = $matches[1][0]; } $this->add_choice($choicerecord); $nidx++; } while ($cidx < $oldcount) { end($this->choices); $ekey = key($this->choices); $this->delete_choice($ekey); $cidx++; } } }
while ($cidx < $oldcount) { $result = $DB->delete_records('questionnaire_quest_choice', array('id' => $ekey)); $echoice = next($question->choices); $ekey = key($question->choices); $cidx++; } } // Make these field values 'sticky' for further new questions. if (!isset($qformdata->required)) { $qformdata->required = 'n'; } // Need to reload questions. $questions = $DB->get_records('questionnaire_question', array('survey_id' => $sid, 'deleted' => 'n'), 'id'); $questionnairehasdependencies = questionnaire_has_dependencies($questions); if (questionnaire_has_dependencies($questions)) { questionnaire_check_page_breaks($questionnaire); } $SESSION->questionnaire->required = $qformdata->required; $SESSION->questionnaire->type_id = $qformdata->type_id; // Switch to main screen. $action = 'main'; $reload = true; } } // Log question created event. if (isset($qformdata)) { $context = context_module::instance($questionnaire->cm->id); $questiontype = $qtypenames[$qformdata->type_id]; $params = array('context' => $context, 'courseid' => $questionnaire->course->id, 'other' => array('questiontype' => $questiontype)); $event = \mod_questionnaire\event\question_created::create($params); $event->trigger();