]> git.mjollnir.org Git - moodle.git/commitdiff
The teacher now can choose whether to see the advanced quiz
authorgustav_delius <gustav_delius>
Sun, 2 Jan 2005 07:15:19 +0000 (07:15 +0000)
committergustav_delius <gustav_delius>
Sun, 2 Jan 2005 07:15:19 +0000 (07:15 +0000)
options or not. This is handled as in the resource module. The
"Show advanced options" button is only shown if the admin has
chosen to declare some of the options as advanced.

There are now 4 review options as suggested by Martin in
http://moodle.org/mod/forum/discuss.php?d=16709

Provides separate buttons "Update this quiz" and "Edit questions",
see http://moodle.org/mod/forum/discuss.php?d=16708. To make this
possible edit.php can now be called with a quiz id and it saves
its data itself rather than relying on mod.php.

mod.html now has a "Save changes" and a "Save changes and edit questions" button.

"Attempt quiz now" button gets a different language string for
re-attempts. This is currently set to "Re-attempt quiz".

After viewing the feedback for an attempt the "Continue" button
leads back to the course homepage, as requested in bugs 1224 and
1976. If there is no feedback the user is brought straight to quiz/view.php.

16 files changed:
course/mod.php
lang/en/help/hideoptions.html [new file with mode: 0644]
lang/en/help/quiz/review2.html [new file with mode: 0644]
lang/en/moodle.php
lang/en/quiz.php
mod/quiz/attempt.php
mod/quiz/attempt_close_js.php
mod/quiz/config.html
mod/quiz/defaults.php
mod/quiz/edit.php
mod/quiz/lib.php
mod/quiz/mod.html
mod/quiz/questiontypes/random/random.html
mod/quiz/review.php
mod/quiz/view.php
mod/quiz/view_js.php

index d30661fb21bc767cc893e9869c303f139302214d..5f3be7994abced00ed87e5ce6bc71c9dc95c4927 100644 (file)
                     error($return, "view.php?id=$course->id");
                 }
 
-                $SESSION->returnpage = "$CFG->wwwroot/mod/$mod->modulename/view.php?id=$mod->coursemodule";
+                if (isset($mod->redirect)) {
+                    $SESSION->returnpage = $mod->redirecturl;
+                } else {
+                    $SESSION->returnpage = "$CFG->wwwroot/mod/$mod->modulename/view.php?id=$mod->coursemodule";
+                }
 
                 add_to_log($course->id, "course", "update mod", 
                            "../mod/$mod->modulename/view.php?id=$mod->coursemodule", 
                     error("Could not update the course module with the correct section");
                 }   
 
