Skip to content
Browse files

merging from head so that calculated questions can be imported and ot…

…her improvments
  • Loading branch information...
1 parent fc418ee commit 9c53d3286c2ae62a71e6f04b0301dbcb7a2d48c6 pichetp committed May 11, 2007
Showing with 302 additions and 139 deletions.
  1. +125 −129 question/format/webct/format.php
  2. +177 −10 question/format/xml/format.php
View
254 question/format/webct/format.php
@@ -27,6 +27,10 @@
///////////////////////////////////////////////////////////////////////////
// Based on format.php, included by ../../import.php
+/**
+ * @package questionbank
+ * @subpackage importexport
+ */
function unhtmlentities($string){
$search = array ("'<script[?>]*?>.*?</script>'si", // remove javascript
@@ -58,91 +62,7 @@ function unhtmlentities($string){
return preg_replace ($search, $replace, $string);
}
-class qformat_webct_modified_calculated_qtype extends question_calculated_qtype {
-// We need to make a modification of this qtype so that
-// it will be able to save webct style calculated questions
-// The difference between webct and Moodle is that webct
-// pass the individual data items as part of the question
-// while Moodle core treat them separately
- function save_question_options($question, $options = false) {
-
- if (false !== $options) {
- // function is called from save_question...
- return parent::save_question_options($question, $options);
- }
-
- // function is called from format.php...
-
- $datasetdatas = $question->datasets;
-
- // Set dataset
- $form->dataset = array();
- foreach ($datasetdatas as $datasetname => $notimportant) {
- // Literal - question local - name
- $form->dataset[] = "1-0-$datasetname";
- }
-
- $subtypeoptions->answers = $question->answers;
- $subtypeoptions->units = $question->units;
-
- unset($question->datasets);
- unset($question->answers);
- unset($question->units);
-
- $this->save_question($question, $form, 'not used', $subtypeoptions);
-
- // Save dataset options and items...
-
- // Get datasetdefinitions
- global $CFG;
- $datasetdefs = get_records_sql(
- "SELECT a.*
- FROM {$CFG->prefix}question_dataset_definitions a,
- {$CFG->prefix}question_datasets b
- WHERE a.id = b.datasetdefinition
- AND b.question = '$question->id' ");
-
- foreach ($datasetdefs as $datasetdef) {
- $datasetdata = $datasetdatas[$datasetdef->name];
-
- // Set items and retrieve ->itemcout
- $item->definition = $datasetdef->id;
- for ($item->number=1 ; isset($datasetdata->items["$item->number"]) ; ++$item->number) {
- $item->value = $datasetdata->items["$item->number"];
- if (!insert_record('question_dataset_items', $item)) {
- error("Unable to insert dataset item $item->number with $item->value for $datasetdef->name");
- }
- }
- $datasetdef->itemcount = $item->number - 1;
-
- // Retrieve ->options
- if (is_numeric($datasetdata->min) && is_numeric($datasetdata->max)
- && $datasetdata->min <= $datasetdata->max) {
- if (is_numeric($datasetdata->dec)) {
- $dec = max(0, ceil($datasetdata->dec));
- } else {
- $dec = 1; // A try
- }
-
- $datasetdef->options = "uniform:$datasetdata->min:$datasetdata->max:$dec";
- } else {
- $datasetdef->options = '';
- }
-
- // Save definition
- if ($datasetdef->itemcount || $datasetdef->options) {
- if (!update_record('question_dataset_definitions', $datasetdef)) {
- error("Unable to update dataset definition $datasetdef->name on question $question->id");
- }
- }
- }
-
- // Done
- return true;
- }
-}
-$QTYPES[CALCULATED] = new qformat_webct_modified_calculated_qtype();
function qformat_webct_convert_formula($formula) {
@@ -246,8 +166,8 @@ function provide_import() {
}
function readquestions ($lines) {
-
- $qtypecalculated = new qformat_webct_modified_calculated_qtype();
+ global $QTYPES ;
+ // $qtypecalculated = new qformat_webct_modified_calculated_qtype();
$webctnumberregex =
'[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((e|E|\\*10\\*\\*)([+-]?[0-9]+|\\([+-]?[0-9]+\\)))?';
@@ -262,11 +182,11 @@ function readquestions ($lines) {
$nQuestionStartLine = 0;
$bIsHTMLText = FALSE;
$lines[] = ":EOF:"; // for an easiest processing of the last line
- $question = $this->defaultquestion();
+ // $question = $this->defaultquestion();
foreach ($lines as $line) {
$nLineCounter++;
-
+ $line = iconv("Windows-1252","UTF-8",$line);
// Processing multiples lines strings
if (isset($questiontext) and is_string($questiontext)) {
@@ -306,7 +226,7 @@ function readquestions ($lines) {
if (isset($feedbacktext) and is_string($feedbacktext)) {
if (ereg("^:",$line)) {
- $question->feedback[$currentchoice] = addslashes(trim($feedbacktext));
+ $question->feedback[$currentchoice] = addslashes(trim($feedbacktext));
unset($feedbacktext);
}
else {
@@ -315,6 +235,17 @@ function readquestions ($lines) {
}
}
+ if (isset($generalfeedbacktext) and is_string($generalfeedbacktext)) {
+ if (ereg("^:",$line)) {
+ $question->tempgeneralfeedback= addslashes(trim($generalfeedbacktext));
+ unset($generalfeedbacktext);
+ }
+ else {
+ $generalfeedbacktext .= str_replace('\:', ':', $line);
+ continue;
+ }
+ }
+
$line = trim($line);
if (eregi("^:(TYPE|EOF):",$line)) {
@@ -347,11 +278,26 @@ function readquestions ($lines) {
$QuestionOK = FALSE;
}
else {
- // Create empty feedback array
- $question->feedback = array();
+ // Create empty feedback array
foreach ($question->answer as $key => $dataanswer) {
- $question->feedback[$key] = '';
+ if(!isset( $question->feedback[$key])){
+ $question->feedback[$key] = '';
+ }
}
+ // this tempgeneralfeedback allows the code to work with versions from 1.6 to 1.9
+ // when question->generalfeedback is undefined, the webct feedback is added to each answer feedback
+ if (isset($question->tempgeneralfeedback)){
+ if (isset($question->generalfeedback)) {
+ $question->generalfeedback = $question->tempgeneralfeedback;
+ } else {
+ foreach ($question->answer as $key => $dataanswer) {
+ if ($question->tempgeneralfeedback !=''){
+ $question->feedback[$key] = $question->tempgeneralfeedback.'<br/>'.$question->feedback[$key];
+ }
+ }
+ }
+ unset($question->tempgeneralfeedback);
+ }
$maxfraction = -1;
$totalfraction = 0;
foreach($question->fraction as $fraction) {
@@ -366,7 +312,7 @@ function readquestions ($lines) {
case SHORTANSWER:
if ($maxfraction != 1) {
$maxfraction = $maxfraction * 100;
- $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsnomax", "quiz", $maxfraction);
+ $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).' '.get_string("fractionsnomax", "quiz", $maxfraction);
$QuestionOK = FALSE;
}
break;
@@ -375,36 +321,50 @@ function readquestions ($lines) {
if ($question->single) {
if ($maxfraction != 1) {
$maxfraction = $maxfraction * 100;
- $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsnomax", "quiz", $maxfraction);
+ $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).' '.get_string("fractionsnomax", "quiz", $maxfraction);
$QuestionOK = FALSE;
}
} else {
$totalfraction = round($totalfraction,2);
- if ($totalfraction != 1) {
- echo "<p>$totalfraction</p>";
+ if ($totalfraction != 1) {
$totalfraction = $totalfraction * 100;
- $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsaddwrong", "quiz", $totalfraction);
+ $errors[] = "'$question->name': ".get_string("wronggrade", "quiz", $nLineCounter).' '.get_string("fractionsaddwrong", "quiz", $totalfraction);
$QuestionOK = FALSE;
}
}
break;
case CALCULATED:
foreach ($question->answers as $answer) {
- if ($formulaerror = quiz_qtype_calculated_find_formula_errors($answer->answer)) {
+ if ($formulaerror =qtype_calculated_find_formula_errors($answer)) { //$QTYPES['calculated']->
$warnings[] = "'$question->name': ". $formulaerror;
$QuestionOK = FALSE;
}
}
+ foreach ($question->dataset as $dataset) {
+ $dataset->itemcount=count($dataset->datasetitem);
+ }
+ $question->import_process=TRUE ;
+ unset($question->answer); //not used in calculated question
break;
-
+ case MATCH:
+ if (count($question->answer) < 3){
+ // add a dummy missing question
+ $question->name = 'Dummy question added '.$question->name ;
+ $question->answer[] = 'dummy';
+ $question->subanswers[] = 'dummy';
+ $question->subquestions[] = 'dummy';
+ $question->fraction[] = '0.0';
+ $question->feedback[] = '';
+ }
+ break;
default:
// No problemo
}
}
- if ($QuestionOK) {
- // $question->feedback = array();
+ if ($QuestionOK) {
+ // echo "<pre>"; print_r ($question);
$questions[] = $question; // store it
unset($question); // and prepare a new one
$question = $this->defaultquestion();
@@ -417,6 +377,8 @@ function readquestions ($lines) {
if (eregi("^:TYPE:MC:1(.*)",$line,$webct_options)) {
// Multiple Choice Question with only one good answer
+ $question = $this->defaultquestion();
+ $question->feedback = array();
$question->qtype = MULTICHOICE;
$question->single = 1; // Only one answer is allowed
$ignore_rest_of_question = FALSE;
@@ -425,6 +387,8 @@ function readquestions ($lines) {
if (eregi("^:TYPE:MC:N(.*)",$line,$webct_options)) {
// Multiple Choice Question with several good answers
+ $question = $this->defaultquestion();
+ $question->feedback = array();
$question->qtype = MULTICHOICE;
$question->single = 0; // Many answers allowed
$ignore_rest_of_question = FALSE;
@@ -433,6 +397,8 @@ function readquestions ($lines) {
if (eregi("^:TYPE:S",$line)) {
// Short Answer Question
+ $question = $this->defaultquestion();
+ $question->feedback = array();
$question->qtype = SHORTANSWER;
$question->usecase = 0; // Ignore case
$ignore_rest_of_question = FALSE;
@@ -441,14 +407,20 @@ function readquestions ($lines) {
if (eregi("^:TYPE:C",$line)) {
// Calculated Question
+ /* $warnings[] = get_string("calculatedquestion", "quiz", $nLineCounter);
+ unset($question);
+ $ignore_rest_of_question = TRUE; // Question Type not handled by Moodle
+ */
+ $question = $this->defaultquestion();
$question->qtype = CALCULATED;
$question->answers = array(); // No problem as they go as :FORMULA: from webct
$question->units = array();
- $question->datasets = array();
+ $question->dataset = array();
// To make us pass the end-of-question sanity checks
$question->answer = array('dummy');
$question->fraction = array('1.0');
+ $question->feedback = array();
$currentchoice = -1;
$ignore_rest_of_question = FALSE;
@@ -457,21 +429,25 @@ function readquestions ($lines) {
if (eregi("^:TYPE:M",$line)) {
// Match Question
+ $question = $this->defaultquestion();
$question->qtype = MATCH;
+ $question->feedback = array();
$ignore_rest_of_question = FALSE; // match question processing is not debugged
continue;
}
if (eregi("^:TYPE:P",$line)) {
// Paragraph Question
$warnings[] = get_string("paragraphquestion", "quiz", $nLineCounter);
+ unset($question);
$ignore_rest_of_question = TRUE; // Question Type not handled by Moodle
continue;
}
if (eregi("^:TYPE:",$line)) {
// Unknow Question
$warnings[] = get_string("unknowntype", "quiz", $nLineCounter);
+ unset($question);
$ignore_rest_of_question = TRUE; // Question Type not handled by Moodle
continue;
}
@@ -502,25 +478,27 @@ function readquestions ($lines) {
// if question isn't defined yet there is nothing to do here (avoid notices)
if (!isset($question)) {
continue;
- }
- if (CALCULATED == $question->qtype && ereg(
+ }
+ if (isset($question->qtype ) && CALCULATED == $question->qtype && ereg(
"^:([[:lower:]].*|::.*)-(MIN|MAX|DEC|VAL([0-9]+))::?:?($webctnumberregex)", $line, $webct_options)) {
$datasetname = ereg_replace('^::', '', $webct_options[1]);
$datasetvalue = qformat_webct_convert_formula($webct_options[4]);
switch ($webct_options[2]) {
case 'MIN':
- $question->datasets[$datasetname]->min = $datasetvalue;
+ $question->dataset[$datasetname]->min = $datasetvalue;
break;
case 'MAX':
- $question->datasets[$datasetname]->max = $datasetvalue;
+ $question->dataset[$datasetname]->max = $datasetvalue;
break;
case 'DEC':
$datasetvalue = floor($datasetvalue); // int only!
- $question->datasets[$datasetname]->dec = max(0, $datasetvalue);
+ $question->dataset[$datasetname]->length = max(0, $datasetvalue);
break;
default:
// The VAL case:
- $question->datasets[$datasetname]->items[$webct_options[3]] = $datasetvalue;
+ $question->dataset[$datasetname]->datasetitem[$webct_options[3]] = new stdClass();
+ $question->dataset[$datasetname]->datasetitem[$webct_options[3]]->itemnumber = $webct_options[3];
+ $question->dataset[$datasetname]->datasetitem[$webct_options[3]]->value = $datasetvalue;
break;
}
continue;
@@ -550,19 +528,23 @@ function readquestions ($lines) {
if (eregi('^:FORMULA:(.*)', $line, $webct_options)) {
// Answer for a CALCULATED question
++$currentchoice;
- $question->answers[$currentchoice]->answer =
+ $question->answers[$currentchoice] =
qformat_webct_convert_formula($webct_options[1]);
// Default settings:
- $question->answers[$currentchoice]->fraction = 1.0;
- $question->answers[$currentchoice]->tolerance = 0.0;
- $question->answers[$currentchoice]->tolerancetype = 2; // nominal (units in webct)
- $question->answers[$currentchoice]->feedback = '';
- $question->answers[$currentchoice]->correctanswerlength = 4;
+ $question->fraction[$currentchoice] = 1.0;
+ $question->tolerance[$currentchoice] = 0.0;
+ $question->tolerancetype[$currentchoice] = 2; // nominal (units in webct)
+ $question->feedback[$currentchoice] = '';
+ $question->correctanswerlength[$currentchoice] = 4;
- $datasetnames = $qtypecalculated->find_dataset_names($webct_options[1]);
+ $datasetnames = $QTYPES[CALCULATED]->find_dataset_names($webct_options[1]);
foreach ($datasetnames as $datasetname) {
- $question->datasets[$datasetname]->items = array();
+ $question->dataset[$datasetname] = new stdClass();
+ $question->dataset[$datasetname]->datesetitem = array();
+ $question->dataset[$datasetname]->name = $datasetname ;
+ $question->dataset[$datasetname]->distribution = 'uniform';
+ $question->dataset[$datasetname]->status ='private';
}
continue;
}
@@ -585,24 +567,38 @@ function readquestions ($lines) {
$currentchoice=$webct_options[1];
continue;
}
+ if (eregi("^:FEEDBACK([0-9]+):?",$line,$webct_options)) {
+ $generalfeedbacktext=""; // Start gathering next lines
+ $currentchoice=$webct_options[1];
+ continue;
+ }
+ if (eregi('^:FEEDBACK:(.*)',$line,$webct_options)) {
+ $generalfeedbacktext=""; // Start gathering next lines
+ continue;
+ }
+ if (eregi('^:LAYOUT:(.*)',$line,$webct_options)) {
+ // ignore since layout in question_multichoice is no more used in moodle
+ // $webct_options[1] contains either vertical or horizontal ;
+ continue;
+ }
- if (CALCULATED == $question->qtype && eregi('^:ANS-DEC:([1-9][0-9]*)', $line, $webct_options)) {
+ if (isset($question->qtype ) && CALCULATED == $question->qtype && eregi('^:ANS-DEC:([1-9][0-9]*)', $line, $webct_options)) {
// We can but hope that this always appear before the ANSTYPE property
- $question->answers[$currentchoice]->correctanswerlength = $webct_options[1];
+ $question->correctanswerlength[$currentchoice] = $webct_options[1];
continue;
}
- if (CALCULATED == $question->qtype && eregi("^:TOL:($webctnumberregex)", $line, $webct_options)) {
+ if (isset($question->qtype )&& CALCULATED == $question->qtype && eregi("^:TOL:($webctnumberregex)", $line, $webct_options)) {
// We can but hope that this always appear before the TOL property
- $question->answers[$currentchoice]->tolerance =
+ $question->tolerance[$currentchoice] =
qformat_webct_convert_formula($webct_options[1]);
continue;
}
- if (CALCULATED == $question->qtype && eregi('^:TOLTYPE:percent', $line)) {
+ if (isset($question->qtype )&& CALCULATED == $question->qtype && eregi('^:TOLTYPE:percent', $line)) {
// Percentage case is handled as relative in Moodle:
- $question->answers[$currentchoice]->tolerance /= 100;
- $question->answers[$currentchoice]->tolerancetype = 1; // Relative
+ $question->tolerance[$currentchoice] /= 100;
+ $question->tolerancetype[$currentchoice] = 1; // Relative
continue;
}
@@ -634,12 +630,12 @@ function readquestions ($lines) {
continue;
}
- if (CALCULATED == $question->qtype && eregi('^:ANSTYPE:dec', $line)) {
- // Houston - we have a problem
- // Moodle does not support this - we try something defensively by
- // setting the correct answer length to 5, it shoud be enough for
- // most cases
- $question->answers[$currentchoice]->correctanswerlength = 5;
+ if (isset($question->qtype )&& CALCULATED == $question->qtype && eregi('^:ANSTYPE:dec', $line)) {
+ $question->correctanswerformat[$currentchoice]='1';
+ continue;
+ }
+ if (isset($question->qtype )&& CALCULATED == $question->qtype && eregi('^:ANSTYPE:sig', $line)) {
+ $question->correctanswerformat[$currentchoice]='2';
continue;
}
}
View
187 question/format/xml/format.php
@@ -5,7 +5,10 @@
//
//////////////////////////////////////////////////////////////////////////
// Based on default.php, included by ../import.php
-
+/**
+ * @package questionbank
+ * @subpackage importexport
+ */
require_once( "$CFG->libdir/xmlize.php" );
class qformat_xml extends qformat_default {
@@ -20,11 +23,11 @@ function provide_export() {
// IMPORT FUNCTIONS START HERE
- /*
+ /**
* Translate human readable format name
* into internal Moodle code number
- * @PARAM string name format name from xml file
- * @RETURN int Moodle format code
+ * @param string name format name from xml file
+ * @return int Moodle format code
*/
function trans_format( $name ) {
$name = trim($name);
@@ -53,8 +56,8 @@ function trans_format( $name ) {
/*
* Translate human readable single answer option
* to internal code number
- * @PARAM string name true/false
- * @RETURN int internal code number
+ * @param string name true/false
+ * @return int internal code number
*/
function trans_single( $name ) {
$name = trim($name);
@@ -65,14 +68,17 @@ function trans_single( $name ) {
}
}
- /*
+ /**
* process text string from xml file
* @PARAM array text bit of xml tree after ['text']
* @RETURN string processed text
*/
function import_text( $text ) {
+ // quick sanity check
+ if (empty($text)) {
+ return '';
+ }
$data = $text[0]['#'];
- $data = html_entity_decode( $data );
return addslashes(trim( $data ));
}
@@ -381,8 +387,102 @@ function import_essay( $question ) {
// get feedback
$qo->feedback = $this->import_text( $question['#']['answer'][0]['#']['feedback'][0]['#']['text'] );
- // get fraction
- $qo->fraction = $question['#']['answer'][0]['#']['fraction'][0]['#'];
+ // handle answer
+ $answer = $question['#']['answer'][0];
+
+ // get fraction - <fraction> tag is deprecated
+ if (!empty($answer['#']['fraction'][0]['#'])) {
+ $qo->fraction = $answer['#']['fraction'][0]['#'];
+ }
+ else {
+ $qo->fraction = $answer['@']['fraction'] / 100;
+ }
+
+ return $qo;
+ }
+
+ function import_calculated( $question ) {
+ // import numerical question
+
+ // get common parts
+ $qo = $this->import_headers( $question );
+
+ // header parts particular to numerical
+ $qo->qtype = CALCULATED ;//CALCULATED;
+ // get answers array
+ $answers = $question['#']['answer'];
+ $qo->answers = array();
+ $qo->feedback = array();
+ $qo->fraction = array();
+ $qo->tolerance = array();
+ $qo->tolerancetype = array();
+ $qo->correctanswerformat = array();
+ $qo->correctanswerlength = array();
+ $qo->feedback = array();
+ foreach ($answers as $answer) {
+ // answer outside of <text> is deprecated
+ if (!empty( $answer['#']['text'] )) {
+ $answertext = $this->import_text( $answer['#']['text'] );
+ }
+ else {
+ $answertext = trim($answer['#'][0]);
+ }
+ if ($answertext == '') {
+ $qo->answers[] = '*';
+ } else {
+ $qo->answers[] = $answertext;
+ }
+ $qo->feedback[] = $this->import_text( $answer['#']['feedback'][0]['#']['text'] );
+ $qo->tolerance[] = $answer['#']['tolerance'][0]['#'];
+ // fraction as a tag is deprecated
+ if (!empty($answer['#']['fraction'][0]['#'])) {
+ $qo->fraction[] = $answer['#']['fraction'][0]['#'];
+ }
+ else {
+ $qo->fraction[] = $answer['@']['fraction'] / 100;
+ }
+ $qo->tolerancetype[] = $answer['#']['tolerancetype'][0]['#'];
+ $qo->correctanswerformat[] = $answer['#']['correctanswerformat'][0]['#'];
+ $qo->correctanswerlength[] = $answer['#']['correctanswerlength'][0]['#'];
+ }
+ // get units array
+ $qo->unit = array();
+ if (isset($question['#']['units'][0]['#']['unit'])) {
+ $units = $question['#']['units'][0]['#']['unit'];
+ $qo->multiplier = array();
+ foreach ($units as $unit) {
+ $qo->multiplier[] = $unit['#']['multiplier'][0]['#'];
+ $qo->unit[] = $unit['#']['unit_name'][0]['#'];
+ }
+ }
+ $datasets = $question['#']['dataset_definitions'][0]['#']['dataset_definition'];
+ $qo->dataset = array();
+ $qo->datasetindex= 0 ;
+ foreach ($datasets as $dataset) {
+ $qo->datasetindex++;
+ $qo->dataset[$qo->datasetindex] = new stdClass();
+ $qo->dataset[$qo->datasetindex]->status = $this->import_text( $dataset['#']['status'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->name = $this->import_text( $dataset['#']['name'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->type = $dataset['#']['type'][0]['#'];
+ $qo->dataset[$qo->datasetindex]->distribution = $this->import_text( $dataset['#']['distribution'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->max = $this->import_text( $dataset['#']['maximum'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->min = $this->import_text( $dataset['#']['minimum'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->length = $this->import_text( $dataset['#']['decimals'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->distribution = $this->import_text( $dataset['#']['distribution'][0]['#']['text']);
+ $qo->dataset[$qo->datasetindex]->itemcount = $dataset['#']['itemcount'][0]['#'];
+ $qo->dataset[$qo->datasetindex]->datasetitem = array();
+ $qo->dataset[$qo->datasetindex]->itemindex = 0;
+ $qo->dataset[$qo->datasetindex]->number_of_items=$dataset['#']['number_of_items'][0]['#'];
+ $datasetitems = $dataset['#']['dataset_items'][0]['#']['dataset_item'];
+ foreach ($datasetitems as $datasetitem) {
+ $qo->dataset[$qo->datasetindex]->itemindex++;
+ $qo->dataset[$qo->datasetindex]->datasetitem[$qo->dataset[$qo->datasetindex]->itemindex] = new stdClass();
+ $qo->dataset[$qo->datasetindex]->datasetitem[$qo->dataset[$qo->datasetindex]->itemindex]->itemnumber = $datasetitem['#']['number'][0]['#']; //[0]['#']['number'][0]['#'] ; // [0]['numberitems'] ;//['#']['number'][0]['#'];// $datasetitems['#']['number'][0]['#'];
+ $qo->dataset[$qo->datasetindex]->datasetitem[$qo->dataset[$qo->datasetindex]->itemindex]->value = $datasetitem['#']['value'][0]['#'] ;//$datasetitem['#']['value'][0]['#'];
+ }
+ }
+
+ // echo "<pre>loaded qo";print_r($qo);echo "</pre>";
return $qo;
}
@@ -439,6 +539,9 @@ function readquestions($lines) {
elseif ($question_type=='essay') {
$qo = $this->import_essay( $question );
}
+ elseif ($question_type=='calculated') {
+ $qo = $this->import_calculated( $question );
+ }
else {
$notsupported = get_string( 'xmltypeunsupported','quiz',$question_type );
echo "<p>$notsupported</p>";
@@ -499,6 +602,9 @@ function get_qtype( $type_id ) {
case ESSAY:
$name = 'essay';
break;
+ case CALCULATED:
+ $name = 'calculated';
+ break;
default:
$name = 'unknown';
}
@@ -765,6 +871,67 @@ function writequestion( $question ) {
}
break;
+ case CALCULATED:
+ foreach ($question->options->answers as $answer) {
+ $tolerance = $answer->tolerance;
+ $tolerancetype = $answer->tolerancetype;
+ $correctanswerlength= $answer->correctanswerlength ;
+ $correctanswerformat= $answer->correctanswerformat;
+ $percent = 100 * $answer->fraction;
+ $expout .= "<answer fraction=\"$percent\">\n";
+ // "<text/>" tags are an added feature, old files won't have them
+ $expout .= " <text>{$answer->answer}</text>\n";
+ $expout .= " <tolerance>$tolerance</tolerance>\n";
+ $expout .= " <tolerancetype>$tolerancetype</tolerancetype>\n";
+ $expout .= " <correctanswerformat>$correctanswerformat</correctanswerformat>\n";
+ $expout .= " <correctanswerlength>$correctanswerformat</correctanswerlength>\n";
+ $expout .= " <feedback>".$this->writetext( $answer->feedback )."</feedback>\n";
+ $expout .= "</answer>\n";
+ }
+ $units = $question->options->units;
+ if (count($units)) {
+ $expout .= "<units>\n";
+ foreach ($units as $unit) {
+ $expout .= " <unit>\n";
+ $expout .= " <multiplier>{$unit->multiplier}</multiplier>\n";
+ $expout .= " <unit_name>{$unit->unit}</unit_name>\n";
+ $expout .= " </unit>\n";
+ }
+ $expout .= "</units>\n";
+ }
+ //echo "<pre> question calc";print_r($question);echo "</pre>";
+ //First, we a new function to get all the data itmes in the database
+ // $question_datasetdefs =$QTYPES['calculated']->get_datasets_for_export ($question);
+ // echo "<pre> question defs";print_r($question_datasetdefs);echo "</pre>";
+ //If there are question_datasets
+ if( isset($question->options->datasets)&&count($question->options->datasets)){// there should be
+ $expout .= "<dataset_definitions>\n";
+ foreach ($question->options->datasets as $def) {
+ $expout .= "<dataset_definition>\n";
+ $expout .= " <status>".$this->writetext($def->status)."</status>\n";
+ $expout .= " <name>".$this->writetext($def->name)."</name>\n";
+ $expout .= " <type>calculated</type>\n";
+ $expout .= " <distribution>".$this->writetext($def->distribution)."</distribution>\n";
+ $expout .= " <minimum>".$this->writetext($def->minimum)."</minimum>\n";
+ $expout .= " <maximum>".$this->writetext($def->maximum)."</maximum>\n";
+ $expout .= " <decimals>".$this->writetext($def->decimals)."</decimals>\n";
+ $expout .= " <itemcount>$def->itemcount</itemcount>\n";
+ if ($def->itemcount > 0 ) {
+ $expout .= " <dataset_items>\n";
+ foreach ($def->items as $item ){
+ $expout .= " <dataset_item>\n";
+ $expout .= " <number>".$item->itemnumber."</number>\n";
+ $expout .= " <value>".$item->value."</value>\n";
+ $expout .= " </dataset_item>\n";
+ }
+ $expout .= " </dataset_items>\n";
+ $expout .= " <number_of_items>".$def-> number_of_items."</number_of_items>\n";
+ }
+ $expout .= "</dataset_definition>\n";
+ }
+ $expout .= "</dataset_definitions>\n";
+ }
+ break;
default:
$expout .= "<!-- Question type is unknown or not supported (Type=$question->qtype) -->\n";
}

0 comments on commit 9c53d32

Please sign in to comment.
Something went wrong with that request. Please try again.