/**
  * 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++;
         }
     }
 }
Ejemplo n.º 2
0
             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();