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 + -
显示快捷键?