芝麻web文件管理V1.00
编辑当前文件:/home2/sdektunc/public_html/cepali/question/type/match/db/upgradelib.php
. /** * Upgrade library code for the match question type. * * @package qtype_match * @copyright 2010 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Class for converting attempt data for match questions when upgrading * attempts to the new question engine. * * This class is used by the code in question/engine/upgrade/upgradelib.php. * * @copyright 2010 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class qtype_match_qe2_attempt_updater extends question_qtype_attempt_updater { protected $stems; protected $choices; protected $right; protected $stemorder; protected $choiceorder; protected $flippedchoiceorder; public function question_summary() { $this->stems = array(); $this->choices = array(); $this->right = array(); foreach ($this->question->options->subquestions as $matchsub) { $ans = $matchsub->answertext; $key = array_search($matchsub->answertext, $this->choices); if ($key === false) { $key = $matchsub->id; $this->choices[$key] = $matchsub->answertext; } if ($matchsub->questiontext !== '') { $this->stems[$matchsub->id] = $this->to_text($matchsub->questiontext); $this->right[$matchsub->id] = $key; } } return $this->to_text($this->question->questiontext) . ' {' . implode('; ', $this->stems) . '} -> {' . implode('; ', $this->choices) . '}'; } public function right_answer() { $answer = array(); foreach ($this->stems as $key => $stem) { $answer[$stem] = $this->choices[$this->right[$key]]; } return $this->make_summary($answer); } protected function explode_answer($answer) { if (!$answer) { return array(); } $bits = explode(',', $answer); $selections = array(); foreach ($bits as $bit) { list($stem, $choice) = explode('-', $bit); $selections[$stem] = $choice; } return $selections; } protected function make_summary($pairs) { $bits = array(); foreach ($pairs as $stem => $answer) { $bits[] = $stem . ' -> ' . $answer; } return implode('; ', $bits); } protected function lookup_choice($choice) { foreach ($this->question->options->subquestions as $matchsub) { if ($matchsub->id == $choice) { if (array_key_exists($matchsub->id, $this->choices)) { return $matchsub->id; } else { return array_search($matchsub->answertext, $this->choices); } } } return null; } public function response_summary($state) { $choices = $this->explode_answer($state->answer); if (empty($choices)) { return null; } $pairs = array(); foreach ($choices as $stemid => $choicekey) { if (array_key_exists($stemid, $this->stems) && $choices[$stemid]) { $choiceid = $this->lookup_choice($choicekey); if ($choiceid) { $pairs[$this->stems[$stemid]] = $this->choices[$choiceid]; } else { $this->logger->log_assumption("Dealing with a place where the student selected a choice that was later deleted for match question {$this->question->id}"); $pairs[$this->stems[$stemid]] = '[CHOICE THAT WAS LATER DELETED]'; } } } if ($pairs) { return $this->make_summary($pairs); } else { return ''; } } public function was_answered($state) { $choices = $this->explode_answer($state->answer); foreach ($choices as $choice) { if ($choice) { return true; } } return false; } public function set_first_step_data_elements($state, &$data) { $choices = $this->explode_answer($state->answer); foreach ($choices as $key => $notused) { if (array_key_exists($key, $this->stems)) { $this->stemorder[] = $key; } } $this->choiceorder = array_keys($this->choices); shuffle($this->choiceorder); $this->flippedchoiceorder = array_combine( array_values($this->choiceorder), array_keys($this->choiceorder)); $data['_stemorder'] = implode(',', $this->stemorder); $data['_choiceorder'] = implode(',', $this->choiceorder); } public function supply_missing_first_step_data(&$data) { throw new coding_exception('qtype_match_updater::supply_missing_first_step_data ' . 'not tested'); $data['_stemorder'] = array_keys($this->stems); $data['_choiceorder'] = shuffle(array_keys($this->choices)); } public function set_data_elements_for_step($state, &$data) { $choices = $this->explode_answer($state->answer); foreach ($this->stemorder as $i => $key) { if (empty($choices[$key])) { $data['sub' . $i] = 0; continue; } $choice = $this->lookup_choice($choices[$key]); if (array_key_exists($choice, $this->flippedchoiceorder)) { $data['sub' . $i] = $this->flippedchoiceorder[$choice] + 1; } else { $data['sub' . $i] = 0; } } } }