]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-6367:
authorthepurpleblob <thepurpleblob>
Wed, 8 Aug 2007 10:45:09 +0000 (10:45 +0000)
committerthepurpleblob <thepurpleblob>
Wed, 8 Aug 2007 10:45:09 +0000 (10:45 +0000)
First shot at import/export support in plugins.

question/format.php
question/format/xml/format.php

index 95f0a74851d33835fba14ee659c8817d73924a25..0cfd17bfd465b657efd0805c68770f501ab1020b 100644 (file)
@@ -112,6 +112,33 @@ class qformat_default {
          $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
@@ -394,6 +421,32 @@ class qformat_default {
  * 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
index 6adbfecffa751971bdc9204abe573670f16b41cc..515e9174126026bf0a18fccf64c79483630a7016 100755 (executable)
@@ -288,35 +288,6 @@ class qformat_xml extends qformat_default {
         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
@@ -564,9 +535,6 @@ class qformat_xml extends qformat_default {
             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 );
             }
@@ -589,9 +557,14 @@ class qformat_xml extends qformat_default {
                 $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
@@ -629,9 +602,6 @@ class qformat_xml extends qformat_default {
         case SHORTANSWER:
             $name = 'shortanswer';
             break;
-        //case regexp:
-        //    $name = 'regexp';
-        //    break;
         case NUMERICAL:
             $name = 'numerical';
             break;
@@ -651,7 +621,7 @@ class qformat_xml extends qformat_default {
             $name = 'calculated';
             break;
         default:
-            $name = 'unknown';
+            $name = false;
         }
         return $name;
     }
@@ -792,10 +762,10 @@ class qformat_xml extends qformat_default {
         // 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
@@ -896,18 +866,6 @@ class qformat_xml extends qformat_default {
                 $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;
@@ -1027,8 +985,10 @@ class qformat_xml extends qformat_default {
             }                      
             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