diff --git a/bolt_checkin_notes.txt b/bolt_checkin_notes.txt
index c1b8ef3d81..2494f484b3 100644
--- a/bolt_checkin_notes.txt
+++ b/bolt_checkin_notes.txt
@@ -234,3 +234,15 @@ David Oct 20 2008
David Oct 23 2008
- Add callback mechanism for exercises and exercise sets
- Default count for exercise sets is N, not 1
+ - Switch from JSON to PHP serialization
+ (NOTE: this requires cleaning out your DB)
+
+David Oct 23 2008
+ - Change the info passed to/from exercise functions from
+ bunch of globals to a single global struct
+ - Change the arguments to exercise functions
+ to allow for a weight() arg
+
+ html/
+ inc/
+ bolt_ex.inc
diff --git a/html/inc/bolt_ex.inc b/html/inc/bolt_ex.inc
index 294daca346..30f4d1219b 100644
--- a/html/inc/bolt_ex.inc
+++ b/html/inc/bolt_ex.inc
@@ -18,27 +18,55 @@
// Bolt exercise API
-$bolt_ex_mode = 0;
-$bolt_ex_index = 0;
-$bolt_ex_state = 0;
-$bolt_ex_score = 0;
-$bolt_ex_query_string = "";
+// The following is a global var accessed by exercise functions.
+//
+$bolt_ex = null;
+$bolt_ex->mode = 0; // input: SHOW/SCORE/ANSWER
+$bolt_ex->index = 0; // input: sequence of this exercise in file
+$bolt_ex->score = 0; // input/output: cumulative score (if mode = SCORE)
+$bolt_ex->weight = 0; // input/output: cumulative weight
+$bolt_ex->query_string = ""; // user's response (if SCORE or ANSWER)
-function exclusive_choice($choices) {
- global $bolt_ex_mode; // input
- global $bolt_ex_index; // input
- global $bolt_ex_score; // incremental output if SCORE
- global $bolt_ex_query_string;
+class BoltWeight {
+ public $weight;
+ function __construct($weight) {
+ $this->weight = $weight;
+ }
+}
- parse_str($bolt_ex_query_string);
+function weight($w) {
+ return new BoltWeight($w);
+}
- switch ($bolt_ex_mode) {
+function exclusive_choice() {
+ global $bolt_ex;
+ $weight = 1;
+
+ $choices = array();
+ $args = func_get_args();
+ foreach ($args as $arg) {
+ if (is_string($arg)) {
+ $choices[] = $arg;
+ } else if (is_object($arg)) {
+ if (get_class($arg) == 'BoltWeight') {
+ $weight = $arg->weight;
+ } else {
+ "bad arg to exclusive_choice()";
+ }
+ } else {
+ "bad arg to exclusive_choice()";
+ }
+ }
+
+ parse_str($bolt_ex->query_string);
+
+ switch ($bolt_ex->mode) {
case BOLT_MODE_SHOW:
shuffle($choices);
$i = 0;
start_table();
foreach ($choices as $choice) {
- row2($choice, "");
+ row2($choice, "index type=radio value=$i>");
$i++;
}
end_table();
@@ -46,18 +74,19 @@ function exclusive_choice($choices) {
case BOLT_MODE_SCORE:
$right_ans = $choices[0];
shuffle($choices);
- $key = "q_$bolt_ex_index";
+ $key = "q_$bolt_ex->index";
if (isset($$key)) {
$response = $$key;
if ($choices[$response] == $right_ans) {
- $bolt_ex_score += 1;
+ $bolt_ex->score += 1;
}
}
+ $bolt_ex->weight += $weight;
break;
case BOLT_MODE_ANSWER:
$right_ans = $choices[0];
shuffle($choices);
- $key = "q_$bolt_ex_index";
+ $key = "q_$bolt_ex->index";
if (isset($$key)) {
$response = $$key;
} else {
@@ -84,25 +113,39 @@ function exclusive_choice($choices) {
end_table();
break;
}
- $bolt_ex_index++;
+ $bolt_ex->index++;
}
-function inclusive_choice($choices) {
- global $bolt_ex_mode; // input
- global $bolt_ex_index; // input
- global $bolt_ex_score; // incremental output if SCORE
- global $bolt_ex_query_string;
+function inclusive_choice() {
+ global $bolt_ex;
+ $weight = 1;
- parse_str($bolt_ex_query_string);
+ $choices = array();
+ $args = func_get_args();
+ foreach ($args as $arg) {
+ if (is_array($arg)) {
+ $choices[] = $arg;
+ } else if (is_object($arg)) {
+ if (get_class($arg) == 'BoltWeight') {
+ $weight = $arg->weight;
+ } else {
+ "bad arg to inclusive_choice()";
+ }
+ } else {
+ "bad arg to inclusive_choice()";
+ }
+ }
- switch ($bolt_ex_mode) {
+ parse_str($bolt_ex->query_string);
+
+ switch ($bolt_ex->mode) {
case BOLT_MODE_SHOW:
shuffle($choices);
$i = 0;
start_table();
foreach ($choices as $choice) {
$c = $choice[0];
- row2("", $c);
+ row2("index."_$i type=checkbox>", $c);
$i++;
}
end_table();
@@ -113,14 +156,15 @@ function inclusive_choice($choices) {
$score = 0;
shuffle($choices);
foreach ($choices as $choice) {
- $key = "q_".$bolt_ex_index."_$i";
+ $key = "q_".$bolt_ex->index."_$i";
$response = isset($$key);
$r = $choice[1];
$correct = ($r && $response) || (!$r && !$response);
if ($correct) $score += 1./$n;
$i++;
}
- $bolt_ex_score += $score;
+ $bolt_ex->score += $score;
+ $bolt_ex->weight += $weight;
break;
case BOLT_MODE_ANSWER:
$i = 0;
@@ -130,7 +174,7 @@ function inclusive_choice($choices) {
table_header("Choice", "Correct?", "Your answer");
foreach ($choices as $choice) {
$c = $choice[0];
- $key = "q_".$bolt_ex_index."_$i";
+ $key = "q_".$bolt_ex->index."_$i";
$response = isset($$key);
$r = $choice[1];
$correct = ($r && $response) || (!$r && !$response);
@@ -143,18 +187,15 @@ function inclusive_choice($choices) {
end_table();
break;
}
- $bolt_ex_index++;
+ $bolt_ex->index++;
}
function image_rect($img, $rect) {
- global $bolt_ex_mode; // input
- global $bolt_ex_index; // input
- global $bolt_ex_state; // output if SHOW, else input
- global $bolt_ex_score; // incremental output if SCORE
+ global $bolt_ex;
- parse_str($bolt_ex_query_string);
+ parse_str($bolt_ex->query_string);
- switch ($bolt_ex_mode) {
+ switch ($bolt_ex->mode) {
case BOLT_MODE_SHOW:
echo "";
break;
diff --git a/html/user/bolt_sched.php b/html/user/bolt_sched.php
index 29e522fa32..b8eecd0755 100644
--- a/html/user/bolt_sched.php
+++ b/html/user/bolt_sched.php
@@ -178,10 +178,7 @@ function show_nav($links, $up_link, $view_id) {
function show_item($iter, $view_id, $prev_view_id, $mode, $repeat=null) {
global $user;
global $course;
- global $bolt_ex_mode;
- global $bolt_ex_index;
- global $bolt_ex_score;
- global $bolt_query_string;
+ global $bolt_ex;
global $refresh;
global $url_args;
@@ -197,8 +194,8 @@ function show_item($iter, $view_id, $prev_view_id, $mode, $repeat=null) {
$next = "";
if ($item->is_exercise()) {
- $bolt_ex_mode = $mode;
- $bolt_ex_index = 0;
+ $bolt_ex->mode = $mode;
+ $bolt_ex->index = 0;
switch ($mode) {
case BOLT_MODE_SHOW:
echo "
@@ -220,7 +217,7 @@ function show_item($iter, $view_id, $prev_view_id, $mode, $repeat=null) {
case BOLT_MODE_ANSWER:
require($item->filename);
if (function_exists('bolt_divide')) bolt_divide();
- $score_pct = number_format($bolt_ex_score*100);
+ $score_pct = number_format($bolt_ex->score*100);
echo "Score: $score_pct%";
break;
}
@@ -269,12 +266,10 @@ function show_item($iter, $view_id, $prev_view_id, $mode, $repeat=null) {
// Show the student the results of an old exercise; no navigation items
//
function show_answer_page($iter, $score) {
- global $bolt_ex_mode;
- global $bolt_ex_index;
- global $bolt_query_string;
+ global $bolt_ex;
- $bolt_ex_mode = BOLT_MODE_ANSWER;
- $bolt_ex_index = 0;
+ $bolt_ex->mode = BOLT_MODE_ANSWER;
+ $bolt_ex->index = 0;
$item = $iter->item;
page_header();
@@ -397,8 +392,8 @@ case 'prev':
$v2 = BoltView::lookup_id($view->prev_view_id);
$result = BoltResult::lookup_id($v2->result_id);
srand($v2->id);
- $bolt_ex_score = $result->score;
- $bolt_ex_query_string = $result->response;
+ $bolt_ex->score = $result->score;
+ $bolt_ex->query_string = $result->response;
}
$view_id = create_view($iter, $mode, $view->prev_view_id);
show_item($iter, $view_id, $view->prev_view_id, $mode);
@@ -461,22 +456,22 @@ case 'answer': // submit answer in exercise
// compute the score
- $bolt_ex_query_string = $_SERVER['QUERY_STRING'];
- $bolt_ex_mode = BOLT_MODE_SCORE;
- $bolt_ex_index = 0;
- $bolt_ex_score = 0;
+ $bolt_ex->query_string = $_SERVER['QUERY_STRING'];
+ $bolt_ex->mode = BOLT_MODE_SCORE;
+ $bolt_ex->index = 0;
+ $bolt_ex->score = 0;
$bolt_query_string = $item->query_string;
srand($view_id);
ob_start(); // buffer output to avoid showing exercise text
require($item->filename);
ob_end_clean();
- $bolt_ex_score /= $bolt_ex_index;
+ $bolt_ex->score /= $bolt_ex->index;
if ($item->callback) {
$user->bolt->attrs = unserialize($user->bolt->attrs);
call_user_func(
- $item->callback, $user, $bolt_ex_score, $bolt_ex_query_string
+ $item->callback, $user, $bolt_ex->score, $bolt_ex->query_string
);
$user->bolt->attrs = serialize($user->bolt->attrs);
$attrs = $user->bolt->attrs;
@@ -489,7 +484,7 @@ case 'answer': // submit answer in exercise
$now = time();
$result_id = BoltResult::insert(
"(create_time, user_id, course_id, view_id, item_name, score, response)
- values ($now, $user->id, $course->id, $view->id, '$view->item_name', $bolt_ex_score, '$qs')"
+ values ($now, $user->id, $course->id, $view->id, '$view->item_name', $bolt_ex->score, '$qs')"
);
$view->update("result_id=$result_id");
@@ -499,7 +494,7 @@ case 'answer': // submit answer in exercise
$xset = $iter->xset;
if ($xset) {
$is_last = $xset->xset_record_score(
- $iter, $bolt_ex_score, $view->id, $avg_score, $repeat
+ $iter, $bolt_ex->score, $view->id, $avg_score, $repeat
);
if ($repeat) $repeat->avg_score = $avg_score;
if ($is_last) {
@@ -553,7 +548,7 @@ case 'answer_page':
}
$result = BoltResult::lookup_id($view->result_id);
srand($view_id);
- $bolt_ex_query_string = $result->response;
+ $bolt_ex->query_string = $result->response;
show_answer_page($iter, $result->score);
break;
case 'course_home':
@@ -636,9 +631,9 @@ case 'resume':
$view_orig = BoltView::lookup_id($view->prev_view_id);
$result = BoltResult::lookup_id($view_orig->result_id);
srand($view_orig->id);
- $bolt_ex_query_string = $result->response;
- $bolt_ex_score = $result->score;
- $bolt_ex_index = 0;
+ $bolt_ex->query_string = $result->response;
+ $bolt_ex->score = $result->score;
+ $bolt_ex->index = 0;
$view_id = create_view($iter, $mode, $view_orig->id);
show_item($iter, $view_id, $view_orig->id, $mode);
} else {