From: kaipe Date: Fri, 1 Aug 2003 08:37:11 +0000 (+0000) Subject: New question type - multianswer X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=8b439f8c164c15d39c3fa1bec029b616df5281dc;p=moodle.git New question type - multianswer --- diff --git a/mod/quiz/attempt.php b/mod/quiz/attempt.php index c16c8818ef..326cb5ee75 100644 --- a/mod/quiz/attempt.php +++ b/mod/quiz/attempt.php @@ -105,6 +105,9 @@ } else if (ereg('^q([0-9]+)r([0-9]+)$', $key, $keyregs)) { // Random-style answers $questions[$keyregs[1]]->answer[] = "$keyregs[2]-$value"; + } else if (ereg('^q([0-9]+)ma([0-9]+)$', $key, $keyregs)) { // Multi-answer questions + $questions[$keyregs[1]]->answer[] = "$keyregs[2]-$value"; + } else if ('shuffleorder' == $key) { $shuffleorder = explode(",", $value); // Actual order questions were given in diff --git a/mod/quiz/db/mysql.php b/mod/quiz/db/mysql.php index f75ca85afe..1b90cf4de6 100644 --- a/mod/quiz/db/mysql.php +++ b/mod/quiz/db/mysql.php @@ -92,7 +92,7 @@ function quiz_upgrade($oldversion) { table_column("quiz", "", "shuffleanswers", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "shufflequestions"); } - if ($oldversion < 2003071001) { + if ($oldversion < 2003071001) { modify_database ("", " CREATE TABLE `prefix_quiz_numerical` ( `id` int(10) unsigned NOT NULL auto_increment, @@ -105,10 +105,23 @@ function quiz_upgrade($oldversion) { ) TYPE=MyISAM COMMENT='Options for numerical questions'; "); } - if ($oldversion < 2003072400) { + if ($oldversion < 2003072400) { execute_sql(" INSERT INTO {$CFG->prefix}log_display VALUES ('quiz', 'review', 'quiz', 'name') "); } + if ($oldversion < 2003072901) { + modify_database ("", " CREATE TABLE `prefix_quiz_multianswers` ( + `id` int(10) unsigned NOT NULL auto_increment, + `question` int(10) unsigned NOT NULL default '0', + `answers` varchar(255) NOT NULL default '', + `positionkey` varchar(255) NOT NULL default '', + `answertype` smallint(6) NOT NULL default '0', + `norm` int(10) unsigned NOT NULL default '1', + PRIMARY KEY (`id`), + KEY `question` (`question`) + ) TYPE=MyISAM COMMENT='Options for multianswer questions'; "); + } + return true; } diff --git a/mod/quiz/db/mysql.sql b/mod/quiz/db/mysql.sql index c35d63fcfb..4ebbb36e56 100644 --- a/mod/quiz/db/mysql.sql +++ b/mod/quiz/db/mysql.sql @@ -243,7 +243,23 @@ CREATE TABLE `prefix_quiz_truefalse` ( PRIMARY KEY (`id`), KEY `question` (`question`) ) TYPE=MyISAM COMMENT='Options for True-False questions'; +# -------------------------------------------------------- +# +# Table structure for table `quiz_multianswers` +# + +CREATE TABLE `prefix_quiz_multianswers` ( + `id` int(10) unsigned NOT NULL auto_increment, + `question` int(10) unsigned NOT NULL default '0', + `answers` varchar(255) NOT NULL default '', + `positionkey` varchar(255) NOT NULL default '', + `answertype` smallint(6) NOT NULL default '0', + `norm` int(10) unsigned NOT NULL default '1', + PRIMARY KEY (`id`), + KEY `question` (`question`) +) TYPE=MyISAM COMMENT='Options for multianswer questions' +# -------------------------------------------------------- INSERT INTO prefix_log_display VALUES ('quiz', 'view', 'quiz', 'name'); INSERT INTO prefix_log_display VALUES ('quiz', 'report', 'quiz', 'name'); diff --git a/mod/quiz/editmultianswer.php b/mod/quiz/editmultianswer.php new file mode 100644 index 0000000000..da16220c8e --- /dev/null +++ b/mod/quiz/editmultianswer.php @@ -0,0 +1 @@ +category)) { error("This question doesn't belong to a valid category!"); } if (! $course = get_record("course", "id", $category->course)) { error("This question category doesn't belong to a valid course!"); } require_login($course->id); if (!isteacher($course->id)) { error("You can't modify these questions!"); } $question = extractMultiAnswerQuestion($form->questiontext); $question->id = $form->id; $question->qtype = $form->qtype; $question->name = $form->name; $question->category = $form->category; if (empty($form->image)) { $question->image = ""; } else { $question->image = $form->image; } // Formcheck $err = array(); if (empty($question->name)) { $err["name"] = get_string("missingname", "quiz"); } if (empty($question->questiontext)) { $err["questiontext"] = get_string("missingquestiontext", "quiz"); } if ($err) { // Formcheck failed $category = $form->category; notify(get_string("someerrorswerefound")); unset($_POST); require('question.php'); exit; } else { if (!empty($question->id)) { // Question already exists if (!update_record("quiz_questions", $question)) { error("Could not update question!"); } } else { // Question is a new one if (!$question->id = insert_record("quiz_questions", $question)) { error("Could not insert new question!"); } } // Now to save all the answers and type-specific options $result = quiz_save_question_options($question); if (!empty($result->error)) { error($result->error); } if (!empty($result->notice)) { notice_yesno($result->notice, "question.php?id=$question->id", "edit.php"); print_footer($course); exit; } redirect("edit.php"); } } else if ($question->questiontext and $question->id) { $answers = quiz_get_answers($question); foreach ($answers as $multianswer) { $parsableanswerdef = '{' . $multianswer->norm . ':'; switch ($multianswer->answertype) { case MULTICHOICE: $parsableanswerdef .= 'MULTICHOICE:'; break; case SHORTANSWER: $parsableanswerdef .= 'SHORTANSWER:'; break; case NUMERICAL: $parsableanswerdef .= 'NUMERICAL:'; break; default: error("answertype $multianswer->answertype not recognized"); } $separator= ''; foreach ($multianswer->subanswers as $subanswer) { $parsableanswerdef .= $separator . '%' . round(100*$subanswer->fraction) . '%'; $parsableanswerdef .= $subanswer->answer; if ($subanswer->min || $subanswer->max) { // Special for numerical answers: $errormargin = $subanswer->answer - $subanswer->min; $parsableanswerdef .= ":$errormargin"; } if ($subanswer->feedback) { $parsableanswerdef .= "#$subanswer->feedback"; } $separator = '~'; } $parsableanswerdef .= '}'; $question->questiontext = str_replace ("{#$multianswer->positionkey}", $parsableanswerdef, $question->questiontext); } } ?>
action="editmultianswer.php">

:

category", ""); ?>

:

:

"; } print_textarea($usehtmleditor, 15, 60, 630, 300, "questiontext", $question->questiontext); if ($usehtmleditor) { helpbutton("richtext", get_string("helprichtext"), "moodle"); } else { helpbutton("text", get_string("helptext"), "moodle"); } ?>

:

image", get_string("none"),"",""); } ?>
">
\ No newline at end of file diff --git a/mod/quiz/format/multianswer.php b/mod/quiz/format/multianswer.php new file mode 100644 index 0000000000..de161ea8f6 --- /dev/null +++ b/mod/quiz/format/multianswer.php @@ -0,0 +1,162 @@ +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; + } +} + +?> diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index fc6a41b681..5064001b03 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -21,6 +21,7 @@ define("MATCH", "5"); define("RANDOMSAMATCH", "6"); define("DESCRIPTION", "7"); define("NUMERICAL", "8"); +define("MULTIANSWER", "9"); $QUIZ_QUESTION_TYPE = array ( MULTICHOICE => get_string("multichoice", "quiz"), TRUEFALSE => get_string("truefalse", "quiz"), @@ -29,13 +30,15 @@ $QUIZ_QUESTION_TYPE = array ( MULTICHOICE => get_string("multichoice", "quiz") MATCH => get_string("match", "quiz"), DESCRIPTION => get_string("description", "quiz"), RANDOM => get_string("random", "quiz"), - RANDOMSAMATCH => get_string("randomsamatch", "quiz") + RANDOMSAMATCH => get_string("randomsamatch", "quiz"), + MULTIANSWER => get_string("multianswer", "quiz") ); $QUIZ_FILE_FORMAT = array ( "custom" => get_string("custom", "quiz"), "missingword" => get_string("missingword", "quiz"), "blackboard" => get_string("blackboard", "quiz"), - "aon" => "AON" + "aon" => "AON", + "multianswer" => get_string("multianswer", "quiz") ); define("QUIZ_PICTURE_MAX_HEIGHT", "600"); // Not currently implemented @@ -258,17 +261,24 @@ function quiz_get_grade_records($quiz) { AND qg.userid = u.id"); } -function quiz_get_answers($question) { +function quiz_get_answers($question, $answerids=NULL) { // Given a question, returns the correct answers for a given question global $CFG; + if (empty($answerids)) { + $answeridconstraint = ''; + } else { + $answeridconstraint = " AND a.id IN ($answerids) "; + } + switch ($question->qtype) { case SHORTANSWER: // Could be multiple answers return get_records_sql("SELECT a.*, sa.usecase FROM {$CFG->prefix}quiz_shortanswer sa, {$CFG->prefix}quiz_answers a WHERE sa.question = '$question->id' - AND sa.question = a.question "); + AND sa.question = a.question " + . $answeridconstraint); case TRUEFALSE: // Should be always two answers return get_records("quiz_answers", "question", $question->id); @@ -278,7 +288,8 @@ function quiz_get_answers($question) { FROM {$CFG->prefix}quiz_multichoice mc, {$CFG->prefix}quiz_answers a WHERE mc.question = '$question->id' - AND mc.question = a.question "); + AND mc.question = a.question " + . $answeridconstraint); case MATCH: return get_records("quiz_match_sub", "question", $question->id); @@ -296,7 +307,8 @@ function quiz_get_answers($question) { FROM {$CFG->prefix}quiz_numerical n, {$CFG->prefix}quiz_answers a WHERE a.question = '$question->id' - AND n.answer = a.id "); + AND n.answer = a.id " + . $answeridconstraint); case DESCRIPTION: return true; // there are no answers for description @@ -305,6 +317,21 @@ function quiz_get_answers($question) { return quiz_get_answers (get_record('quiz_questions', 'id', $question->random)); + case MULTIANSWER: // Includes subanswers + $multianswers = get_records('quiz_multianswers', + 'question', $question->id); + $virtualquestion->id = $question->id; + + $answers = array(); + foreach ($multianswers as $multianswer) { + $virtualquestion->qtype = $multianswer->answertype; + // Recursive call for subanswers + $multianswer->subanswers = quiz_get_answers + ($virtualquestion, $multianswer->answers); + $answers[] = $multianswer; + } + return $answers; + default: return false; } @@ -317,7 +344,7 @@ function quiz_get_attempt_responses($attempt, $quiz) { // for regrading using quiz_grade_attempt_results() global $CFG; - if (!$responses = get_records_sql("SELECT q.id, q.qtype, q.category, q.questiontext, r.answer + if (!$responses = get_records_sql("SELECT q.id, q.qtype, q.category, q.questiontext, q.defaultgrade, r.answer FROM {$CFG->prefix}quiz_responses r, {$CFG->prefix}quiz_questions q WHERE r.attempt = '$attempt->id' @@ -398,6 +425,9 @@ function quiz_print_question_icon($question, $editlink=true) { case NUMERICAL: echo ''; break; + case MULTIANSWER: + echo ''; + break; } if ($editlink) { echo "\n"; @@ -727,6 +757,73 @@ function quiz_print_question($number, $question, $grade, $courseid, echo ""; break; + case MULTIANSWER: + // For this question type, we better print the image on top: + if ($question->image) { + print_file_picture($question->image, $question->course); + } + + $qtextremaining = text_to_html($question->questiontext); + // The regex will recognize text snippets of type {#X} where the X can be any text not containg } or white-space characters. + while (ereg('\{#([^[:space:]}]*)}', $qtextremaining, $regs)) { + + $qtextsplits = explode($regs[0], $qtextremaining, 2); + echo $qtextsplits[0]; + $qtextremaining = $qtextsplits[1]; + + $multianswer = get_record('quiz_multianswers', + 'question', $question->id, + 'positionkey', $regs[1]); + + $inputname= " name=\"q{$realquestion->id}ma$multianswer->id\" "; + + if (!empty($response) + && $responseitems = explode('-', array_shift($response), 2)) + { + $responsefractiongrade = (float)$responseitems[0]; + $actualresponse = $responseitems[1]; + + if (1.0 == $responsefractiongrade) { + $style = '"background-color:lime"'; + } else if (0.0 < $responsefractiongrade) { + $style = '"background-color:yellow"'; + } else { // The response must have been totally wrong: + $style = '"background-color:red"'; + } + } else { + $responsefractiongrade = 0.0; + $actualresponse = ''; + $style = '"background-color:white"'; + } + + switch ($multianswer->answertype) { + case SHORTANSWER: + case NUMERICAL: + echo " "; + break; + case MULTICHOICE: + echo (" "); + break; + default: + error("Unable to recognized answertype $answer->answertype"); + break; + } + } + // Print the final piece of question text: + echo $qtextremaining; + break; + case RANDOM: echo "

Random questions should not be printed this way!

"; break; @@ -1561,6 +1658,46 @@ function quiz_grade_attempt_question_result($question, $answers) { } break; + case MULTIANSWER: + // Default setting that avoids a possible divide by zero: + $subquestion->grade = 1.0; + + foreach ($question->answer as $questionanswer) { + + // Resetting default values for subresult: + $subresult->grade = 0.0; + $subresult->correct = array(); + $subresult->feedback = array(); + + // Resetting subquestion responses: + $subquestion->answer = array(); + + $qarr = explode('-', $questionanswer, 2); + $subquestion->answer[] = $qarr[1]; // Always single answer for subquestions + foreach ($answers as $multianswer) { + if ($multianswer->id == $qarr[0]) { + $subquestion->qtype = $multianswer->answertype; + $subquestion->grade = $multianswer->norm; + $subresult = quiz_grade_attempt_question_result + ($subquestion, $multianswer->subanswers); + break; + } + } + + // Summarize subquestion results: + $grade += $subresult->grade; + $feedback[] = $subresult->feedback[0]; + $correct[] = $subresult->correct[0]; + + // Each response instance also contains the partial + // fraction grade for the response: + $response[] = $subresult->grade/$subquestion->grade + . '-' . $subquestion->answer[0]; + } + // Normalize grade: + $grade *= $question->grade/($question->defaultgrade); + break; + case DESCRIPTION: // Descriptions are not graded. break; @@ -1999,6 +2136,52 @@ function quiz_save_question_options($question) { } break; + case MULTIANSWER: + if (!$oldmultianswers = get_records("quiz_multianswers", "question", $question->id, "id ASC")) { + $oldmultianswers = array(); + } + + // Insert all the new multi answers + foreach ($question->answers as $dataanswer) { + if ($oldmultianswer = array_shift($oldmultianswers)) { // Existing answer, so reuse it + $multianswer = $oldmultianswer; + $multianswer->positionkey = $dataanswer->positionkey; + $multianswer->norm = $dataanswer->norm; + $multianswer->answertype = $dataanswer->answertype; + + if (! $multianswer->answers = quiz_save_multianswer_alternatives + ($question->id, $dataanswer->answertype, + $dataanswer->alternatives, $oldmultianswer->answers)) + { + $result->error = "Could not update multianswer alternatives! (id=$multianswer->id)"; + return $result; + } + if (!update_record("quiz_multianswers", $multianswer)) { + $result->error = "Could not update quiz multianswer! (id=$multianswer->id)"; + return $result; + } + } else { // This is a completely new answer + unset($multianswer); + $multianswer->question = $question->id; + $multianswer->positionkey = $dataanswer->positionkey; + $multianswer->norm = $dataanswer->norm; + $multianswer->answertype = $dataanswer->answertype; + + if (! $multianswer->answers = quiz_save_multianswer_alternatives + ($question->id, $dataanswer->answertype, + $dataanswer->alternatives)) + { + $result->error = "Could not insert multianswer alternatives! (questionid=$question->id)"; + return $result; + } + if (!insert_record("quiz_multianswers", $multianswer)) { + $result->error = "Could not insert quiz multianswer!"; + return $result; + } + } + } + break; + case RANDOM: break; @@ -2031,6 +2214,145 @@ function quiz_remove_unwanted_questions(&$questions, $quiz) { } } +function quiz_save_multianswer_alternatives + ($questionid, $answertype, $alternatives, $oldalternativeids= NULL) +{ +// Returns false if something goes wrong, +// otherwise the ids of the answers. + if (empty($oldalternativeids) + or $oldalternatives = + get_records_list('quiz_answers', 'id', $oldalternativeids)) + { + $oldalternatives = array(); + } + + $alternativeids = array(); + + foreach ($alternatives as $altdata) { + + if ($altold = array_shift($oldalternatives)) { // Use existing one... + $alt = $altold; + $alt->answer = $altdata->answer; + $alt->fraction = $altdata->fraction; + $alt->feedback = $altdata->feedback; + if (!update_record("quiz_answers", $alt)) { + return false; + } + + } else { // Completely new one + unset($alt); + $alt->question= $questionid; + $alt->answer = $altdata->answer; + $alt->fraction = $altdata->fraction; + $alt->feedback = $altdata->feedback; + if (! $alt->id = insert_record("quiz_answers", $alt)) { + return false; + } + } + + // For the answer type numerical, each alternative has individual options: + if ($answertype == NUMERICAL) { + if ($numericaloptions = + get_record('quiz_numerical', 'answer', $alt->id)) + { + // Reuse existing numerical options + $numericaloptions->min = $altdata->min; + $numericaloptions->max = $altdata->max; + if (!update_record('quiz_numerical', $numericaloptions)) { + return false; + } + } else { + // New numerical options + $numericaloptions->answer = $alt->id; + $numericaloptions->question = $questionid; + $numericaloptions->min = $altdata->min; + $numericaloptions->max = $altdata->max; + if (!insert_record("quiz_numerical", $numericaloptions)) { + return false; + } + } + } else { // Delete obsolete numerical options + delete_records('quiz_numerical', 'answer', $alt->id); + } // end if NUMERICAL + + $alternativeids[] = $alt->id; + } // end foreach $alternatives + $answers = implode(',', $alternativeids); + + // Removal of obsolete alternatives from answers and quiz_numerical: + while ($altobsolete = array_shift($oldalternatives)) { + delete_records("quiz_answers", "id", $altobsolete->id); + + // Possibly obsolute numerical options are also to be deleted: + delete_records("quiz_numerical", 'answer', $alt->id); + } + + // Common alternative options and removal of obsolete options + switch ($answertype) { + case NUMERICAL: + if (!empty($oldalternativeids)) { + delete_records('quiz_shortanswer', 'answers', +$oldalternativeids); + delete_records('quiz_multichoice', 'answers', +$oldalternativeids); + } + break; + case SHORTANSWER: + if (!empty($oldalternativeids)) { + delete_records('quiz_multichoice', 'answers', +$oldalternativeids); + $options = get_record('quiz_shortanswer', + 'answers', $oldalternativeids); + } else { + unset($options); + } + if (empty($options)) { + // Create new shortanswer options + $options->question = $questionid; + $options->usecase = 0; + $options->answers = $answers; + if (!insert_record('quiz_shortanswer', $options)) { + return false; + } + } else if ($answers != $oldalternativeids) { + // Shortanswer options needs update: + $options->answers = $answers; + if (!update_record('quiz_shortanswer', $options)) { + return false; + } + } + break; + case MULTICHOICE: + if (!empty($oldalternativeids)) { + delete_records('quiz_shortanswer', 'answers', +$oldalternativeids); + $options = get_record('quiz_multichoice', + 'answers', $oldalternativeids); + } else { + unset($options); + } + if (empty($options)) { + // Create new multichoice options + $options->question = $questionid; + $options->layout = 0; + $options->single = 1; + $options->answers = $answers; + if (!insert_record('quiz_multichoice', $options)) { + return false; + } + } else if ($answers != $oldalternativeids) { + // Multichoice options needs update: + $options->answers = $answers; + if (!update_record('quiz_multichoice', $options)) { + return false; + } + } + break; + default: + return false; + } + return $answers; +} ?> diff --git a/mod/quiz/question.php b/mod/quiz/question.php index dfb40e5d7f..9aef192cfe 100644 --- a/mod/quiz/question.php +++ b/mod/quiz/question.php @@ -320,6 +320,11 @@ require("description.html"); break; + case MULTIANSWER: + print_heading_with_help(get_string("editingmultianswer", "quiz"), "multianswer", "quiz"); + require("editmultianswer.php"); + break; + case NUMERICAL: // This will only support one answer of the type NUMERICAL // However, lib.php has support for multiple answers diff --git a/mod/quiz/version.php b/mod/quiz/version.php index 2a26c241c5..b9e671c07d 100644 --- a/mod/quiz/version.php +++ b/mod/quiz/version.php @@ -5,7 +5,7 @@ // This fragment is called by moodle_needs_upgrading() and /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2003072400; // The (date) version of this module +$module->version = 2003072901; // The (date) version of this module $module->cron = 0; // How often should cron check this module (seconds)? ?>