Permalink
Browse files

Mergging from head MDL-12255 Adding questiontext decoding and subques…

…tions validation
  • Loading branch information...
1 parent 9a5d3d9 commit 74a20403328c6255b9a4d90ffad1d3b851c931fc pichetp committed Feb 19, 2008
Showing with 165 additions and 12 deletions.
  1. +165 −12 question/type/multianswer/edit_multianswer_form.php
@@ -13,16 +13,73 @@
*/
class question_edit_multianswer_form extends question_edit_form {
- // No question-type specific form fields.
- function definition(){
- parent::definition();
- $mform =& $this->_form;
+ // $questiondisplay will contain the qtype_multianswer_extract_question from the questiontext
+ var $questiondisplay ;
+
+ function definition_inner(&$mform) {
+ global $QTYPE_MENU;
$mform->addRule('questiontext', null, 'required', null, 'client');
// Remove meaningless defaultgrade field.
$mform->removeElement('defaultgrade');
+
+ // display the questions from questiontext;
+ if ( "" != optional_param('questiontext','', PARAM_RAW)) {
+
+ $this->questiondisplay = fullclone(qtype_multianswer_extract_question(optional_param('questiontext','', PARAM_RAW))) ;
+
+ }else {
+ $this->questiondisplay = "";
+ }
+
+ if ( isset($this->questiondisplay->options->questions) && count($this->questiondisplay->options->questions) > 0 ) {
+ $countsubquestions = count($this->questiondisplay->options->questions);
+ } else {
+ $countsubquestions =0;
+ }
+
+ $mform->addElement('submit', 'analyzequestion', get_string('decodeverifyquestiontext','qtype_multianswer'));
+ $mform->registerNoSubmitButton('analyzequestion');
+
+ for ($sub =1;$sub <=$countsubquestions ;$sub++) {
+ $this->editas[$sub] = 'unknown type';
+ if (isset( $this->questiondisplay->options->questions[$sub]->qtype) ) {
+ $this->editas[$sub] = $this->questiondisplay->options->questions[$sub]->qtype ;
+ } else if (optional_param('sub_'.$sub."_".'qtype', '', PARAM_RAW) != '') {
+ $this->editas[$sub] = optional_param('sub_'.$sub."_".'qtype', '', PARAM_RAW);
+ }
+ $mform->addElement('header', 'subhdr', get_string('questionno', 'quiz',
+ '{#'.$sub.'}').'&nbsp;'.$QTYPE_MENU[$this->questiondisplay->options->questions[$sub]->qtype]);
+
+ $mform->addElement('static', 'sub_'.$sub."_".'questiontext', "subquestiontext",array('cols'=>60, 'rows'=>3));
+
+ if (isset ( $this->questiondisplay->options->questions[$sub]->questiontext)) {
+ $mform->setDefault('sub_'.$sub."_".'questiontext', $this->questiondisplay->options->questions[$sub]->questiontext);
+ }
+
+ $mform->addElement('static', 'sub_'.$sub."_".'defaultgrade', get_string('defaultgrade', 'quiz'));
+ $mform->setDefault('sub_'.$sub."_".'defaultgrade',$this->questiondisplay->options->questions[$sub]->defaultgrade);
+
+ foreach ($this->questiondisplay->options->questions[$sub]->answer as $key =>$ans) {
+
+ $mform->addElement('static', 'sub_'.$sub."_".'answer['.$key.']', get_string('answer', 'quiz'), array('cols'=>60, 'rows'=>1));
+
+ if ($this->questiondisplay->options->questions[$sub]->qtype =='numerical' && $key == 0 ) {
+ $mform->addElement('static', 'sub_'.$sub."_".'tolerance['.$key.']', get_string('acceptederror', 'quiz')) ;//, $gradeoptions);
+ }
+
+ $mform->addElement('static', 'sub_'.$sub."_".'fraction['.$key.']', get_string('grade')) ;//, $gradeoptions);
+
+ $mform->addElement('static', 'sub_'.$sub."_".'feedback['.$key.']', get_string('feedback', 'quiz'));
+ }
+
+ }
+
}
+
+
function set_data($question) {
+ $default_values =array();
if (isset($question->id) and $question->id and $question->qtype and $question->questiontext) {
foreach ($question->options->questions as $key => $wrapped) {
@@ -69,18 +126,114 @@ function set_data($question) {
$question->questiontext = str_replace("{#$key}", $parsableanswerdef, $question->questiontext);
}
}
+
+ // set default to $questiondisplay questions elements
+ if (isset($this->questiondisplay->options->questions)) {
+ $subquestions = fullclone($this->questiondisplay->options->questions) ;
+ if (count($subquestions)) {
+ $sub =1;
+ foreach ($subquestions as $subquestion) {
+ $prefix = 'sub_'.$sub.'_' ;
+
+ // validate parameters
+ $answercount = 0;
+ $maxgrade = false;
+ $maxfraction = -1;
+
+ foreach ($subquestion->answer as $key=>$answer) {
+ if ( $subquestion->qtype == 'numerical' && $key == 0 ) {
+ $default_values[$prefix.'tolerance['.$key.']'] = $subquestion->tolerance[0] ;
+ }
+ $trimmedanswer = trim($answer);
+ if ($trimmedanswer !== '') {
+ $answercount++;
+ if ($subquestion->qtype == 'numerical' && !(is_numeric($trimmedanswer) || $trimmedanswer == '*')) {
+ $this->_form->setElementError($prefix.'answer['.$key.']' , get_string('answermustbenumberorstar', 'qtype_numerical'));
+ }
+ if ($subquestion->fraction[$key] == 1) {
+ $maxgrade = true;
+ }
+ if ($subquestion->fraction[$key] > $maxfraction) {
+ $maxfraction = $subquestion->fraction[$key] ;
+ }
+ }
+
+ $default_values[$prefix.'answer['.$key.']'] = $answer;
+ }
+ if ($answercount == 0) {
+ if ($subquestion->qtype == 'multichoice' ) {
+ $this->_form->setElementError($prefix.'answer[0]' , get_string('notenoughanswers', 'qtype_multichoice', 2));
+ } else {
+ $this->_form->setElementError($prefix.'answer[0]' , get_string('notenoughanswers', 'quiz', 1));
+ }
+ }
+ if ($maxgrade == false) {
+ $this->_form->setElementError($prefix.'fraction[0]' ,get_string('fractionsnomax', 'question'));
+ }
+ foreach ($subquestion->feedback as $key=>$answer) {
+
+ $default_values[$prefix.'feedback['.$key.']'] = $answer;
+ }
+ foreach ( $subquestion->fraction as $key=>$answer) {
+ $default_values[$prefix.'fraction['.$key.']'] = $answer;
+ }
+
+
+ $sub++;
+ }
+ }
+ }
+ if( $default_values != "") {
+ $question = (object)((array)$question + $default_values);
+ }
parent::set_data($question);
}
- function validation($data){
- //TODO would be nice to parse the question text here and output some error
- //messages if there is a problem with the text.
- $errors = array();
- //extra check to make sure there is something in the htmlarea besides a <br />
- $questiontext= trim(strip_tags($data['questiontext']));
- if ($questiontext==''){
- $errors['questiontext'] = get_string('err_required', 'form');
+ function validation($data, $files) {
+ $errors = parent::validation($data, $files);
+
+ if (isset($this->questiondisplay->options->questions)) {
+
+ $subquestions = fullclone($this->questiondisplay->options->questions) ;
+ if (count($subquestions)) {
+ $sub =1;
+ foreach ($subquestions as $subquestion) {
+ $prefix = 'sub_'.$sub.'_' ;
+ $answercount = 0;
+ $maxgrade = false;
+ $maxfraction = -1;
+ foreach ( $subquestion->answer as $key=>$answer) {
+ $trimmedanswer = trim($answer);
+ if ($trimmedanswer !== '') {
+ $answercount++;
+ if ($subquestion->qtype =='numerical' && !(is_numeric($trimmedanswer) || $trimmedanswer == '*')) {
+ $errors[$prefix.'answer['.$key.']']= get_string('answermustbenumberorstar', 'qtype_numerical');
+ }
+ if ($subquestion->fraction[$key] == 1) {
+ $maxgrade = true;
}
+ if ($subquestion->fraction[$key] > $maxfraction) {
+ $maxfraction = $subquestion->fraction[$key] ;
+ }
+ }
+ }
+ if ($answercount==0) {
+ if ( $subquestion->qtype =='multichoice' ) {
+ $errors[$prefix.'answer[0]']= get_string('notenoughanswers', 'qtype_multichoice', 2);
+ }else {
+ $errors[$prefix.'answer[0]'] = get_string('notenoughanswers', 'quiz', 1);
+ }
+ }
+ if ($maxgrade == false) {
+ $errors[$prefix.'fraction[0]']=get_string('fractionsnomax', 'question');
+ }
+ $sub++;
+ }
+ } else {
+ $errors['questiontext']=get_string('questions missing', 'question');
+ }
+ }
+
return $errors;
}

0 comments on commit 74a2040

Please sign in to comment.