mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 08:26:37 +02:00
Removed old versions of quiz format plugins
This commit is contained in:
parent
2860b7a5f2
commit
1a5a3ccf24
8 changed files with 0 additions and 1419 deletions
|
@ -1,91 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
|
||||
///
|
||||
/// Written by Tom Robb <tom@robb.net> 2 November 2003
|
||||
///
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// AIKEN FORMAT
|
||||
///
|
||||
/// This Moodle class provides all functions necessary to import and export
|
||||
/// one-correct-answer multiple choice questions in this format:
|
||||
///
|
||||
/// Question text
|
||||
/// A) Choice #1
|
||||
/// B) Choice #2
|
||||
/// C) Choice #3
|
||||
/// D) Choice #4
|
||||
/// ANSWER: B
|
||||
/// (blank line next not necessary since "AN" at the beginning of a line
|
||||
/// triggers the question input and causes input to start all over.
|
||||
///
|
||||
///Only ONE correct answer is allowed with no feedback responses.
|
||||
///
|
||||
///Be sure to reword "All of the above" type questions as "All of these" (etc.) so that choices can
|
||||
/// be randomized
|
||||
///
|
||||
///This should work on WIN, Mac and Unix although only tested on Mac
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
//will this override default function?
|
||||
function readquestions($lines){
|
||||
$questions = array();
|
||||
$endchar = chr(13);
|
||||
foreach ($lines as $line) {
|
||||
$stp = strpos($line,$endchar,0);
|
||||
$newlines = explode($endchar,$line);
|
||||
$foundQ = 0;
|
||||
for ($i=0; $i < count($newlines);$i++){
|
||||
$nowline = addslashes($newlines[$i]);
|
||||
///Go through the arrage and build an object called $question
|
||||
///When done, add $question to $questions
|
||||
if (strlen($nowline)< 2) {
|
||||
continue;
|
||||
}
|
||||
// This will show everyline when file is being processed
|
||||
// print("$nowline<br>");
|
||||
$leader = substr(ltrim($nowline),0,2);
|
||||
if (strpos(".A)B)C)D)E)F)G)H)I)J)A.B.C.D.E.F.G.H.I.J.",$leader)>0){
|
||||
//trim off the label and space
|
||||
$question->answer[] = substr($nowline,3);
|
||||
$question->fraction[] = 0;
|
||||
continue;
|
||||
}
|
||||
if ($leader == "AN"){
|
||||
$ans = trim(strstr($nowline,":"));
|
||||
$ans = substr($ans,2,1);
|
||||
//A becomes 0 since array starts from 0
|
||||
$rightans = ord($ans) - 65;
|
||||
$question->fraction[$rightans] = 1;
|
||||
$questions[] = $question;
|
||||
//clear array for next question set
|
||||
$question = NULL;
|
||||
continue;
|
||||
} else {
|
||||
//Must be the first line since no leader
|
||||
$question->qtype = MULTICHOICE;
|
||||
$question->name = substr($nowline,0,50);
|
||||
$question->questiontext = $nowline;
|
||||
$question->single = 1;
|
||||
$question->feedback[] = "";
|
||||
$question->usecase = 0; // Ignore case
|
||||
$question->defaultgrade = 1;
|
||||
$question->image = ""; // No images with this format
|
||||
}
|
||||
}
|
||||
}
|
||||
return $questions;
|
||||
}
|
||||
|
||||
function readquestion($lines) {
|
||||
//this is no longer needed but might still be called by default.php
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,224 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// Academy of Nursing format
|
||||
///
|
||||
/// Based on missingword.php
|
||||
///
|
||||
/// This Moodle class provides all functions necessary to import and export
|
||||
/// one-correct-answer multiple choice questions in this format:
|
||||
///
|
||||
/// As soon as we begin to explore our body parts as infants
|
||||
/// we become students of {=anatomy and physiology ~reflexology
|
||||
/// ~science ~experiment}, and in a sense we remain students for life.
|
||||
///
|
||||
/// Each answer is separated with a tilde ~, and the correct answer is
|
||||
/// prefixed with an equals sign =
|
||||
///
|
||||
/// Afterwards, all short-answer questions are randomly packed into
|
||||
/// 4-answer matching questions.
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
function readquestion($lines) {
|
||||
/// Given an array of lines known to define a question in
|
||||
/// this format, this function converts it into a question
|
||||
/// object suitable for processing and insertion into Moodle.
|
||||
|
||||
$question = NULL;
|
||||
|
||||
$text = implode($lines, " ");
|
||||
|
||||
/// Find answer section
|
||||
|
||||
$answerstart = strpos($text, "{");
|
||||
if ($answerstart === false) {
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>$text<P>Could not find a {";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$answerfinish = strpos($text, "}");
|
||||
if ($answerfinish === false) {
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>$text<P>Could not find a }";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$answerlength = $answerfinish - $answerstart;
|
||||
$answertext = substr($text, $answerstart + 1, $answerlength - 1);
|
||||
|
||||
/// Save the new question text
|
||||
$question->questiontext = addslashes(substr_replace($text, "_____", $answerstart, $answerlength+1));
|
||||
$question->name = substr($question->questiontext, 0, 60)." ...";
|
||||
|
||||
|
||||
/// Parse the answers
|
||||
$answers = explode("~", $answertext);
|
||||
|
||||
$countanswers = count($answers);
|
||||
|
||||
switch ($countanswers) {
|
||||
case 0: // invalid question
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>No answers found in $answertext";
|
||||
}
|
||||
return false;
|
||||
|
||||
case 1:
|
||||
$question->qtype = SHORTANSWER;
|
||||
|
||||
$answer = trim($answers[0]);
|
||||
if ($answer[0] == "=") {
|
||||
$answer = substr($answer, 1);
|
||||
}
|
||||
$question->answer[] = addslashes($answer);
|
||||
$question->fraction[] = 1;
|
||||
$question->feedback[] = "";
|
||||
|
||||
$question->usecase = 0; // Ignore case
|
||||
$question->defaultgrade = 1;
|
||||
$question->image = ""; // No images with this format
|
||||
return $question;
|
||||
|
||||
default:
|
||||
$question->qtype = MULTICHOICE;
|
||||
|
||||
$answers = swapshuffle($answers);
|
||||
foreach ($answers as $key => $answer) {
|
||||
$answer = trim($answer);
|
||||
if ($answer[0] == "=") {
|
||||
$question->fraction[$key] = 1;
|
||||
$answer = substr($answer, 1);
|
||||
} else {
|
||||
$question->fraction[$key] = 0;
|
||||
}
|
||||
$question->answer[$key] = addslashes($answer);
|
||||
$question->feedback[$key] = "";
|
||||
}
|
||||
|
||||
$question->defaultgrade = 1;
|
||||
$question->single = 1; // Only one answer is allowed
|
||||
$question->image = ""; // No images with this format
|
||||
return $question;
|
||||
}
|
||||
}
|
||||
|
||||
function importpostprocess() {
|
||||
/// Goes through the questionids, looking for shortanswer questions
|
||||
/// and converting random groups of 4 into matching questions.
|
||||
|
||||
/// Doesn't handle shortanswer questions with more than one answer
|
||||
|
||||
global $CFG;
|
||||
|
||||
print_heading(count($this->questionids)." ".get_string("questions", "quiz"));
|
||||
|
||||
$questionids = implode(',', $this->questionids);
|
||||
|
||||
if (!$shortanswers = get_records_select("quiz_questions",
|
||||
"id IN ($questionids) AND qtype = ".SHORTANSWER,
|
||||
"", "id,qtype")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
$shortanswerids = array();
|
||||
foreach ($shortanswers as $key => $shortanswer) {
|
||||
$shortanswerids[] = $key;
|
||||
}
|
||||
|
||||
$strmatch = get_string("match", "quiz")." (".$this->category->name.")";
|
||||
|
||||
$shortanswerids = swapshuffle($shortanswerids);
|
||||
$count = $shortanswercount = count($shortanswerids);
|
||||
$i = 1;
|
||||
$matchcount = 0;
|
||||
|
||||
$question->category = $this->category->id;
|
||||
$question->qtype = MATCH;
|
||||
$question->questiontext = get_string("randomsamatchintro", "quiz");
|
||||
$question->image = "";
|
||||
|
||||
while ($count > 4) {
|
||||
$matchcount++;
|
||||
$question->name = "$strmatch $i";
|
||||
$question->subquestions = array();
|
||||
$question->subanswers = array();
|
||||
|
||||
$extractids = implode(',', array_splice($shortanswerids, -4));
|
||||
$count = count($shortanswerids);
|
||||
|
||||
$extracts = get_records_sql("SELECT q.questiontext, a.answer
|
||||
FROM {$CFG->prefix}quiz_questions q,
|
||||
{$CFG->prefix}quiz_shortanswer sa,
|
||||
{$CFG->prefix}quiz_answers a
|
||||
WHERE q.id in ($extractids)
|
||||
AND sa.question = q.id
|
||||
AND a.id = sa.answers");
|
||||
|
||||
if (count($extracts) != 4) {
|
||||
print_object($extracts);
|
||||
notify("Could not find exactly four shortanswer questions with ids: $extractids");
|
||||
continue;
|
||||
}
|
||||
|
||||
$question->stamp = make_unique_id_code(); // Set the unique code (not to be changed)
|
||||
$question->version = 1; // Original version of this question
|
||||
|
||||
if (!$question->id = insert_record("quiz_questions", $question)) {
|
||||
error("Could not insert new question!");
|
||||
}
|
||||
|
||||
foreach ($extracts as $shortanswer) {
|
||||
$question->subquestions[] = addslashes($shortanswer->questiontext);
|
||||
$question->subanswers[] = addslashes($shortanswer->answer);
|
||||
}
|
||||
|
||||
$result = quiz_save_question_options($question);
|
||||
|
||||
if (!empty($result->error)) {
|
||||
notify("Error: $result->error");
|
||||
}
|
||||
|
||||
if (!empty($result->notice)) {
|
||||
notify($result->notice);
|
||||
}
|
||||
|
||||
/// Delete the old short-answer questions
|
||||
|
||||
execute_sql("DELETE FROM {$CFG->prefix}quiz_questions WHERE id IN ($extractids)", false);
|
||||
execute_sql("DELETE FROM {$CFG->prefix}quiz_shortanswer WHERE question IN ($extractids)", false);
|
||||
execute_sql("DELETE FROM {$CFG->prefix}quiz_answers WHERE question IN ($extractids)", false);
|
||||
|
||||
}
|
||||
|
||||
if ($count) { /// Delete the remaining ones
|
||||
foreach ($shortanswerids as $shortanswerid) {
|
||||
delete_records("quiz_questions", "id", $shortanswerid);
|
||||
delete_records("quiz_shortanswer", "question", $shortanswerid);
|
||||
delete_records("quiz_answers", "question", $shortanswerid);
|
||||
}
|
||||
}
|
||||
$info = "$shortanswercount ".get_string("shortanswer", "quiz").
|
||||
" => $matchcount ".get_string("match", "quiz");
|
||||
|
||||
print_heading($info);
|
||||
|
||||
$options['category'] = $this->category->id;
|
||||
echo "<center>";
|
||||
print_single_button("multiple.php", $options, get_string("randomcreate", "quiz"));
|
||||
echo "</center>";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,252 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// Blackboard 6.0 Format
|
||||
///
|
||||
/// This Moodle class provides all functions necessary to import and export
|
||||
///
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
require_once ("$CFG->libdir/xmlize.php");
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
/********************************
|
||||
Need to re-compile php with zip support before testing this
|
||||
|
||||
function readdata($filename) {
|
||||
/// Returns complete file with an array, one item per line
|
||||
|
||||
if (is_readable($filename)) {
|
||||
|
||||
$zip = zip_open($filename);
|
||||
$zip_entry = $zip_read($zip);
|
||||
if (strstr($zip_entry_name($zip_entry), "imsmanifest") == 0)
|
||||
$zip_entry = $zip_read($zip); // skip past manifest file
|
||||
|
||||
if (zip_entry_open($zip, $zip_entry, "r")) {
|
||||
|
||||
$strbuf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
|
||||
$buf = explode("\n", $strbuf);
|
||||
zip_entry_close($zip_entry);
|
||||
zip_close($zip);
|
||||
return $buf;
|
||||
|
||||
} else {
|
||||
|
||||
zip_close($zip);
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
********************************/
|
||||
|
||||
function readquestions ($lines) {
|
||||
/// Parses an array of lines into an array of questions,
|
||||
/// where each item is a question object as defined by
|
||||
/// readquestion().
|
||||
|
||||
$text = implode($lines, " ");
|
||||
$xml = xmlize($text);
|
||||
|
||||
$questions = array();
|
||||
|
||||
process_tf($xml, $questions);
|
||||
process_mc($xml, $questions);
|
||||
process_fib($xml, $questions);
|
||||
process_matching($xml, $questions);
|
||||
|
||||
return $questions;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Process True / False Questions
|
||||
//----------------------------------------
|
||||
function process_tf($xml, &$questions) {
|
||||
|
||||
$tfquestions = $xml["POOL"]["#"]["QUESTION_TRUEFALSE"];
|
||||
|
||||
for ($i = 0; $i < sizeof ($tfquestions); $i++) {
|
||||
|
||||
$question = NULL;
|
||||
|
||||
$question->qtype = TRUEFALSE;
|
||||
$question->defaultgrade = 1;
|
||||
$question->single = 1; // Only one answer is allowed
|
||||
$question->image = ""; // No images with this format
|
||||
|
||||
$thisquestion = $tfquestions[$i];
|
||||
// put questiontext in question object
|
||||
$question->questiontext = addslashes(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
|
||||
// put name in question object
|
||||
$question->name = $question->questiontext;
|
||||
|
||||
$choices = $thisquestion["#"]["ANSWER"];
|
||||
|
||||
$correct_answer = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"][0]["@"]["answer_id"];
|
||||
|
||||
// first choice is true, second is false.
|
||||
$id = $choices[0]["@"]["id"];
|
||||
|
||||
if (strcmp($id, $correct_answer) == 0) { // true is correct
|
||||
$question->answer = 1;
|
||||
$question->feedbacktrue = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
|
||||
$question->feedbackfalse = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
|
||||
} else { // false is correct
|
||||
$question->answer = 0;
|
||||
$question->feedbacktrue = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
|
||||
$question->feedbackfalse = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
|
||||
}
|
||||
$questions[] = $question;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Process Multiple Choice Questions
|
||||
//----------------------------------------
|
||||
function process_mc($xml, &$questions) {
|
||||
|
||||
$mcquestions = $xml["POOL"]["#"]["QUESTION_MULTIPLECHOICE"];
|
||||
|
||||
for ($i = 0; $i < sizeof ($mcquestions); $i++) {
|
||||
|
||||
$question = NULL;
|
||||
|
||||
$question->qtype = MULTICHOICE;
|
||||
$question->defaultgrade = 1;
|
||||
$question->single = 1; // Only one answer is allowed
|
||||
$question->image = ""; // No images with this format
|
||||
|
||||
$thisquestion = $mcquestions[$i];
|
||||
// put questiontext in question object
|
||||
$question->questiontext = addslashes(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
|
||||
// put name of question in question object
|
||||
$question->name = $question->questiontext;
|
||||
|
||||
$choices = $thisquestion["#"]["ANSWER"];
|
||||
for ($j = 0; $j < sizeof ($choices); $j++) {
|
||||
|
||||
$choice = trim($choices[$j]["#"]["TEXT"][0]["#"]);
|
||||
// put this choice in the question object.
|
||||
$question->answer[$j] = addslashes($choice);
|
||||
|
||||
$id = $choices[$j]["@"]["id"];
|
||||
$correct_answer_id = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"][0]["@"]["answer_id"];
|
||||
// if choice is the answer, give 100%, otherwise give 0%
|
||||
if (strcmp ($id, $correct_answer_id) == 0) {
|
||||
$question->fraction[$j] = 1;
|
||||
$question->feedback[$j] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
|
||||
} else {
|
||||
$question->fraction[$j] = 0;
|
||||
$question->feedback[$j] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
|
||||
}
|
||||
}
|
||||
$questions[] = $question;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Process Fill in the Blank Questions
|
||||
//----------------------------------------
|
||||
function process_fib($xml, &$questions) {
|
||||
|
||||
$fibquestions = $xml["POOL"]["#"]["QUESTION_FILLINBLANK"];
|
||||
for ($i = 0; $i < sizeof ($fibquestions); $i++) {
|
||||
|
||||
$question = NULL;
|
||||
|
||||
$question->qtype = SHORTANSWER;
|
||||
$question->defaultgrade = 1;
|
||||
$question->usecase = 0; // Ignore case
|
||||
$question->image = ""; // No images with this format
|
||||
|
||||
$thisquestion = $fibquestions[$i];
|
||||
// put questiontext in question object
|
||||
$question->questiontext = addslashes(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
|
||||
// put name of question in question object
|
||||
$question->name = $question->questiontext;
|
||||
|
||||
$answer = trim($thisquestion["#"]["ANSWER"][0]["#"]["TEXT"][0]["#"]);
|
||||
|
||||
$question->answer[] = addslashes($answer);
|
||||
$question->fraction[] = 1;
|
||||
$question->feedback[0] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_CORRECT"][0]["#"]));
|
||||
$question->feedback[1] = addslashes(trim($thisquestion["#"]["GRADABLE"][0]["#"]["FEEDBACK_WHEN_INCORRECT"][0]["#"]));
|
||||
|
||||
$questions[] = $question;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Process Matching Questions
|
||||
//----------------------------------------
|
||||
function process_matching($xml, &$questions) {
|
||||
|
||||
$matchquestions = $xml["POOL"]["#"]["QUESTION_MATCH"];
|
||||
for ($i = 0; $i < sizeof ($matchquestions); $i++) {
|
||||
|
||||
$question = NULL;
|
||||
|
||||
$question->qtype = MATCH;
|
||||
$question->defaultgrade = 1;
|
||||
$question->image = ""; // No images with this format
|
||||
|
||||
$thisquestion = $matchquestions[$i];
|
||||
// put questiontext in question object
|
||||
$question->questiontext = addslashes(trim($thisquestion["#"]["BODY"][0]["#"]["TEXT"][0]["#"]));
|
||||
// put name of question in question object
|
||||
$question->name = $question->questiontext;
|
||||
|
||||
$choices = $thisquestion["#"]["CHOICE"];
|
||||
for ($j = 0; $j < sizeof ($choices); $j++) {
|
||||
|
||||
$subquestion = NULL;
|
||||
|
||||
$choice = $choices[$j]["#"]["TEXT"][0]["#"];
|
||||
$choice_id = $choices[$j]["@"]["id"];
|
||||
|
||||
$question->subanswers[] = addslashes(trim($choice));
|
||||
|
||||
$correctanswers = $thisquestion["#"]["GRADABLE"][0]["#"]["CORRECTANSWER"];
|
||||
for ($k = 0; $k < sizeof ($correctanswers); $k++) {
|
||||
|
||||
if (strcmp($choice_id, $correctanswers[$k]["@"]["choice_id"]) == 0) {
|
||||
|
||||
$answer_id = $correctanswers[$k]["@"]["answer_id"];
|
||||
|
||||
$answers = $thisquestion["#"]["ANSWER"];
|
||||
for ($m = 0; $m < sizeof ($answers); $m++) {
|
||||
|
||||
$answer = $answers[$m];
|
||||
$current_ans_id = $answer["@"]["id"];
|
||||
if (strcmp ($current_ans_id, $answer_id) == 0) {
|
||||
|
||||
$answer = $answer["#"]["TEXT"][0]["#"];
|
||||
$question->subquestions[] = addslashes(trim($answer));
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$questions[] = $question;
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -1,504 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
////////////////////////////////////////////////////////////////////
|
||||
/// Class for importing course test manager questions. //
|
||||
/// //
|
||||
/// //
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Included by ../import.php
|
||||
class quiz_file_format {
|
||||
function importpreprocess($category) {
|
||||
$this->category = $category; // Important
|
||||
return true;
|
||||
}
|
||||
function importprocess($filename) {
|
||||
global $CFG,$QUIZ_FILE_FORMAT,$strimportquestions,$form,$question_category,$category,$course,$THEME,
|
||||
$hostname, $mdapath, $mdbpath;
|
||||
if ((PHP_OS == "Linux") and isset($hostname)) {
|
||||
$hostname = trim($hostname);
|
||||
// test the ODBC socket server connection
|
||||
// if failure, unset hostname and set hostname_access_error
|
||||
$question_categories = $this->getquestioncategories($mdbpath, $mdapath, $hostname);
|
||||
if (!$question_categories) {
|
||||
$hostname_access_error = $hostname . " ";
|
||||
unset($hostname);
|
||||
} else {
|
||||
$hostname_access_error = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((PHP_OS == "Linux") and !isset($hostname)) {
|
||||
// copy the file to a semi-permanent location
|
||||
if (! $basedir = make_upload_directory("$course->id")) {
|
||||
error("The site administrator needs to fix the file permissions for the data directory");
|
||||
}
|
||||
if (!isset($hostname_access_error)) {
|
||||
$bname=basename($filename);
|
||||
$cleanfilename = clean_filename($bname);
|
||||
if ($cleanfilename) {
|
||||
$newfile = "$basedir/$cleanfilename";
|
||||
if (move_uploaded_file($filename, $newfile)) {
|
||||
chmod($newfile, 0666);
|
||||
} else {
|
||||
notify(get_string("uploadproblem", "", $filename));
|
||||
}
|
||||
}
|
||||
$filename = $newfile;
|
||||
}
|
||||
print_heading_with_help($strimportquestions, "import", "quiz");
|
||||
print_simple_box_start("center", "", "$THEME->cellheading");
|
||||
if ($hostname_access_error) { notify("couldn't connect to ODBC Socket Server on " . $hostname_access_error); }
|
||||
echo "<form method=\"post\" action=\"import.php\">";
|
||||
echo "<table cellpadding=5>";
|
||||
|
||||
echo "<tr><td align=right>";
|
||||
echo "What is the hostname or IP address of the ODBC Socket Server:</td><td>";
|
||||
echo " <input name=\"hostname\" type=\"text\" size=\"50\" value=\"".stripslashes($hostname_access_error)."\">";
|
||||
echo " <input name=\"filename\" type=\"hidden\" value=\"".$filename."\">";
|
||||
echo " <input name=\"category\" type=\"hidden\" value=\"".$category->id."\">";
|
||||
echo " <input name=\"format\" type=\"hidden\" value=\"".$form->format."\">";
|
||||
echo "</td><td> </td></tr>";
|
||||
echo "<tr><td align=right>";
|
||||
echo "What is the location of the database (.mdb file) on the Socket Server:</td><td>";
|
||||
echo " <input name=\"mdbpath\" type=\"text\" size=\"50\" value=\"".stripslashes($mdbpath)."\">";
|
||||
echo "</td><td> </td></tr>";
|
||||
echo "<tr><td align=right>";
|
||||
echo "What is the location of the system database (System.mda file) on the Socket Server:</td><td>";
|
||||
echo " <input name=\"mdapath\" type=\"text\" size=\"50\" value=\"".stripslashes($mdapath)."\">";
|
||||
echo "</td><td> </td></tr>";
|
||||
echo "<tr><td> </td><td>";
|
||||
echo " <input type=submit name=save value=\"Connect to Server\">";
|
||||
echo "</td></tr>";
|
||||
echo "</table>";
|
||||
echo "</form>";
|
||||
print_simple_box_end();
|
||||
print_footer($course);
|
||||
exit;
|
||||
}
|
||||
|
||||
// we get here if running windows or after connect to ODBC socket server on linux
|
||||
//
|
||||
// this generates the page to choose categories of questions to import
|
||||
//
|
||||
if (!isset($question_category)) {
|
||||
|
||||
if (PHP_OS == "WINNT") {
|
||||
// copy the file to a semi-permanent location
|
||||
if (! $basedir = make_upload_directory("$course->id")) {
|
||||
error("The site administrator needs to fix the file permissions for the data directory");
|
||||
}
|
||||
$bname=basename($filename);
|
||||
$cleanfilename = clean_filename($bname);
|
||||
if ($cleanfilename) {
|
||||
$newfile = "$basedir/$cleanfilename";
|
||||
if (move_uploaded_file($filename, $newfile)) {
|
||||
chmod($newfile, 0666);
|
||||
} else {
|
||||
notify(get_string("uploadproblem", "", $filename));
|
||||
}
|
||||
}
|
||||
$filename = $newfile;
|
||||
}
|
||||
// end of file copy
|
||||
|
||||
// don't have to do this on linux, since it's alreay been done in the test above
|
||||
if (PHP_OS == "WINNT") { $question_categories = $this->getquestioncategories($filename); }
|
||||
// print the intermediary form
|
||||
if (!$categories = quiz_get_category_menu($course->id, true)) {
|
||||
error("No categories!");
|
||||
}
|
||||
print_heading_with_help($strimportquestions, "import", "quiz");
|
||||
print_simple_box_start("center", "", "$THEME->cellheading");
|
||||
echo "<form method=\"post\" action=\"import.php\">";
|
||||
echo "<table cellpadding=5>";
|
||||
echo "<tr><td align=right>";
|
||||
echo "Choose a category of questions to import:</td><td>";
|
||||
asort($question_categories);
|
||||
choose_from_menu($question_categories, "question_category","All Categories","All Categories", "", "allcategories");
|
||||
echo " <input name=\"filename\" type=\"hidden\" value=\"".$filename."\">";
|
||||
echo " <input name=\"category\" type=\"hidden\" value=\"".$category->id."\">";
|
||||
echo " <input name=\"format\" type=\"hidden\" value=\"".$form->format."\">";
|
||||
if (PHP_OS == "Linux") {
|
||||
echo " <input name=\"hostname\" type=\"hidden\" value=\"".stripslashes(trim($hostname))."\">";
|
||||
echo " <input name=\"mdbpath\" type=\"hidden\" value=\"".stripslashes($mdbpath)."\">";
|
||||
echo " <input name=\"mdapath\" type=\"hidden\" value=\"".stripslashes($mdapath)."\">";
|
||||
}
|
||||
echo "</td><td> </td>";
|
||||
echo "</tr><tr><td> </td><td>";
|
||||
echo " <input type=submit name=save value=\"Import Questions\">";
|
||||
echo "</td></tr>";
|
||||
echo "</table>";
|
||||
echo "</form>";
|
||||
print_simple_box_end();
|
||||
print_footer($course);
|
||||
exit;
|
||||
}
|
||||
//
|
||||
// this is the main import section
|
||||
//
|
||||
notify("Importing questions");
|
||||
if (PHP_OS == "Linux") {
|
||||
$hostname = trim($hostname);
|
||||
$records = $this->getquestions($mdbpath,$question_category,$mdapath, $hostname);
|
||||
} else {
|
||||
$records = $this->getquestions($filename,$question_category);
|
||||
}
|
||||
foreach ($records as $qrec)
|
||||
{
|
||||
$question = NULL;
|
||||
$question->image = ""; // No images with this format
|
||||
if ($qrec[9] != "") {
|
||||
$question->image = $qrec[9];
|
||||
}
|
||||
$question->defaultgrade = 1;
|
||||
// 0 Selected
|
||||
// 1 PracticeTestOK?
|
||||
// 2 QuestionText
|
||||
// 3 QuestionType
|
||||
// 4 Option1Text
|
||||
// 5 Option2Text
|
||||
// 6 Option3Text
|
||||
// 7 Option4Text
|
||||
// 8 CorrectAnswer
|
||||
// 9 Graphic
|
||||
// 10 Module
|
||||
// 11 ChapterNumber
|
||||
// 12 PageNumber
|
||||
$ref = "Answer can be found in chapter ". $qrec[11] . ", page " . $qrec[12] . ".";
|
||||
switch ($qrec[3]) {
|
||||
case 1:
|
||||
$question->qtype = MULTICHOICE; // MULTICHOICE, SHORTANSWER, TRUEFALSE
|
||||
// echo "<pre>";echo htmlspecialchars($qrec[2]); echo "</pre>";
|
||||
$question->questiontext = addslashes(trim($qrec[2]));
|
||||
// echo "<pre>";echo $question->questiontext; echo "</pre>";
|
||||
$question->name = preg_replace("/<br>/", "", $question->questiontext);
|
||||
$question->single = 1; // Only one answer is allowed -- used for multiple choicers
|
||||
$fractionset = 0;
|
||||
for ($i=4;$i<=7;$i++) {
|
||||
if ($qrec[$i] != "") {
|
||||
$question->answer[$i-3]=addslashes($qrec[$i]);
|
||||
if ($qrec[8] == $i-3) { // if this is the index of CorrectAnswer
|
||||
$question->fraction[$i-3] = 1;
|
||||
$fractionset = 1;
|
||||
} else {
|
||||
$question->fraction[$i-3] = 0;
|
||||
}
|
||||
$question->feedback[$i-3] = (($qrec[8] == $i-3)?"Correct. ":"Incorrect. ") . $ref;
|
||||
}
|
||||
}
|
||||
if ($fractionset == 0) { $question->fraction[1] = 1; }
|
||||
break;
|
||||
case 2: // TRUE FALSE
|
||||
$question->qtype = TRUEFALSE;
|
||||
$question->questiontext = addslashes(trim($qrec[2]));
|
||||
$question->name = preg_replace("/<br>/", "", $question->questiontext);
|
||||
// for TF, $question->answer should be 1 for true, 0 for false
|
||||
if ($qrec[8] == "T") { $question->answer =1;} else { $question->answer = 0; }
|
||||
// for TF, use $question->feedbacktrue and feedbackfalse
|
||||
$question->feedbacktrue = (($qrec[8] =="T")?"Correct. ":"Incorrect. ") . $ref;
|
||||
$question->feedbackfalse = (($qrec[8] =="F")?"Correct. ":"Incorrect. ") . $ref;
|
||||
break;
|
||||
case 3:
|
||||
$question->qtype = SHORTANSWER;
|
||||
$question->questiontext = addslashes(trim($qrec[2]));
|
||||
// echo "<pre>";echo $question->questiontext; echo "</pre>";
|
||||
$question->name = preg_replace("/<br>/", "", $question->questiontext);
|
||||
$question->usecase=0; // Ignore case -- for SHORT ANSWER questions
|
||||
$answers = explode("~", $qrec[8]);
|
||||
$question->answer[0]=" ";
|
||||
$question->fraction[0]=1;
|
||||
for ($i=0;$i<count($answers);$i++) {
|
||||
$question->answer[$i] = addslashes(trim($answers[$i]));
|
||||
$question->feedback[$i] = $ref;
|
||||
$question->fraction[$i] = 1; // 1 for 100%, 0 for none or somewhere in between
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
$question = 0;
|
||||
notify("Cannot use essay questions - skipping question ". $qrec[2] . " " . $ref);
|
||||
break;
|
||||
default:
|
||||
$question = 0;
|
||||
notify("Misformatted Record. Question Skipped.");
|
||||
break;
|
||||
}
|
||||
if ($question) { $questions[] = $question; }
|
||||
}
|
||||
$count = 0;
|
||||
// process all the questions
|
||||
if (PHP_OS == "WINNT") {
|
||||
$filename = str_replace("\\\\","\\",$filename);
|
||||
$filename = str_replace("/","\\",$filename);
|
||||
}
|
||||
foreach ($questions as $question) { // Process and store each question
|
||||
$count++;
|
||||
echo "<hr><p><b>$count</b>. ".stripslashes($question->questiontext)."</p>";
|
||||
$question->category = $this->category->id;
|
||||
$question->stamp = make_unique_id_code(); // Set the unique code (not to be changed)
|
||||
$question->version = 1; // Original version of this question
|
||||
if (!$question->id = insert_record("quiz_questions", $question)) {
|
||||
error("Could not insert new question!");
|
||||
}
|
||||
$this->questionids[] = $question->id;
|
||||
// Now to save all the answers and type-specific options
|
||||
$result = quiz_save_question_options($question);
|
||||
if (!empty($result->error)) {
|
||||
notify($result->error);
|
||||
$this->deletedatabase($filename);
|
||||
return false;
|
||||
}
|
||||
if (!empty($result->notice)) {
|
||||
notify($result->notice);
|
||||
$this->deletedatabase($filename);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->deletedatabase($filename);
|
||||
return true;
|
||||
}
|
||||
|
||||
function importpostprocess() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function deletedatabase($filename) {
|
||||
if (! $this->fulldelete($filename)) {
|
||||
echo "<BR>Error: Could not delete: $filename";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function getquestions($filename, $category, $mdapath="", $hostname="") {
|
||||
if (($category == "allcategories") or ($category == "")) {
|
||||
$sql = "SELECT * FROM TBQuestions";
|
||||
} else {
|
||||
$sql = "SELECT * FROM TBQuestions where module = '".$category."'";
|
||||
}
|
||||
if (PHP_OS == "WINNT") {
|
||||
$ldb =& $this->connect_win($filename);
|
||||
$qset = $ldb->Execute("$sql");
|
||||
if ( $qset->RecordCount() > 0 ) {
|
||||
$records = $qset->GetAssoc(true);
|
||||
} else {
|
||||
$this->err("There were no records in the database.",$dsn);
|
||||
$ldb->Close();
|
||||
return false;
|
||||
}
|
||||
$ldb->Close();
|
||||
} else { // if PHP_OS == WINNT
|
||||
// we have a linux installation
|
||||
$result = $this->query_linux($sql,$filename, $mdapath,$hostname);
|
||||
if ( count($result) > 0 ) {
|
||||
// get rid of the ID field in the first column.
|
||||
for($i=0;$i<count($result);$i++) {
|
||||
foreach (array_keys($result[$i]) as $j) {
|
||||
$records[$i][$j-1] = $result[$i][$j];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->err("There were no records in the database.",$dsn);
|
||||
$ldb->Close();
|
||||
return false;
|
||||
}
|
||||
// xml test and connect
|
||||
} // PHP_OS TEST
|
||||
return $records;
|
||||
}
|
||||
|
||||
function getquestioncategories($filename, $mdapath="", $hostname="") {
|
||||
global $CFG, $result;
|
||||
$sql = "SELECT Distinct module FROM TBQuestions";
|
||||
if (PHP_OS == "WINNT") {
|
||||
$ldb =& $this->connect_win($filename);
|
||||
$qset = $ldb->Execute("$sql");
|
||||
if ( $qset->RecordCount() > 0 ) {
|
||||
$records = $qset->GetArray(true);
|
||||
foreach ($records as $record) {
|
||||
$categories[$record[0]] = $record[0];
|
||||
}
|
||||
} else { // if recordcount
|
||||
$this->err("There were no records in the database.",$dsn);
|
||||
$ldb->Close();
|
||||
return false;
|
||||
}
|
||||
$ldb->Close();
|
||||
} else { // if PHP_OS == WINNT
|
||||
// we have a linux installation
|
||||
$result = $this->query_linux($sql, $filename, $mdapath, $hostname);
|
||||
for($i=0;$i<count($result);$i++) {
|
||||
$categories[$result[$i][0]] = $result[$i][0];
|
||||
}
|
||||
} // PHP_OS TEST
|
||||
return $categories;
|
||||
}
|
||||
|
||||
function query_linux($sql, $mdbpath, $mdapath, $hostname) {
|
||||
global $result;
|
||||
include_once("odbcsocketserver.class.php");
|
||||
// set up socket server object to connect to remote host
|
||||
$oTest = new ODBCSocketServer;
|
||||
//Set the Hostname, port, and connection string
|
||||
$oTest->sHostName = $hostname;
|
||||
$oTest->nPort = 9628;
|
||||
// $oTest->sConnectionString="DRIVER=Microsoft Access Driver (*.mdb);SystemDB=C:\CTM\System.mda;DBQ=C:\CTM\of2K3\ctm.mdb;UID=Assess;PWD=VBMango;";
|
||||
$oTest->sConnectionString="DRIVER=Microsoft Access Driver (*.mdb);SystemDB=".
|
||||
$mdapath.";DBQ=".$mdbpath.";UID=Assess;PWD=VBMango;";
|
||||
// send and receive XML communication
|
||||
$qResult = $oTest->ExecSQL($sql);
|
||||
// set up XML parser to read the results
|
||||
$xml_parser = xml_parser_create("US-ASCII");
|
||||
xml_set_element_handler($xml_parser, "quiz_xmlstart", "quiz_xmlend");
|
||||
xml_set_character_data_handler($xml_parser, "quiz_xmldata");
|
||||
// parse the XML and get back the result set array
|
||||
if (!xml_parse($xml_parser, $qResult)) {
|
||||
$this->err("XML error: ".xml_error_string(xml_get_error_code($xml_parser))
|
||||
." at line ".xml_get_current_line_number($xml_parser),$oTest->sConnectionString);
|
||||
return false;
|
||||
} else {
|
||||
// echo("Successful XML parse. ");
|
||||
// prepare the array for use in the pull-down
|
||||
/* echo "<br>count of rows is ". count ($result);
|
||||
echo "<pre>\n";
|
||||
$qResult = HtmlSpecialChars($qResult);
|
||||
echo $qResult;
|
||||
echo "\n</pre>";
|
||||
*/
|
||||
xml_parser_free($xml_parser);
|
||||
// $sResult = HtmlSpecialChars($qResult);
|
||||
//echo("<pre>");
|
||||
// echo($sResult);
|
||||
// echo("</pre>");
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
function connect_win($filename) {
|
||||
global $CFG, $systemdb;
|
||||
// first, verify the location of System.mda
|
||||
if (!isset($systemdb)) {
|
||||
$systemdb=$this->findfile("System.mda");
|
||||
}
|
||||
if (! $systemdb) {
|
||||
$this->err("The system database System.mda cannot be found. Check that you've uploaded it to the course.",$dsn);
|
||||
die;
|
||||
}
|
||||
|
||||
$ldb = &ADONewConnection('access');
|
||||
$dsn="DRIVER=Microsoft Access Driver (*.mdb);SystemDB=".$systemdb.";DBQ=".$filename.";UID=Assess;PWD=VBMango;";
|
||||
$dbconnected = $ldb->Connect($dsn);
|
||||
if (! $dbconnected) {
|
||||
$this->err("Moodle could not connect to the database.",$dsn);
|
||||
die;
|
||||
}
|
||||
return $ldb;
|
||||
}
|
||||
|
||||
function err($message, $dsn) {
|
||||
echo "<font color=\"#990000\">";
|
||||
echo "<p>Error: $message</p>";
|
||||
echo "<p>ODBC File DSN: $dsn<br />";
|
||||
echo "</font>";
|
||||
}
|
||||
|
||||
function fulldelete($location) {
|
||||
if (is_dir($location)) {
|
||||
$currdir = opendir($location);
|
||||
while ($file = readdir($currdir)) {
|
||||
if ($file <> ".." && $file <> ".") {
|
||||
$fullfile = $location."/".$file;
|
||||
if (is_dir($fullfile)) {
|
||||
if (!fulldelete($fullfile)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!unlink($fullfile)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($currdir);
|
||||
if (! rmdir($location)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (!unlink($location)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function findfile($filename) {
|
||||
global $CFG;
|
||||
$dirs = $this->getcoursedirs();
|
||||
$dirs[] = $CFG->dirroot."\mod\quiz\format";
|
||||
foreach ($dirs as $dir) {
|
||||
$file = $dir . "\System.mda";
|
||||
// look for System.mda
|
||||
if (is_file($file)) return $file;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getcoursedirs() {
|
||||
global $CFG;
|
||||
// for every course in the system, find the root of the data directory
|
||||
$courses = get_records_sql("select distinct id,fullname from ".$CFG->prefix."course");
|
||||
$dirs = array();
|
||||
if ($courses) {
|
||||
foreach ($courses as $course) {
|
||||
$dir = $CFG->dataroot . "/" . $course->id;
|
||||
if (is_dir($dir)) { $dirs[] = $dir; }
|
||||
}
|
||||
}
|
||||
return $dirs;
|
||||
}
|
||||
|
||||
} // END OF CLASS
|
||||
|
||||
//Handler for starting elements
|
||||
function quiz_xmlstart($parser, $name, $attribs) {
|
||||
global $result,$row, $col, $incolumn;
|
||||
$name = strtolower($name);
|
||||
switch ($name) {
|
||||
case "row":
|
||||
$col=0;break;
|
||||
case "column":
|
||||
$incolumn = 1;break;
|
||||
case "error":
|
||||
break;
|
||||
case "result":
|
||||
$row = 0; break;
|
||||
} // switch
|
||||
}
|
||||
|
||||
//handler for the end of elements
|
||||
function quiz_xmlend($parser, $name) {
|
||||
global $result, $row, $col, $incolumn;
|
||||
$name = strtolower($name);
|
||||
switch ($name) {
|
||||
case "row":
|
||||
$row++;break;
|
||||
case "column":
|
||||
$incolumn = 0;
|
||||
$col++;
|
||||
break;
|
||||
case "error":
|
||||
break;
|
||||
case "result":
|
||||
break;
|
||||
} // switch
|
||||
} // function
|
||||
|
||||
//handler for character data
|
||||
function quiz_xmldata($parser, $data) {
|
||||
global $result, $row, $col, $incolumn;
|
||||
if ($incolumn) { $result[$row][$col] = $result[$row][$col] . $data;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,156 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
/// Modified by Tom Robb 12 June 2003 to include percentage and comment insertion
|
||||
/// facility.
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// MISSING WORD FORMAT
|
||||
///
|
||||
/// This Moodle class provides all functions necessary to import and export
|
||||
/// one-correct-answer multiple choice questions in this format:
|
||||
///
|
||||
/// As soon as we begin to explore our body parts as infants
|
||||
/// we become students of {=anatomy and physiology ~reflexology
|
||||
/// ~science ~experiment}, and in a sense we remain students for life.
|
||||
///
|
||||
/// Each answer is separated with a tilde ~, and the correct answer is
|
||||
/// prefixed with an equals sign =
|
||||
///
|
||||
/// Percentage weights can be included by following the tilde with the
|
||||
/// desired percent. Comments can be included for each choice by following
|
||||
/// the comment with a hash mark ("#") and the comment. Example:
|
||||
///
|
||||
/// This is {=the best answer#comment on the best answer ~75%a good
|
||||
/// answer#comment on the good answer ~a wrong one#comment on the bad answer}
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
function readquestion($lines) {
|
||||
/// Given an array of lines known to define a question in
|
||||
/// this format, this function converts it into a question
|
||||
/// object suitable for processing and insertion into Moodle.
|
||||
|
||||
$question = NULL;
|
||||
///$comment added by T Robb
|
||||
$comment = NULL;
|
||||
$text = implode(" ", $lines);
|
||||
|
||||
/// Find answer section
|
||||
|
||||
$answerstart = strpos($text, "{");
|
||||
if ($answerstart === false) {
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>$text<P>Could not find a {";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$answerfinish = strpos($text, "}");
|
||||
if ($answerfinish === false) {
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>$text<P>Could not find a }";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$answerlength = $answerfinish - $answerstart;
|
||||
$answertext = substr($text, $answerstart + 1, $answerlength - 1);
|
||||
|
||||
/// Save the new question text
|
||||
$question->questiontext = addslashes(substr_replace($text, "_____", $answerstart, $answerlength+1));
|
||||
$question->name = $question->questiontext;
|
||||
|
||||
|
||||
/// Parse the answers
|
||||
$answertext = str_replace("=", "~=", $answertext);
|
||||
$answers = explode("~", $answertext);
|
||||
if (isset($answers[0])) {
|
||||
$answers[0] = trim($answers[0]);
|
||||
}
|
||||
if (empty($answers[0])) {
|
||||
array_shift($answers);
|
||||
}
|
||||
|
||||
$countanswers = count($answers);
|
||||
|
||||
switch ($countanswers) {
|
||||
case 0: // invalid question
|
||||
if ($this->displayerrors) {
|
||||
echo "<P>No answers found in $answertext";
|
||||
}
|
||||
return false;
|
||||
|
||||
case 1:
|
||||
$question->qtype = SHORTANSWER;
|
||||
|
||||
$answer = trim($answers[0]);
|
||||
if ($answer[0] == "=") {
|
||||
$answer = substr($answer, 1);
|
||||
}
|
||||
$question->answer[] = addslashes($answer);
|
||||
$question->fraction[] = 1;
|
||||
$question->feedback[] = "";
|
||||
|
||||
$question->usecase = 0; // Ignore case
|
||||
$question->defaultgrade = 1;
|
||||
$question->image = ""; // No images with this format
|
||||
return $question;
|
||||
|
||||
default:
|
||||
$question->qtype = MULTICHOICE;
|
||||
|
||||
foreach ($answers as $key => $answer) {
|
||||
$answer = trim($answer);
|
||||
|
||||
// Tom's addition starts here
|
||||
$answeight = 0;
|
||||
if (strspn($answer,"1234567890%") > 0){
|
||||
//Make sure that the percent sign is the last in the span
|
||||
if (strpos($answer,"%") == strspn($answer,"1234567890%") - 1) {
|
||||
$answeight0 = substr($answer,0,strspn($answer,"1234567890%"));
|
||||
$answeight = round(($answeight0/100),2);
|
||||
$answer = substr($answer,(strspn($answer,"1234567890%")));
|
||||
}
|
||||
}
|
||||
if ($answer[0] == "="){
|
||||
$answeight = 1;
|
||||
}
|
||||
//remove the protective underscore for leading numbers in answers
|
||||
if ($answer[0] == "_"){
|
||||
$answer = substr($answer, 1);
|
||||
}
|
||||
$answer = trim($answer);
|
||||
|
||||
if (strpos($answer,"#") > 0){
|
||||
$hashpos = strpos($answer,"#");
|
||||
$comment = addslashes(substr(($answer),$hashpos+1));
|
||||
$answer = substr($answer,0,$hashpos);
|
||||
} else {
|
||||
$comment = " ";
|
||||
}
|
||||
// End of Tom's addition
|
||||
|
||||
if ($answer[0] == "=") {
|
||||
# $question->fraction[$key] = 1;
|
||||
$question->fraction[$key] = $answeight;
|
||||
$answer = substr($answer, 1);
|
||||
} else {
|
||||
# $question->fraction[$key] = 0;
|
||||
$question->fraction[$key] = $answeight;
|
||||
}
|
||||
$question->answer[$key] = addslashes($answer);
|
||||
$question->feedback[$key] = $comment;
|
||||
}
|
||||
|
||||
$question->defaultgrade = 1;
|
||||
$question->single = 1; // Only one answer is allowed
|
||||
$question->image = ""; // No images with this format
|
||||
return $question;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,162 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// MULTIANSWER FORMAT
|
||||
///
|
||||
/// Created by Henrik Kaipe
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
// REGULAR EXPRESSION CONSTANTS
|
||||
// I do not know any way to make this easier
|
||||
// Regexes are always awkard when defined but more comprehensible
|
||||
// when used as constants in the executive code
|
||||
|
||||
// ANSWER_ALTERNATIVE regexes
|
||||
|
||||
define("ANSWER_ALTERNATIVE_FRACTION_REGEX",
|
||||
'=|%(-?[0-9]+)%');
|
||||
define("ANSWER_ALTERNATIVE_ANSWER_REGEX",
|
||||
'[^~#}]+');
|
||||
define("ANSWER_ALTERNATIVE_FEEDBACK_REGEX",
|
||||
'[^~}]*');
|
||||
define("ANSWER_ALTERNATIVE_REGEX",
|
||||
'(' . ANSWER_ALTERNATIVE_FRACTION_REGEX .')?'
|
||||
. '(' . ANSWER_ALTERNATIVE_ANSWER_REGEX . ')'
|
||||
. '(#(' . ANSWER_ALTERNATIVE_FEEDBACK_REGEX .'))?');
|
||||
|
||||
// Parenthesis positions for ANSWER_ALTERNATIVE_REGEX
|
||||
define("ANSWER_ALTERNATIVE_REGEX_PERCENTILE_FRACTION", 2);
|
||||
define("ANSWER_ALTERNATIVE_REGEX_FRACTION", 1);
|
||||
define("ANSWER_ALTERNATIVE_REGEX_ANSWER", 3);
|
||||
define("ANSWER_ALTERNATIVE_REGEX_FEEDBACK", 5);
|
||||
|
||||
// NUMBER_FORMATED_ALTERNATIVE_ANSWER_REGEX is used
|
||||
// for identifying numerical answers in ANSWER_ALTERNATIVE_REGEX_ANSWER
|
||||
define("NUMBER_REGEX",
|
||||
'-?(([0-9]+[.,]?[0-9]*|[.,][0-9]+)([eE][-+]?[0-9]+)?)');
|
||||
define("NUMERICAL_ALTERNATIVE_REGEX",
|
||||
'^(' . NUMBER_REGEX . ')(:' . NUMBER_REGEX . ')?$');
|
||||
|
||||
// Parenthesis positions for NUMERICAL_FORMATED_ALTERNATIVE_ANSWER_REGEX
|
||||
define("NUMERICAL_CORRECT_ANSWER", 1);
|
||||
define("NUMERICAL_ABS_ERROR_MARGIN", 6);
|
||||
|
||||
// Remaining ANSWER regexes
|
||||
define("ANSWER_TYPE_DEF_REGEX",
|
||||
'(NUMERICAL|NM)|(MULTICHOICE|MC)|(SHORTANSWER|SA|MW)');
|
||||
define("ANSWER_START_REGEX",
|
||||
'\{([0-9]*):(' . ANSWER_TYPE_DEF_REGEX . '):');
|
||||
|
||||
define("ANSWER_REGEX",
|
||||
ANSWER_START_REGEX
|
||||
. '(' . ANSWER_ALTERNATIVE_REGEX
|
||||
. '(~'
|
||||
. ANSWER_ALTERNATIVE_REGEX
|
||||
. ')*)}' );
|
||||
|
||||
// Parenthesis positions for singulars in ANSWER_REGEX
|
||||
define("ANSWER_REGEX_NORM", 1);
|
||||
define("ANSWER_REGEX_ANSWER_TYPE_NUMERICAL", 3);
|
||||
define("ANSWER_REGEX_ANSWER_TYPE_MULTICHOICE", 4);
|
||||
define("ANSWER_REGEX_ANSWER_TYPE_SHORTANSWER", 5);
|
||||
define("ANSWER_REGEX_ALTERNATIVES", 6);
|
||||
|
||||
|
||||
function extractMultiAnswerQuestion($text) {
|
||||
$question = NULL;
|
||||
$question->qtype= MULTIANSWER;
|
||||
$question->questiontext= $text;
|
||||
$question->answers= array();
|
||||
$question->defaultgrade = 0; // Will be increased for each answer norm
|
||||
|
||||
for ($positionkey=1
|
||||
; ereg(ANSWER_REGEX, $question->questiontext, $answerregs)
|
||||
; ++$positionkey )
|
||||
{
|
||||
unset($multianswer);
|
||||
|
||||
$multianswer->positionkey = $positionkey;
|
||||
$multianswer->norm = $answerregs[ANSWER_REGEX_NORM]
|
||||
or $multianswer->norm = '1';
|
||||
if ($answerregs[ANSWER_REGEX_ANSWER_TYPE_NUMERICAL]) {
|
||||
$multianswer->answertype = NUMERICAL;
|
||||
} else if($answerregs[ANSWER_REGEX_ANSWER_TYPE_SHORTANSWER]) {
|
||||
$multianswer->answertype = SHORTANSWER;
|
||||
} else if($answerregs[ANSWER_REGEX_ANSWER_TYPE_MULTICHOICE]){
|
||||
$multianswer->answertype = MULTICHOICE;
|
||||
} else {
|
||||
error("Cannot identify answertype $answerregs[2]");
|
||||
return false;
|
||||
}
|
||||
|
||||
$multianswer->alternatives= array();
|
||||
$remainingalts = $answerregs[ANSWER_REGEX_ALTERNATIVES];
|
||||
while (ereg(ANSWER_ALTERNATIVE_REGEX, $remainingalts, $altregs)) {
|
||||
unset($alternative);
|
||||
|
||||
if ('=' == $altregs[ANSWER_ALTERNATIVE_REGEX_FRACTION]) {
|
||||
$alternative->fraction = '1';
|
||||
} else {
|
||||
$alternative->fraction = .01 *
|
||||
$altregs[ANSWER_ALTERNATIVE_REGEX_PERCENTILE_FRACTION]
|
||||
or $alternative->fraction = '0';
|
||||
}
|
||||
$alternative->feedback = $altregs[ANSWER_ALTERNATIVE_REGEX_FEEDBACK];
|
||||
if ($answerregs[ANSWER_REGEX_ANSWER_TYPE_NUMERICAL]
|
||||
&& ereg(NUMERICAL_ALTERNATIVE_REGEX,
|
||||
$altregs[ANSWER_ALTERNATIVE_REGEX_ANSWER],
|
||||
$numregs) )
|
||||
{
|
||||
$alternative->answer = $numregs[NUMERICAL_CORRECT_ANSWER];
|
||||
if ($numregs[NUMERICAL_ABS_ERROR_MARGIN]) {
|
||||
$alternative->min = $numregs[NUMERICAL_CORRECT_ANSWER]
|
||||
- $numregs[NUMERICAL_ABS_ERROR_MARGIN];
|
||||
$alternative->max = $numregs[NUMERICAL_CORRECT_ANSWER]
|
||||
+ $numregs[NUMERICAL_ABS_ERROR_MARGIN];
|
||||
} else {
|
||||
$alternative->min = $numregs[NUMERICAL_CORRECT_ANSWER];
|
||||
$alternative->max = $numregs[NUMERICAL_CORRECT_ANSWER];
|
||||
}
|
||||
} else { // Min and max must stay undefined...
|
||||
$alternative->answer =
|
||||
$altregs[ANSWER_ALTERNATIVE_REGEX_ANSWER];
|
||||
}
|
||||
|
||||
$multianswer->alternatives[] = $alternative;
|
||||
$tmp = explode($altregs[0], $remainingalts, 2);
|
||||
$remainingalts = $tmp[1];
|
||||
}
|
||||
|
||||
$question->defaultgrade += $multianswer->norm;
|
||||
$question->answers[] = $multianswer;
|
||||
$question->questiontext = implode("{#$positionkey}",
|
||||
explode($answerregs[0], $question->questiontext, 2));
|
||||
}
|
||||
return $question;
|
||||
}
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
function readquestions($lines) {
|
||||
/// Parses an array of lines into an array of questions.
|
||||
/// For this class the method has been simplified as
|
||||
/// there can never be more than one question for a
|
||||
/// multianswer import
|
||||
|
||||
$questions= array();
|
||||
$thequestion= extractMultiAnswerQuestion(implode('',$lines));
|
||||
|
||||
if (!empty($thequestion)) {
|
||||
$thequestion->name = $lines[0];
|
||||
|
||||
$questions[] = $thequestion;
|
||||
}
|
||||
|
||||
return $questions;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,15 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// IMS QTI FORMAT
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,15 +0,0 @@
|
|||
<?PHP // $Id$
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
/// WEBCT FORMAT
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Based on default.php, included by ../import.php
|
||||
|
||||
class quiz_file_format extends quiz_default_format {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
Loading…
Add table
Add a link
Reference in a new issue