From: pichetp Date: Sat, 22 Aug 2009 14:53:41 +0000 (+0000) Subject: MDL-19519 , MDL-1728 Adding database question_calculated_options X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=1ee53ca9299d92ffe83d483fb8f7326e50f39567;p=moodle.git MDL-19519 , MDL-1728 Adding database question_calculated_options MDL-18924 Testing in dataitems are numericals --- diff --git a/question/type/calculated/questiontype.php b/question/type/calculated/questiontype.php index bce8c961f2..35fa83b64c 100644 --- a/question/type/calculated/questiontype.php +++ b/question/type/calculated/questiontype.php @@ -39,6 +39,9 @@ class question_calculated_qtype extends default_questiontype { echo $OUTPUT->notification('Error: Missing question answer for calculated question ' . $question->id . '!'); return false; } + if (!$question->options->synchronize = $DB->get_field('question_calculated_options', 'synchronize', array('question' => $question->id)) ) { + $question->options->synchronize = 0; + } /* if(false === parent::get_question_options($question)) { @@ -127,10 +130,29 @@ class question_calculated_qtype extends default_questiontype { //$options = $question->subtypeoptions; // Get old answers: global $CFG, $DB; - if (isset($question->answer) && !isset($question->answers)) { $question->answers = $question->answer; } + // calculated options + $update = true ; + $options = $DB->get_record("question_calculated_options", array("question" => $question->id)); + if (!$options) { + $update = false; + $options = new stdClass; + $options->question = $question->id; + } + $options->synchronize = $question->synchronize; + if ($update) { + if (!$DB->update_record("question_calculated_options", $options)) { + $result->error = "Could not update calculated question options! (id=$options->id)"; + return $result; + } + } else { + if (!$DB->insert_record("question_calculated_options", $options)) { + $result->error = "Could not insert calculated question options!"; + return $result; + } + } // Get old versions of the objects if (!$oldanswers = $DB->get_records('question_answers', array('question' => $question->id), 'id ASC')) { @@ -298,21 +320,30 @@ class question_calculated_qtype extends default_questiontype { AND a.id = b.datasetdefinition", array($question->id))) { print_error('cannotgetdsforquestion', 'question', '', $question->id); } + $sql = "SELECT i.* + FROM {question_datasets} d, + {question_dataset_definitions} i + WHERE d.question = ? + AND d.datasetdefinition = i.id + AND i.category != 0 + "; + if (!$question->options->synchronize || !$records = $DB->get_records_sql($sql, array($question->id))) { + $synchronize_calculated = false ; + }else { + $synchronize_calculated = true ; + } // Choose a random dataset - if (!isset($cmoptions->intro) || strstr($cmoptions->intro, 'synchronize_calculated') === false ) { + if ( $synchronize_calculated === false ) { $state->options->datasetitem = rand(1, $maxnumber); }else{ - if( !isset($cmoptions->synchronize_calculated)) { - $state->options->datasetitem = rand(1, $maxnumber); - $cmoptions->synchronize_calculated = $state->options->datasetitem ; - }else { - if ($cmoptions->synchronize_calculated <= $maxnumber){ - $state->options->datasetitem = $cmoptions->synchronize_calculated ; - }else { - $state->options->datasetitem = rand(1, $maxnumber); - } + $state->options->datasetitem = intval( $maxnumber * substr($attempt->timestart,-2) /100 ) ; + if ($state->options->datasetitem < 1) { + $state->options->datasetitem =1 ; + } else if ($state->options->datasetitem > $maxnumber){ + $state->options->datasetitem = $maxnumber ; } + }; $state->options->dataset = $this->pick_question_dataset($question,$state->options->datasetitem); @@ -553,6 +584,7 @@ class question_calculated_qtype extends default_questiontype { * @param PARAM_ALPHA $wizardnow should be added as we are coming from question2.php */ function save_question($question, $form, $course) { + global $DB; $wizardnow = optional_param('wizardnow', '', PARAM_ALPHA); $id = optional_param('id', 0, PARAM_INT); // question id // in case 'question' @@ -589,6 +621,26 @@ class question_calculated_qtype extends default_questiontype { } break; case 'datasetdefinitions': + // calculated options + $update = true ; + $options = $DB->get_record("question_calculated_options", array("question" => $question->id)); + if (!$options) { + $update = false; + $options = new stdClass; + $options->question = $question->id; + } + $options->synchronize = $form->synchronize; + if ($update) { + if (!$DB->update_record("question_calculated_options", $options)) { + $result->error = "Could not update calculated question options! (id=$options->id)"; + return $result; + } + } else { + if (!$DB->insert_record("question_calculated_options", $options)) { + $result->error = "Could not insert calculated question options!"; + return $result; + } + } $this->save_dataset_definitions($form); break; @@ -611,6 +663,9 @@ class question_calculated_qtype extends default_questiontype { function delete_question($questionid) { global $DB; $DB->delete_records("question_calculated", array("question" => $questionid)); + if ( $DB->table_exists("question_calculated_options") ){ + $DB->delete_records("question_calculated_options", array("question" => $questionid)); + }; $DB->delete_records("question_numerical_units", array("question" => $questionid)); if ($datasets = $DB->get_records('question_datasets', array('question' => $questionid))) { foreach ($datasets as $dataset) { @@ -1187,13 +1242,22 @@ class question_calculated_qtype extends default_questiontype { } function substitute_variables($str, $dataset) { - // print_r( + // testing for wrong numerical values + // all calculations used this function so testing here should be OK foreach ($dataset as $name => $value) { - if($value < 0 ){ - $str = str_replace('{'.$name.'}', '('.$value.')', $str); + $val = $value ; + if(! is_numeric($val)){ + $a = new stdClass; + $a->name = '{'.$name.'}' ; + $a->value = $value ; + echo $OUTPUT->notification(get_string('notvalidnumber','qtype_calculated',$a)); + $val = 1.0 ; + } + if($val < 0 ){ + $str = str_replace('{'.$name.'}', '('.$val.')', $str); } else { - $str = str_replace('{'.$name.'}', $value, $str); + $str = str_replace('{'.$name.'}', $val, $str); } } return $str; @@ -1256,6 +1320,8 @@ class question_calculated_qtype extends default_questiontype { function save_dataset_definitions($form) { global $DB; + // save synchronize + // Save datasets $datasetdefinitions = $this->get_dataset_definitions($form->id, $form->dataset); $tmpdatasets = array_flip($form->dataset); @@ -1635,8 +1701,18 @@ class question_calculated_qtype extends default_questiontype { //End calculated data $status = $status &&fwrite ($bf,end_tag("CALCULATED",$level,true)); } - //Now print question_answers - $status = question_backup_answers($bf,$preferences,$question); + $calculated_options = $DB->get_records("question_calculated_options",array("questionid" => $question),"id"); + if ($calculated_options) { + //Iterate over each calculated_option + foreach ($calculated_options as $calculated_option) { + $status = fwrite ($bf,start_tag("CALCULATED_OPTIONS",$level,true)); + //Print calculated_option contents + fwrite ($bf,full_tag("SYNCHRONIZE",$level+1,false,$calculated_option->synchronize)); + $status = fwrite ($bf,end_tag("CALCULATED_OPTIONS",$level,true)); + } + //Now print question_answers + $status = question_backup_answers($bf,$preferences,$question); + } } return $status; } @@ -1690,6 +1766,37 @@ class question_calculated_qtype extends default_questiontype { } backup_flush(300); } + //Get the calculated_options array + // need to check as old questions don't have calculated_options record + if(isset($info['#']['CALCULATED_OPTIONS'])){ + $calculatedoptions = $info['#']['CALCULATED_OPTIONS']; + + //Iterate over calculated_options + for($i = 0; $i < sizeof($calculatedoptions); $i++) { + $cal_info = $calculatedoptions[$i]; + //traverse_xmlize($cal_info); //Debug + //print_object ($GLOBALS['traverse_array']); //Debug + //$GLOBALS['traverse_array']=""; //Debug + + //Now, build the question_calculated_options record structure + $calculated_options->questionid = $new_question_id; + $calculated_options->synchronize = backup_todb($cal_info['#']['SYNCHRONIZE']['0']['#']); + } + + //The structure is equal to the db, so insert the question_calculated_options + $newid = $DB->insert_record ("question_calculated_options",$calculated_options); + + //Do some output + if (($i+1) % 50 == 0) { + if (!defined('RESTORE_SILENTLY')) { + echo "."; + if (($i+1) % 1000 == 0) { + echo "
"; + } + } + backup_flush(300); + } + } //Now restore numerical_units $status = question_restore_numerical_units ($old_question_id,$new_question_id,$cal_info,$restore); @@ -1875,8 +1982,7 @@ function qtype_calculated_find_formula_errors($formula) { $safeoperatorchar = '-+/*%>:^~