-                $SESSION->returnpage = "$CFG->wwwroot/mod/$mod->modulename/view.php?id=$mod->coursemodule";
+                if (isset($mod->redirect)) {
+                    $SESSION->returnpage = $mod->redirecturl;
+                } else {
+                    $SESSION->returnpage = "$CFG->wwwroot/mod/$mod->modulename/view.php?id=$mod->coursemodule";
+                }
                 
                 add_to_log($course->id, "course", "add mod", 
                            "../mod/$mod->modulename/view.php?id=$mod->coursemodule", 
diff --git a/lang/en/help/hideoptions.html b/lang/en/help/hideoptions.html
new file mode 100644 (file)
index 0000000..e25206e
--- /dev/null
@@ -0,0 +1,7 @@
+<p align="center"><b>Hide options</b></p>
+
+<p>If you tick these boxes then the corresponding options will be
+hidden from the teacher by default. However the teacher can access
+these options by choosing "<?php
+print_string('showadvancedsettings'); ?>" on the quiz setup
+page.</p>
diff --git a/lang/en/help/quiz/review2.html b/lang/en/help/quiz/review2.html
new file mode 100644 (file)
index 0000000..152f733
--- /dev/null
@@ -0,0 +1,5 @@
+<p align="center"><b>Allow review</b></p>
+
+<p>This option controls whether and when students will be able to 
+   review their past attempts at this quiz.</p>
+
index 593f16c80204a9356d93ae16648e205be6896140..5144778991171037f44faa5198eae2a12504ef22 100644 (file)
@@ -62,6 +62,7 @@ $string['administrators'] = 'Administrators';
 $string['administratorsall'] = 'All administrators';
 $string['administratorsandteachers'] = 'Administrators and teachers';
 $string['advancedfilter'] = 'Advanced search';
+$string['advancedsettings'] = 'Advanced settings';
 $string['again'] = 'again';
 $string['all'] = 'All';
 $string['allactivities'] = 'All activities';
@@ -474,7 +475,6 @@ $string['findmorecourses'] = 'Find more courses...';
 $string['firstdayofweek'] = '0';
 $string['firstname'] = 'First name';
 $string['firsttime'] = 'Is this your first time here?';
-$string['fix'] = 'Fix';
 $string['followingoptional'] = 'The following items are optional';
 $string['followingrequired'] = 'The following items are required';
 $string['force'] = 'Force';
@@ -570,6 +570,7 @@ $string['hiddensections'] = 'Hidden sections';
 $string['hiddensectionscollapsed'] = 'Hidden sections are shown in collapsed form';
 $string['hiddensectionsinvisible'] = 'Hidden sections are completely invisible';
 $string['hide'] = 'Hide';
+$string['hideadvancedsettings'] = 'Hide advanced settings';
 $string['hidepicture'] = 'Hide picture';
 $string['hidesettings'] = 'Hide settings';
 $string['hits'] = 'Hits';
@@ -928,6 +929,7 @@ $string['shortname'] = 'Short name';
 $string['shortnametaken'] = 'Short name is already used for another course ($a)';
 $string['shortsitename'] = 'Short name for site (eg single word)';
 $string['show'] = 'Show';
+$string['showadvancedsettings'] = 'Show advanced settings';
 $string['showall'] = 'Show all $a';
 $string['showallcourses'] = 'Show all courses';
 $string['showalltopics'] = 'Show all topics';
index 1dfc09fdfc8fc72f808e53a13a96f234c06886d3..e683ba58b070a6ed064753df7a3018524e97659e 100644 (file)
@@ -211,11 +211,16 @@ $string['randomsamatchcreate'] = 'Create Random Short-Answer Matching questions'
 $string['randomsamatchintro'] = 'For each of the following questions, select the matching answer from the menu.';
 $string['randomsamatchnumber'] = 'Number of questions to select';
 $string['readytosend'] = 'You are about to send your whole quiz to be graded.  Are you sure you want to continue?';
+$string['reattemptquiz'] = 'Re-attempt quiz';
 $string['recentlyaddedquestion'] = 'Recently added question!';
 $string['regrade'] = 'Regrade all attempts';
 $string['regradecomplete'] = 'All attempts have been regraded';
 $string['regradecount'] = '$a->changed out of $a->attempt grades were changed';
 $string['relative'] = 'Relative';
+$string['reviewnever'] = 'Never allow review';
+$string['reviewafter'] = 'Allow review after quiz is closed';
+$string['reviewbefore'] = 'Allow review while quiz is open';
+$string['reviewalways'] = 'Allow review at any time';
 $string['remove'] = 'Remove';
 $string['rename'] = 'Rename';
 $string['report'] = 'Reports';
@@ -232,6 +237,7 @@ $string['requiresubnet'] = 'Require network address';
 $string['reuseifpossible'] = 'reuse previously removed';
 $string['review'] = 'Review';
 $string['save'] = 'Save';
+$string['saveandedit'] = 'Save changes and edit questions';
 $string['savegrades'] = 'Save grades';
 $string['savemyanswers'] = 'Save my answers';
 $string['savequiz'] = 'Save this whole quiz';
index 6dddfec32a69357c003128d1195c9ab1836cfeba..ccc1647aaf3b676073f30d3466ee68f64d5fbea8 100644 (file)
     }
     
 
-/// BEGIN EDIT Get time limit if any.
+/// Get time limit if any.
 
     $timelimit = $quiz->timelimit * 60;
 
     if($timelimit and $timerstartvalue <= 0) {
         $timerstartvalue = 1;
     }
-/// END EDIT
+
     $timenow = time();
     $available = ($quiz->timeopen < $timenow and $timenow < $quiz->timeclose) || isteacher($course->id);
 
         if (! quiz_save_best_grade($quiz, $USER->id)) {
             error("Sorry! Could not calculate your best grade!");
         }
+        
+        if (empty($quiz->popup) and !$quiz->feedback) {
+            // No need to stop on this page, go directly to view.php
+            redirect('view.php?q='.$quiz->id);
+        }
 
         $strgrade = get_string("grade");
         $strscore = get_string("score", "quiz");
