$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
* @return boolean success
* 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
* override if you don't want .txt
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
* @param array question question array from xml tree
elseif ($question_type=='shortanswer') {
$qo = $this->import_shortanswer( $question );
}
- //elseif ($question_type=='regexp') {
- // $qo = $this->import_regexp( $question );
- //}
elseif ($question_type=='numerical') {
$qo = $this->import_numerical( $question );
}
$qo = $this->import_category( $question );
}
else {
- $notsupported = get_string( 'xmltypeunsupported','quiz',$question_type );
- $this->error( $notsupported );
- $qo = null;
+ // try for plugin support
+ // no default question, as the plugin can call
+ // 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
case SHORTANSWER:
$name = 'shortanswer';
break;
- //case regexp:
- // $name = 'regexp';
- // break;
case NUMERICAL:
$name = 'numerical';
break;
$name = 'calculated';
break;
default:
- $name = 'unknown';
+ $name = false;
}
return $name;
}
// add comment
$expout .= "\n\n<!-- question: $question->id -->\n";
- // check question type - make sure valid
- $question_type = $this->get_qtype( $question->qtype );
- if ($question_type=='unknown') {
- $expout .= "<!-- question: $question->name is not a supported type -->\n\n";
+ // check question type
+ if (!$question_type = $this->get_qtype( $question->qtype )) {
+ // must be a plugin then, so just accept the name supplied
+ $question_type = $question->qtype;
}
// add opening tag
$expout .= " </answer>\n";
}
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:
foreach ($question->options->answers as $answer) {
$tolerance = $answer->tolerance;
}
break;
default:
- // should not get here
- error( 'Unsupported question type detected in strange circumstances!' );
+ // try support by optional plugin
+ if (!$expout .= $this->try_exporting_using_qtypes( $question->qtype, $question )) {
+ error( "Unsupported question type $question->qtype" );
+ }
}
// close the question tag