MDL-6367:

First shot at import/export support in plugins.
This commit is contained in:
thepurpleblob 2007-08-08 10:45:09 +00:00
parent d7ef47b3f1
commit a41e328736
2 changed files with 70 additions and 57 deletions

View file

@ -112,6 +112,33 @@ class qformat_default {
$this->importerrors++; $this->importerrors++;
} }
/**
* Import for questiontype plugins
* Do not override.
* @param data mixed The segment of data containing the question
* @param question object processed (so far) by standard import code if appropriate
* @param extra mixed any additional format specific data that may be passed by the format
* @return object question object suitable for save_options() or false if cannot handle
*/
function try_importing_using_qtypes( $data, $question=null, $extra=null ) {
global $QTYPES;
// work out what format we are using
$formatname = substr( get_class( $this ), strlen('qformat_'));
$methodname = "import_from_$formatname";
// loop through installed questiontypes checking for
// function to handle this question
foreach ($QTYPES as $qtype) {
if (method_exists( $qtype, $methodname)) {
if ($question = $qtype->$methodname( $data, $question, $this, $extra )) {
return $question;
}
}
}
return false;
}
/** /**
* Perform any required pre-processing * Perform any required pre-processing
* @return boolean success * @return boolean success
@ -394,6 +421,32 @@ class qformat_default {
* EXPORT FUNCTIONS * EXPORT FUNCTIONS
*******************/ *******************/
/**
* Provide export functionality for plugin questiontypes
* Do not override
* @param name questiontype name
* @param question object data to export
* @param extra mixed any addition format specific data needed
* @return string the data to append to export or false if error (or unhandled)
*/
function try_exporting_using_qtypes( $name, $question, $extra=null ) {
global $QTYPES;
// work out the name of format in use
$formatname = substr( get_class( $this ), strlen( 'qformat_' ));
$methodname = "export_to_$formatname";
if (array_key_exists( $name, $QTYPES )) {
$qtype = $QTYPES[ $name ];
if (method_exists( $qtype, $methodname )) {
if ($data = $qtype->$methodname( $question, $this, $extra )) {
return $data;
}
}
}
return false;
}
/** /**
* Return the files extension appropriate for this type * Return the files extension appropriate for this type
* override if you don't want .txt * override if you don't want .txt

View file

@ -288,35 +288,6 @@ class qformat_xml extends qformat_default {
return $qo; return $qo;
} }
/**
* import regexp type question
* @param array question question array from xml tree
* @return object question object
*/
function import_regexp( $question ) {
// get common parts
$qo = $this->import_headers( $question );
// header parts particular to shortanswer
$qo->qtype = regexp;
// get usecase
$qo->usecase = $question['#']['usecase'][0]['#'];
// run through the answers
$answers = $question['#']['answer'];
$a_count = 0;
foreach ($answers as $answer) {
$ans = $this->import_answer( $answer );
$qo->answer[$a_count] = $ans->answer;
$qo->fraction[$a_count] = $ans->fraction;
$qo->feedback[$a_count] = $ans->feedback;
++$a_count;
}
return $qo;
}
/** /**
* import description type question * import description type question
* @param array question question array from xml tree * @param array question question array from xml tree
@ -564,9 +535,6 @@ class qformat_xml extends qformat_default {
elseif ($question_type=='shortanswer') { elseif ($question_type=='shortanswer') {
$qo = $this->import_shortanswer( $question ); $qo = $this->import_shortanswer( $question );
} }
//elseif ($question_type=='regexp') {
// $qo = $this->import_regexp( $question );
//}
elseif ($question_type=='numerical') { elseif ($question_type=='numerical') {
$qo = $this->import_numerical( $question ); $qo = $this->import_numerical( $question );
} }
@ -589,9 +557,14 @@ class qformat_xml extends qformat_default {
$qo = $this->import_category( $question ); $qo = $this->import_category( $question );
} }
else { else {
$notsupported = get_string( 'xmltypeunsupported','quiz',$question_type ); // try for plugin support
$this->error( $notsupported ); // no default question, as the plugin can call
$qo = null; // import_headers() itself if it wants to
if (!$qo=$this->try_importing_using_qtypes( $question )) {
$notsupported = get_string( 'xmltypeunsupported','quiz',$question_type );
$this->error( $notsupported );
$qo = null;
}
} }
// stick the result in the $questions array // stick the result in the $questions array
@ -629,9 +602,6 @@ class qformat_xml extends qformat_default {
case SHORTANSWER: case SHORTANSWER:
$name = 'shortanswer'; $name = 'shortanswer';
break; break;
//case regexp:
// $name = 'regexp';
// break;
case NUMERICAL: case NUMERICAL:
$name = 'numerical'; $name = 'numerical';
break; break;
@ -651,7 +621,7 @@ class qformat_xml extends qformat_default {
$name = 'calculated'; $name = 'calculated';
break; break;
default: default:
$name = 'unknown'; $name = false;
} }
return $name; return $name;
} }
@ -792,10 +762,10 @@ class qformat_xml extends qformat_default {
// add comment // add comment
$expout .= "\n\n<!-- question: $question->id -->\n"; $expout .= "\n\n<!-- question: $question->id -->\n";
// check question type - make sure valid // check question type
$question_type = $this->get_qtype( $question->qtype ); if (!$question_type = $this->get_qtype( $question->qtype )) {
if ($question_type=='unknown') { // must be a plugin then, so just accept the name supplied
$expout .= "<!-- question: $question->name is not a supported type -->\n\n"; $question_type = $question->qtype;
} }
// add opening tag // add opening tag
@ -896,18 +866,6 @@ class qformat_xml extends qformat_default {
$expout .= " </answer>\n"; $expout .= " </answer>\n";
} }
break; break;
//case regexp:
//$expout .= " <usecase>{$question->options->usecase}</usecase>\n ";
// foreach($question->options->answers as $answer) {
// $percent = 100 * $answer->fraction;
// $expout .= " <answer fraction=\"$percent\">\n";
// $expout .= $this->writetext( $answer->answer,3,false );
// $expout .= " <feedback>\n";
// $expout .= $this->writetext( $answer->feedback,4,false );
// $expout .= " </feedback>\n";
// $expout .= " </answer>\n";
// }
// break;
case NUMERICAL: case NUMERICAL:
foreach ($question->options->answers as $answer) { foreach ($question->options->answers as $answer) {
$tolerance = $answer->tolerance; $tolerance = $answer->tolerance;
@ -1027,8 +985,10 @@ class qformat_xml extends qformat_default {
} }
break; break;
default: default:
// should not get here // try support by optional plugin
error( 'Unsupported question type detected in strange circumstances!' ); if (!$expout .= $this->try_exporting_using_qtypes( $question->qtype, $question )) {
error( "Unsupported question type $question->qtype" );
}
} }
// close the question tag // close the question tag