index 013ebc32c8def49001b2e1e20a0352d1a40d4e78..767e50e86a705fb6b11a5bfdbdffd3072932d7b6 100644 (file)
@@ -9,7 +9,7 @@ if (!empty($quiz->popup)) {
 <!--
 
 document.write('<input type="button" value="<?php print_string('continue') ?>" '+
-               'onclick="javascript: window.opener.location.href=\'view.php?id=<?php echo $cm->id ?>\'; '+
+               'onclick="javascript: window.opener.location.href=\'../../course/view.php?id=<?php echo $course->id ?>\'; '+
                'window.close();" />');
 // -->
 </script>
@@ -19,7 +19,7 @@ document.write('<input type="button" value="<?php print_string('continue') ?>" '
 
 <?php
 } else {
-    print_single_button("view.php", array( 'id' => $cm->id ), get_string('continue'));
+    print_single_button("../../course/view.php", array( 'id' => $course->id ), get_string('continue'));
 }
 ?>
 </div>
index d26a22f7fb4ba1d7539ae04f12937ee041f373c3..8345cb1f6d79e43e66ff4facc6e8364dd4565ba0 100644 (file)
@@ -9,7 +9,7 @@
     <?php print_string('sitedefault'); ?>
   </th>
   <th align="center">
-    <?php print_string('fix'); helpbutton("fixdefaults"); ?>
+    <?php print_string('hide'); helpbutton("hideoptions"); ?>
   </th>
 </tr>    
 
   <td align="right"><b><?php print_string("allowreview", "quiz") ?>:</b></td>
   <td>
     <?php
-       unset($options);
-       $options[0] = get_string("no");
-       $options[1] = get_string("yes");
-       choose_from_menu ($options, "quiz_allowreview", $CFG->quiz_allowreview, "", "", "");
-       helpbutton("review", get_string("allowreview","quiz"), "quiz");
+       $reviewoptions = array();
+       $reviewoptions[0] = get_string('reviewnever', 'quiz');
+       $reviewoptions[1] = get_string('reviewafter', 'quiz');
+       $reviewoptions[2] = get_string('reviewbefore', 'quiz');
+       $reviewoptions[3] = get_string('reviewalways', 'quiz');
+       choose_from_menu ($reviewoptions, "quiz_allowreview", $CFG->quiz_allowreview, "", "", "");
+       helpbutton("review2", get_string("allowreview","quiz"), "quiz");
     ?>
   </td>
   <td align="center">
index 8adf770e7621852e201d650c69d40b3ec7175556..1eda795ee4dc8235f2c149c91fcd3fe4596cf015 100644 (file)
@@ -4,7 +4,7 @@
 // It defines default values for any important configuration variables
 
    $defaults = array (
-       'quiz_allowreview' => 0,
+       'quiz_allowreview' => 1,
        'quiz_attemptonlast' => 0,
        'quiz_attempts' => 0,
        'quiz_grademethod' => '',
index 43ddb782cf93dca6ddbe9c156e1948cd6c52470e..ab05c34efedcaa1a8f7cf268e5cbb171c1d5fc7e 100644 (file)
@@ -6,6 +6,7 @@
     require_login();
 
     optional_variable($courseid);
+    optional_variable($quizid);
 
     if (empty($destination)) {
         $destination = "";
@@ -13,7 +14,7 @@
 
     $modform = data_submitted($destination);
 
-    if ($modform and !empty($modform->course)) {    // form submitted from mod.html
+    if ($modform and !empty($modform->course)) { // data submitted
 
         $modform->name = trim($modform->name);
 
 
         $SESSION->modform = $modform;    // Save the form in the current session
 
+    } else if ($quizid) {
+        if (! $modform = get_record('quiz', 'id', $quizid)) {
+            error("The required quiz doesn't exist");
+        }
+        
+        $modform->instance = $modform->id;
+        
+        $SESSION->modform = $modform;    // Save the form in the current session
+
     } else if ($courseid) { // Page retrieve through "Edit Questions" link - no quiz selected
         $modform->course = $courseid;
         unset($modform->instance);
@@ -35,7 +45,9 @@
 
     } else {
         if (!isset($SESSION->modform)) {
-            error("You have used this page incorrectly!");
+               // We currently also get here after editing a question by
+               // following the edit link on the review page. Perhaps that should be fixed.
+            error('');
         }
 
         $modform = $SESSION->modform;
 
 
     // Now, check for commands on this page and modify variables as necessary
+    
+    if (isset($cancel)) {
+        redirect('view.php?q='.$modform->instance);
+    }
 
     if (!empty($up)) { /// Move the given question up a slot
         $questions = explode(",", $modform->questions);
             }
         }
     }
+    
+    if (!empty($save)) {  // Save the list of questions and grades in the database and return
+    
+        //If caller is correct, $SESSION->sesskey must exist and coincide
+        if (empty($SESSION->sesskey) or !confirm_sesskey($SESSION->sesskey)) {
+            error(get_string('confirmsesskeybad', 'error'));
+        }
+        //Unset this, check done
+        unset($SESSION->sesskey);
+        
+        quiz_update_instance($modform);
+        $coursemodule = get_coursemodule_from_instance('quiz', $modform->instance);
+        add_to_log($course->id, 'quiz', 'editquestions', 
+                           "view.php?id=$coursemodule", 
+                           "$modform->instance", $coursemodule); 
+        redirect('view.php?q='.$modform->instance);
+        die;
+    }
 
     if (!empty($cat)) { //-----------------------------------------------------------
         $modform->category = $cat;
             }
             notify("$strattemptsexist<br /><a href=\"report.php?id=$cm->id\">$strviewallanswers ($usercount $strusers)</a>");
         }
-
+        
+        $SESSION->sesskey = !empty($USER->id) ? $USER->sesskey : '';
         ?>
-        <form  name="theform" method="post" action=<?php echo $modform->destination ?>>
-        <input type="hidden" name="course"  value="<?php  p($modform->course) ?>" />
-        <input type="submit" value="<?php  print_string("savequiz", "quiz") ?>" />
+        <form method="post" action="edit.php">
+        <input type="hidden" name="sesskey" value="save" />
+        <input type="submit" name="save" value="<?php  print_string("savequiz", "quiz") ?>" />
         <input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
         </form>
         </center>
index a9e3b334d4099863958bc9161c873467118033d9..ea6233e313e66afd5ed07522f70bc4ad70ed3fda 100644 (file)
@@ -43,6 +43,9 @@ define("QUIZ_MAX_NUMBER_ANSWERS", "10");
 
 define("QUIZ_MAX_EVENT_LENGTH", "432000");   // 5 days maximum
 
+define('QUIZ_REVIEW_AFTER', 1);
+define('QUIZ_REVIEW_BEFORE', 2);
+
 $QUIZ_QTYPES= array();
 
 /// QUIZ_QTYPES INITIATION //////////////////
@@ -337,9 +340,15 @@ function quiz_add_instance($quiz) {
     if (!$quiz->id = insert_record("quiz", $quiz)) {
         return false;  // some error occurred
     }
+    
+    if (isset($quiz->optionsettingspref)) {
+        set_user_preference('quiz_optionsettingspref', $quiz->optionsettingspref);
+    }
 
     // The grades for every question in this quiz are stored in an array
-    if ($quiz->grades) {
+    // (because this is currently only called from mod.html there are not
+    // going to be any grades, but we will leave this code here just in case)
+    if (isset($quiz->grades)) {
         foreach ($quiz->grades as $question => $grade) {
             if ($question) {
                 unset($questiongrade);
@@ -390,7 +399,7 @@ function quiz_add_instance($quiz) {
 
 function quiz_update_instance($quiz) {
 /// Given an object containing all the necessary data,
-/// (defined by the form in mod.html) this function
+/// (defined by the form in mod.html or edit.php) this function
 /// will update an existing instance with new data.
 
     global $SESSION;
@@ -398,23 +407,28 @@ function quiz_update_instance($quiz) {
     unset($SESSION->modform);
 
     $quiz->timemodified = time();
-    $quiz->timeopen = make_timestamp($quiz->openyear, $quiz->openmonth, $quiz->openday,
-                                     $quiz->openhour, $quiz->openminute, 0);
-    $quiz->timeclose = make_timestamp($quiz->closeyear, $quiz->closemonth, $quiz->closeday,
-                                      $quiz->closehour, $quiz->closeminute, 0);
+    if (isset($quiz->openyear)) { // this would not be set if we come from edit.php
+        $quiz->timeopen = make_timestamp($quiz->openyear, $quiz->openmonth, $quiz->openday,
+                                         $quiz->openhour, $quiz->openminute, 0);
+        $quiz->timeclose = make_timestamp($quiz->closeyear, $quiz->closemonth, $quiz->closeday,
+                                          $quiz->closehour, $quiz->closeminute, 0);
+    }
     $quiz->id = $quiz->instance;
 
     if (!update_record("quiz", $quiz)) {
         return false;  // some error occurred
     }
 
+    if (isset($quiz->optionsettingspref)) {
+        set_user_preference('quiz_optionsettingspref', $quiz->optionsettingspref);
+    }
 
     // The grades for every question in this quiz are stored in an array
     // Insert or update records as appropriate
 
     $existing = get_records("quiz_question_grades", "quiz", $quiz->id, "", "question,grade,id");
 
-    if ($quiz->grades) {
+    if (isset($quiz->grades)) { // this will not be set if we come from mod.html
         foreach ($quiz->grades as $question => $grade) {
             if ($question) {
                 unset($questiongrade);
@@ -473,8 +487,6 @@ function quiz_update_instance($quiz) {
         add_event($event);
     }
 
-    
-
     return true;
 }
 
@@ -1234,6 +1246,7 @@ function quiz_gradesmenu_options($defaultgrade) {
 
 function quiz_print_question_list($questionlist, $grades) {
 // Prints a list of quiz questions in a small layout form with knobs
+// returns sum of maximum grades
 // $questionlist is comma-separated list
 // $grades is an array of corresponding grades
 
index e194679113c824ed8d24f2025144276823e1ffc5..4ff3814589f014a6e45176130883a7895b244745 100644 (file)
@@ -1,9 +1,38 @@
 <!-- This page defines the form to create or edit an instance of this module -->
 <!-- It is used from /course/mod.php.  The whole instance is available as $form. -->
 
+<!-- Some javascript to allow for the hiding of advanced options
+     This code was derived from mod.html in the resource module -->
+<script language="javascript" type="text/javascript">
+    function showhide (id, set) {
+        divobj = document.getElementById(id);
+        butobj = document.getElementById(id+'button');
+        prefobj = document.getElementById(id+'pref');
+        if (set == true) {
+            if (prefobj.value == '1') {
+                divobj.style.display = 'block';
+                butobj.value = '<?php print_string("hideadvancedsettings") ?>';
+            } else {
+                divobj.style.display = 'none';
+                butobj.value = '<?php print_string("showadvancedsettings") ?>...';
+            }
+        } else {
+            if (prefobj.value == '1') {
+                divobj.style.display = 'none';
+                butobj.value = '<?php print_string("showadvancedsettings") ?>...';
+                prefobj.value = '0';
+            } else {
+                divobj.style.display = 'block';
+                butobj.value = '<?php print_string("hideadvancedsettings") ?>';
+                prefobj.value = '1';
+            }
+        }
+    }
+</script>
+
 <?php 
     require_once("$CFG->dirroot/mod/quiz/lib.php");
-
+// Ensure that all form variables are initialized
     if (!isset($form->name)) {
         $form->name = "";
     }
     if (!isset($form->popup)) {
         $form->popup = $CFG->quiz_popup;
     }
+    
+    $fix = 0; // This will later be set to 1 if some of the variables have been fixed by the admin.
+    
+    // the following are used for drop-down menus
+    $reviewoptions = array();
+    $reviewoptions[0] = get_string('reviewnever', 'quiz');
+    $reviewoptions[1] = get_string('reviewafter', 'quiz');
+    $reviewoptions[2] = get_string('reviewbefore', 'quiz');
+    $reviewoptions[3] = get_string('reviewalways', 'quiz');
+    
+    $yesnooptions = array();
+    $yesnooptions[0] = get_string("no");
+    $yesnooptions[1] = get_string("yes");
+    
+    $attemptoptions = array();
+    $attemptoptions[0] = get_string("attemptsunlimited", "quiz");
+    $attemptoptions[1] = "1 ".strtolower(get_string("attempt", "quiz"));
+    for ($i=2;$i<=6;$i++) {
+        $attemptoptions[$i] = "$i ".strtolower(get_string("attempts", "quiz"));
+    }
+    
+    $grades = array();
+    for ($i=100; $i>=1; $i--) {
+        $grades[$i] = $i;
+    }
+    $grades[0] = get_string("nograde");
 ?>
 
 
-<form name="form" method="post" action="../mod/quiz/edit.php">
+<form name="form" method="post" action="mod.php">
+
 <center>
+
+<!-- Now comes a table with all the options that have not been fixed by the admin -->
 <table cellpadding="5">
 
 <tr valign="top">
     </td>
 </tr>
 
-<?php if ($CFG->quiz_fix_timelimit) { ?>
-    <input type="hidden" name="timelimit" value="<?php p($form->timelimit) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_timelimit) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("timelimit", "quiz") ?>:</b></td>
         <td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_shufflequestions) { ?>
-    <input type="hidden" name="shufflequestions" value="<?php p($form->shufflequestions) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_shufflequestions) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("shufflequestions", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "shufflequestions", "$form->shufflequestions", "");
+            choose_from_menu($yesnooptions, "shufflequestions", "$form->shufflequestions", "");
             helpbutton("shufflequestions", get_string("shufflequestions","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_shuffleanswers) { ?>
-    <input type="hidden" name="shuffleanswers" value="<?php p($form->shuffleanswers) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_shuffleanswers) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("shuffleanswers", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "shuffleanswers", "$form->shuffleanswers", "");
+            choose_from_menu($yesnooptions, "shuffleanswers", "$form->shuffleanswers", "");
             helpbutton("shuffleanswers", get_string("shuffleanswers","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_attempts) { ?>
-    <input type="hidden" name="attempts" value="<?php p($form->attempts) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_attempts) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("attemptsallowed", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("attemptsunlimited", "quiz");
-            $options[1] = "1 ".strtolower(get_string("attempt", "quiz"));
-            for ($i=2;$i<=6;$i++) {
-                $options[$i] = "$i ".strtolower(get_string("attempts", "quiz"));
-            }
-            choose_from_menu($options, "attempts", "$form->attempts", "");
+            choose_from_menu($attemptoptions, "attempts", "$form->attempts", "");
             helpbutton("attempts", get_string("attemptsallowed","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_attemptonlast) { ?>
-    <input type="hidden" name="attemptonlast" value="<?php p($form->attemptonlast) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_attemptonlast) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("eachattemptbuildsonthelast", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "attemptonlast",
+            choose_from_menu($yesnooptions, "attemptonlast",
                              "$form->attemptonlast", "");
             helpbutton("repeatattempts",
                        get_string("eachattemptbuildsonthelast", "quiz"),
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_grademethod) { ?>
-    <input type="hidden" name="grademethod" value="<?php p($form->grademethod) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_grademethod) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("grademethod", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[1] = get_string("gradehighest", "quiz");
-            $options[2] = get_string("gradeaverage", "quiz");
-            $options[3] = get_string("attemptfirst", "quiz");
-            $options[4] = get_string("attemptlast", "quiz");
             choose_from_menu($QUIZ_GRADE_METHOD, "grademethod", "$form->grademethod", "");
             helpbutton("grademethod", get_string("grademethod","quiz"), "quiz");
          ?>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_showfeedback) { ?>
-    <input type="hidden" name="feedback" value="<?php p($form->feedback) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_showfeedback) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("showfeedback", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "feedback", "$form->feedback", "");
+            choose_from_menu($yesnooptions, "feedback", "$form->feedback", "");
             helpbutton("feedback", get_string("showfeedback","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_showanswer) { ?>
-    <input type="hidden" name="correctanswers" value="<?php p($form->correctanswers) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_showanswer) { ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("showcorrectanswer", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "correctanswers", "$form->correctanswers", "");
+            choose_from_menu($yesnooptions, "correctanswers", "$form->correctanswers", "");
             helpbutton("correctanswers", get_string("showcorrectanswer","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_allowreview) { ?>
-    <input type="hidden" name="review" value="<?php p($form->review) ?>">
-<?php } else { ?>
+<?php if (!$CFG->quiz_fix_allowreview) { ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("allowreview", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($reviewoptions, "review", "$form->review", "");
+            helpbutton("review2", get_string("allowreview","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if (!$CFG->quiz_fix_maximumgrade) { ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("maximumgrade") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($grades, "grade", "$form->grade", "");
+            helpbutton("maxgrade", get_string("maximumgrade"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if (!$CFG->quiz_fix_popup) { ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("popup", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "popup", "$form->popup", "");
+            helpbutton("popup", get_string("popup","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if (!$CFG->quiz_fix_password) { ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("requirepassword", "quiz") ?>:</b></td>
+        <td>
+            <input type="text" name="password" size="40" value="<?php p($form->password) ?>" />
+            <?php helpbutton("requirepassword", get_string("requirepassword", "quiz"), "quiz"); ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if (!$CFG->quiz_fix_subnet) { ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("requiresubnet", "quiz") ?>:</b></td>
+        <td>
+            <input type="text" name="subnet" size="40" value="<?php p($form->subnet) ?>" />
+            <?php helpbutton("requiresubnet", get_string("requiresubnet", "quiz"), "quiz"); ?>
+        </td>
+    </tr>
+<?php } ?>
+
+</table>
+
+
+
+<!-- Now comes a copy of the above but enclosed in a div with id optionsettings and with
+     the conditions reversed, so that it shows exactly the options that are usually hidden.
+     The variable $fix is set to 1 if there is at least one fixed option.
+     The visibility of this div is controlled by javascript. -->
+
+<div id="optionsettings">
+
+<?php print_heading(get_string('advancedsettings')); ?>
+
+<table cellpadding="5">
+
+<?php if ($CFG->quiz_fix_timelimit) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("timelimit", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            print_timer_selector($form->timelimit, get_string("minutes","quiz"));
+            helpbutton("timelimit", get_string("quiztimer","quiz"), "quiz");
+        ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_shufflequestions) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("shufflequestions", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "shufflequestions", "$form->shufflequestions", "");
+            helpbutton("shufflequestions", get_string("shufflequestions","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_shuffleanswers) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("shuffleanswers", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "shuffleanswers", "$form->shuffleanswers", "");
+            helpbutton("shuffleanswers", get_string("shuffleanswers","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_attempts) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("attemptsallowed", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($attemptoptions, "attempts", "$form->attempts", "");
+            helpbutton("attempts", get_string("attemptsallowed","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_attemptonlast) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("eachattemptbuildsonthelast", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "attemptonlast",
+                             "$form->attemptonlast", "");
+            helpbutton("repeatattempts",
+                       get_string("eachattemptbuildsonthelast", "quiz"),
+                       "quiz");
+        ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_grademethod) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("grademethod", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($QUIZ_GRADE_METHOD, "grademethod", "$form->grademethod", "");
+            helpbutton("grademethod", get_string("grademethod","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_showfeedback) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("showfeedback", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "feedback", "$form->feedback", "");
+            helpbutton("feedback", get_string("showfeedback","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_showanswer) { $fix = 1; ?>
+    <tr valign="top">
+        <td align="right"><b><?php print_string("showcorrectanswer", "quiz") ?>:</b></td>
+        <td>
+        <?php
+            choose_from_menu($yesnooptions, "correctanswers", "$form->correctanswers", "");
+            helpbutton("correctanswers", get_string("showcorrectanswer","quiz"), "quiz");
+         ?>
+        </td>
+    </tr>
+<?php } ?>
+
+<?php if ($CFG->quiz_fix_allowreview) { $fix = 1; ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("allowreview", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "review", "$form->review", "");
+            choose_from_menu($reviewoptions, "review", "$form->review", "");
             helpbutton("review", get_string("allowreview","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_maximumgrade) { ?>
-    <input type="hidden" name="grade" value="<?php p($form->grade) ?>">
-<?php } else { ?>
+<?php if ($CFG->quiz_fix_maximumgrade) { $fix = 1; ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("maximumgrade") ?>:</b></td>
         <td>
         <?php
-            for ($i=100; $i>=1; $i--) {
-                $grades[$i] = $i;
-            }
-            $grades[0] = get_string("nograde");
-    
             choose_from_menu($grades, "grade", "$form->grade", "");
             helpbutton("maxgrade", get_string("maximumgrade"), "quiz");
          ?>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_popup) { ?>
-    <input type="hidden" name="popup" value="<?php p($form->popup) ?>">
-<?php } else { ?>
+<?php if ($CFG->quiz_fix_popup) { $fix = 1; ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("popup", "quiz") ?>:</b></td>
         <td>
         <?php
-            $options = array();
-            $options[0] = get_string("no");
-            $options[1] = get_string("yes");
-            choose_from_menu($options, "popup", "$form->popup", "");
+            choose_from_menu($yesnooptions, "popup", "$form->popup", "");
             helpbutton("popup", get_string("popup","quiz"), "quiz");
          ?>
         </td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_password) { ?>
-    <input type="hidden" name="password" value="<?php p($form->password) ?>">
-<?php } else { ?>
+<?php if ($CFG->quiz_fix_password) { $fix = 1; ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("requirepassword", "quiz") ?>:</b></td>
         <td>
     </tr>
 <?php } ?>
 
-<?php if ($CFG->quiz_fix_subnet) { ?>
-    <input type="hidden" name="subnet" value="<?php p($form->subnet) ?>">
-<?php } else { ?>
+<?php if ($CFG->quiz_fix_subnet) { $fix = 1; ?>
     <tr valign="top">
         <td align="right"><b><?php print_string("requiresubnet", "quiz") ?>:</b></td>
         <td>
         </td>
     </tr>
 <?php } ?>
-    
+
 </table>
-<input type="hidden" name="questions"     value="<?php p($form->questions) ?>" />
+
+</div>
+
+<!-- Now show the button that the teacher can use to display and override the settings that were
+     fixed by the admin. -->
+<?php if ($fix) { ?>
+    <input type="button" value="hide settings" id="optionsettingsbutton" onclick="javascript: return showhide('optionsettings');" />
+    <input type="hidden" name="optionsettingspref" id="optionsettingspref" 
+                   value="<?php echo get_user_preferences('quiz_optionsettingspref', 0); ?>" />
+    <br />
+<?php } else { ?>
+    <input type="hidden" value="hide settings" id="optionsettingsbutton" />
+    <input type="hidden" name="optionsettingspref" id="optionsettingspref" 
+                   value="0" />
+<?php } ?>
+<br />
+
 <!-- these hidden variables are always the same -->
 <input type="hidden" name="course"        value="<?php p($form->course) ?>" />
 <input type="hidden" name="coursemodule"  value="<?php p($form->coursemodule) ?>" />
 <input type="hidden" name="modulename"    value="<?php p($form->modulename) ?>" />
 <input type="hidden" name="instance"      value="<?php p($form->instance) ?>" />
 <input type="hidden" name="mode"          value="<?php p($form->mode) ?>" />
-<input type="hidden" name="destination"   value="<?php echo "$CFG->wwwroot/course/mod.php" ?>" />
-<input type="submit" value="<?php print_string("continue") ?>" />
+<input type="submit" value="<?php  print_string("savechanges") ?>" />
+<!-- provide an additional button to edit questions -->
+<input type="hidden" name="redirecturl" value="<?php p("$CFG->wwwroot/mod/quiz/edit.php?quizid=$form->instance") ?>" />
+<input type="submit" name="redirect" value="<?php print_string('saveandedit', 'quiz') ?>" />
+<input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
 </center>
 </form>
+
+<script language="javascript" type="text/javascript">
+    showhide('optionsettings', true);
+</script> 
\ No newline at end of file
index 3e0f6fdcbb5af9db6ad76d18707396111bb0183e..61e13b7eb33f1c4c203808016487fa1f16d8b987 100644 (file)
@@ -43,7 +43,7 @@
 
 
 <input type="hidden" name="questiontext" value="---" />
-
+<input type="hidden" name="questiontextformat" value="0" />
 
 
 <input type="hidden" name="id" value="<?php  p($question->id) ?>" />
index a9ca26afce9f31f70571b799f47edc758e2923fb..a1c4604da177250230a57524bbada2b63d7e1600 100644 (file)
         if (!$quiz->review) {
             error(get_string("noreview", "quiz"));
         }
-        if (time() < $quiz->timeclose) {
+        if (time() < $quiz->timeclose and $quiz->review == QUIZ_REVIEW_AFTER) {
             error(get_string("noreviewuntil", "quiz", userdate($quiz->timeclose)));
         }
+        if (time() > $quiz->timeclose and $quiz->review == QUIZ_REVIEW_BEFORE) {
+            error(get_string("noreview", "quiz"));
+        }
         if ($attempt->userid != $USER->id) {
             error("This is not your attempt!");
         }
index 382395dc48e55bf3adc27866d65c873d441b6076..acfe6ed99671484eac79eaf11296382d1f3de0f6 100644 (file)
     }
 
     require_login($course->id);
+    
+    // if no questions have been set up yet redirect to edit.php
+    if (!$quiz->questions and isteacheredit($course->id)) {
+        redirect('edit.php?quizid='.$quiz->id);
+    }
 
     add_to_log($course->id, "quiz", "view", "view.php?id=$cm->id", $quiz->id, $cm->id);
 
 
     $strquizzes = get_string("modulenameplural", "quiz");
     $strquiz  = get_string("modulename", "quiz");
+    $stredit = get_string('editquestions', 'quiz');
+    if (isteacheredit($course->id)) {
+        $buttons = "<table><tr><td><form target=\"$CFG->framename\" method=\"get\" action=\"edit.php\">".
+               "<input type=\"hidden\" name=\"quizid\" value=\"$quiz->id\" />".
+               "<input type=\"submit\" value=\"$stredit\" /></form></td><td>".
+               update_module_button($cm->id, $course->id, $strquiz).
+               '</td></tr></table>';
+    } else {
+        $buttons = '';
+    }
 
     print_header_simple("$quiz->name", "",
                  "<a href=\"index.php?id=$course->id\">$strquizzes</a> -> $quiz->name", 
-                 "", "", true, update_module_button($cm->id, $course->id, $strquiz), navmenu($course, $cm));
+                 "", "", true, $buttons, navmenu($course, $cm));
 
     if (isteacher($course->id)) {
         $attemptcount = count_records_select("quiz_attempts", "quiz = '$quiz->id' AND timefinish > 0");
                 if ($attemptgrade == $mygrade) {
                     $attemptgrade = "<span class=\"highlight\">$attemptgrade</span>";
                 }
-                if (!$available and $quiz->review) {
+                if (quiz_review_allowed($quiz)) {
                     $attemptgrade = "<a href=\"review.php?q=$quiz->id&amp;attempt=$attempt->id\">$attemptgrade</a>";
-                    $attempt->attempt = "<a href=\"review.php?q=$quiz->id&amp;attempt=$attempt->id\">$attempt->attempt</a>";
+                    $attempt->attempt = "<a href=\"review.php?q=$quiz->id&amp;attempt=$attempt->id\">#$attempt->attempt</a>";
                 }
                 $table->data[] = array( $attempt->attempt, 
                                         format_time($attempt->timefinish - $attempt->timestart),
                                         userdate($attempt->timefinish), 
                                         $attemptgrade);
             } else {  // No grades are being used
-                if (!$available and $quiz->review) {
-                    $attempt->attempt = "<a href=\"review.php?q=$quiz->id&amp;attempt=$attempt->id\">$attempt->attempt</a>";
+                if (quiz_review_allowed($quiz)) {
+                    $attempt->attempt = "<a href=\"review.php?q=$quiz->id&amp;attempt=$attempt->id\">#$attempt->attempt</a>";
                 }
                 $table->data[] = array( $attempt->attempt, 
                                         format_time($attempt->timefinish - $attempt->timestart),
         }
     }
 
-
 // Finish the page
     print_footer($course);
+    
+    function quiz_review_allowed($quiz) {
+        if (!$quiz->review) {
+            return false;
+        }
+        if ((time() < $quiz->timeclose) and ($quiz->review == QUIZ_REVIEW_AFTER)) {
+            return false;
+        }
+        if ((time() > $quiz->timeclose) and ($quiz->review == QUIZ_REVIEW_BEFORE)) {
+            return false;
+        }
+        return true;
+    }
 
 ?>
index 46c7ae02e72a9a448b674980a79c8afcc809256c..513d773f7d1f4f67acab47fbf9c05697ba819e95 100644 (file)
@@ -3,12 +3,13 @@ defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
 
 $window = (!empty($quiz->popup)) ? 'quizpopup' : '_self';
 $windowoptions = ($window == '_self') ? '' : "left=0, top=0, height='+window.screen.height+', width='+window.screen.width+', channelmode=yes, fullscreen=yes, scrollbars=yes, resizeable=no, directories=no, toolbar=no, titlebar=no, location=no, status=no, menubar=no";
+$buttontext = ($numattempts) ? get_string('reattemptquiz', 'quiz') : get_string('attemptquiznow', 'quiz');
 
 ?>
 
 <script language="javascript" type="text/javascript">
 <!--
-document.write('<input type="button" value="<?php print_string('attemptquiznow', 'quiz') ?>" '+
+document.write('<input type="button" value="<?php echo $buttontext ?>" '+
                'onclick="javascript: <?php if ($quiz->timelimit) echo "if (confirm(\\'$strconfirmstartattempt\\'))"; ?> '+
                'window.open(\'attempt.php?id=<?php echo $cm->id ?>\', \'<?php echo $window ?>\', \'<?php echo $windowoptions ?>\'); " />');
 // -->
@@ -16,4 +17,3 @@ document.write('<input type="button" value="<?php print_string('attemptquiznow',
 <noscript>
     <strong><?php print_string('noscript', 'quiz'); ?></strong>
 </noscript>
-