format.php

来自「很棒的在线教学系统」· PHP 代码 · 共 801 行 · 第 1/3 页

PHP
801
字号
<?PHP // $Id: format.php,v 1.12.4.6 2009/01/05 15:20:11 thepurpleblob Exp $/////////////////////////////////////////////////////////////////////////////// Hotpotatoes 5.0 and 6.0 Format////// This Moodle class provides all functions necessary to import///                                      (export is not implemented ... yet)///////////////////////////////////////////////////////////////////////////////// Based on default.php, included by ../import.php/** * @package questionbank * @subpackage importexport */class qformat_hotpot extends qformat_default {    function provide_import() {        return true;    }    function readquestions ($lines) {        /// Parses an array of lines into an array of questions,        /// where each item is a question object as defined by        /// readquestion().        // set courseid and baseurl        global $CFG, $COURSE, $course;        switch (true) {            case isset($this->course->id):                // import to quiz module                $courseid = $this->course->id;                break;            case isset($course->id):                // import to lesson module                $courseid = $course->id;                break;            case isset($COURSE->id):                // last resort                $courseid = $COURSE->id;                break;            default:                // shouldn't happen !!                $courseid = 0;         }        require_once($CFG->libdir.'/filelib.php');        $baseurl = get_file_url($courseid).'/';        // get import file name        global $params;        if (isset($params) && !empty($params->choosefile)) {            // course file (Moodle >=1.6+)            $filename = $params->choosefile;        } else {            // uploaded file (all Moodles)            $filename = basename($_FILES['newfile']['tmp_name']);        }        // get hotpot file source        $source = implode($lines, " ");        $source = hotpot_convert_relative_urls($source, $baseurl, $filename);        // create xml tree for this hotpot        $xml = new hotpot_xml_tree($source);        // determine the quiz type        $xml->quiztype = '';        $keys = array_keys($xml->xml);        foreach ($keys as $key) {            if (preg_match('/^(hotpot|textoys)-(\w+)-file$/i', $key, $matches)) {                $xml->quiztype = strtolower($matches[2]);                $xml->xml_root = "['$key']['#']";                break;            }        }        // convert xml to questions array        $questions = array();        switch ($xml->quiztype) {            case 'jcloze':                $this->process_jcloze($xml, $questions);                break;            case 'jcross':                $this->process_jcross($xml, $questions);                break;            case 'jmatch':                $this->process_jmatch($xml, $questions);                break;            case 'jmix':                $this->process_jmix($xml, $questions);                break;            case 'jbc':            case 'jquiz':                $this->process_jquiz($xml, $questions);                break;            default:                if (empty($xml->quiztype)) {                    notice("Input file not recognized as a Hot Potatoes XML file");                } else {                    notice("Unknown quiz type '$xml->quiztype'");                }        } // end switch        return $questions;    }    function process_jcloze(&$xml, &$questions) {        // define default grade (per cloze gap)        $defaultgrade = 1;        $gap_count = 0;        // detect old Moodles (1.4 and earlier)        global $CFG, $db;        $moodle_14 = false;        if ($columns = $db->MetaColumns("{$CFG->prefix}question_multianswer")) {            foreach ($columns as $column) {                if ($column->name=='answers' || $column->name=='positionkey' || $column->name=='answertype' || $column->name=='norm') {                    $moodle_14 = true;                }            }        }        // xml tags for the start of the gap-fill exercise        $tags = 'data,gap-fill';        $x = 0;        while (($exercise = "[$x]['#']") && $xml->xml_value($tags, $exercise)) {            // there is usually only one exercise in a file            if (method_exists($this, 'defaultquestion')) {                $question = $this->defaultquestion();            } else {                $question = new stdClass();                $question->usecase = 0; // Ignore case                $question->image = "";  // No images with this format            }            $question->qtype = MULTIANSWER;            $question->name = $this->hotpot_get_title($xml, $x);            $question->questiontext = $this->hotpot_get_reading($xml);            // setup answer arrays            if ($moodle_14) {                $question->answers = array();            } else {                global $COURSE; // initialized in questions/import.php                $question->course = $COURSE->id;                $question->options = new stdClass();                $question->options->questions = array(); // one for each gap            }            $q = 0;            while ($text = $xml->xml_value($tags, $exercise."[$q]")) {                // add next bit of text                $question->questiontext .= $this->hotpot_prepare_str($text);                // check for a gap                $question_record = $exercise."['question-record'][$q]['#']";                if ($xml->xml_value($tags, $question_record)) {                    // add gap                    $gap_count ++;                    $positionkey = $q+1;                    $question->questiontext .= '{#'.$positionkey.'}';                            // initialize answer settings                    if ($moodle_14) {                        $question->answers[$q]->positionkey = $positionkey;                        $question->answers[$q]->answertype = SHORTANSWER;                        $question->answers[$q]->norm = $defaultgrade;                        $question->answers[$q]->alternatives = array();                    } else {                        $wrapped = new stdClass();                        $wrapped->qtype = SHORTANSWER;                        $wrapped->usecase = 0;                        $wrapped->defaultgrade = $defaultgrade;                        $wrapped->questiontextformat = 0;                        $wrapped->answer = array();                        $wrapped->fraction = array();                        $wrapped->feedback = array();                        $answers = array();                    }                            // add answers                    $a = 0;                    while (($answer=$question_record."['answer'][$a]['#']") && $xml->xml_value($tags, $answer)) {                        $text = $this->hotpot_prepare_str($xml->xml_value($tags,  $answer."['text'][0]['#']"));                        $correct = $xml->xml_value($tags,  $answer."['correct'][0]['#']");                        $feedback = $this->hotpot_prepare_str($xml->xml_value($tags,  $answer."['feedback'][0]['#']"));                        if ($text) {                            // set score (0=0%, 1=100%)                            $fraction = empty($correct) ? 0 : 1;                            // store answer                            if ($moodle_14) {                                $question->answers[$q]->alternatives[$a] = new stdClass();                                $question->answers[$q]->alternatives[$a]->answer = $text;                                $question->answers[$q]->alternatives[$a]->fraction = $fraction;                                $question->answers[$q]->alternatives[$a]->feedback = $feedback;                            } else {                                $wrapped->answer[] = $text;                                $wrapped->fraction[] = $fraction;                                $wrapped->feedback[] = $feedback;                                $answers[] = (empty($fraction) ? '' : '=').$text.(empty($feedback) ? '' : ('#'.$feedback));                            }                        }                        $a++;                    }                    // compile answers into question text, if necessary                    if ($moodle_14) {                        // do nothing                    } else {                        $wrapped->questiontext = '{'.$defaultgrade.':SHORTANSWER:'.implode('~', $answers).'}';                        $question->options->questions[] = $wrapped;                    }                } // end if gap                $q++;            } // end while $text            // define total grade for this exercise            $question->defaultgrade = $gap_count * $defaultgrade;            $questions[] = $question;            $x++;        } // end while $exercise    }    function process_jcross(&$xml, &$questions) {        // xml tags to the start of the crossword exercise clue items        $tags = 'data,crossword,clues,item';        $x = 0;        while (($item = "[$x]['#']") && $xml->xml_value($tags, $item)) {            $text = $xml->xml_value($tags, $item."['def'][0]['#']");            $answer = $xml->xml_value($tags, $item."['word'][0]['#']");            if ($text && $answer) {                if (method_exists($this, 'defaultquestion')) {                    $question = $this->defaultquestion();                } else {                    $question = new stdClass();                    $question->usecase = 0; // Ignore case                    $question->image = "";  // No images with this format                }                $question->qtype = SHORTANSWER;                $question->name = $this->hotpot_get_title($xml, $x, true);                $question->questiontext = $this->hotpot_prepare_str($text);                $question->answer = array($this->hotpot_prepare_str($answer));                $question->fraction = array(1);                $question->feedback = array('');                $questions[] = $question;            }            $x++;        }    }    function process_jmatch(&$xml, &$questions) {        // define default grade (per matched pair)        $defaultgrade = 1;        $match_count = 0;        // xml tags to the start of the matching exercise        $tags = 'data,matching-exercise';        $x = 0;        while (($exercise = "[$x]['#']") && $xml->xml_value($tags, $exercise)) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?