bolt->update("sex=$sex, birth_year=$birth_year"); } $course_doc = require_once($course->doc_file); // The user clicked something on a view page. // Make a record of it, and of the time // function finalize_view($user, $view_id, $action) { if (!$view_id) return null; $view = BoltView::lookup_id($view_id); if (!$view) { error_page("no view"); } if ($view->user_id != $user->id) { error_page("wrong user"); } if (!$view->end_time) { $now = time(); $view->update("end_time=$now, action=$action"); } return $view; } function default_mode($item) { return $item->is_exercise()?BOLT_MODE_SHOW:BOLT_MODE_LESSON; } // A page is being shown to the user; make a record of it // function create_view($user, $course, $iter, $mode, $prev_view_id) { $now = time(); $item = $iter->item; if (!$item) { $item = null; $item->name = '--end--'; } $state = $iter->encode_state(); if ($user->bolt->debug) { echo "
Ending state: "; print_r($iter->state); echo "\n"; } return BoltView::insert("(user_id, course_id, item_name, start_time, mode, state, fraction_done, prev_view_id) values ($user->id, $course->id, '$item->name', $now, $mode, '$state', $iter->frac_done, $prev_view_id)"); } // show a page saying the course has been completed // function show_finished_page($course, $view_id, $prev_view_id) { page_head(null); if (function_exists('bolt_header')) bolt_header("Course completed"); echo "Congratulations - you have completed this course."; $prev = "id&action=prev&view_id=$view_id><< Prev"; echo "
$prev | Up |
$prev | id&action=course_home&view_id=$view_id>Up | $next |
Initial state: "; print_r($iter->state); echo "\n"; } $iter->next(); if ($user->bolt->debug) { echo "
Item: "; print_r($iter->item); echo "\n"; } if ($iter->item) { $state = $iter->encode_state(); $mode = default_mode($iter->item); $view_id = create_view($user, $course, $iter, $mode, $view->id); show_item($iter, $user, $course, $view_id, $view->id, $mode); } else { $iter->frac_done = 1; $fin_view_id = create_view($user, $course, $iter, BOLT_MODE_FINISHED, $view_id); $e->update("last_view_id=$fin_view_id"); show_finished_page($course, $fin_view_id, $view->id); } break; case 'answer': // submit answer in exercise $view = finalize_view($user, $view_id, BOLT_ACTION_SUBMIT); if ($user->bolt->debug) { echo "
State: $view->state\n"; } $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->at(); if ($user->bolt->debug) { echo "
Item: "; print_r($iter->item); echo "\n"; } $item = $iter->item; if (!$item->is_exercise()) { print_r($item); error_page("expected an exercise"); } if ($view->item_name != $item->name) { error_page("unexpected name"); } // 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_query_string = $item->query_string; srand($view_id); ob_start(); // turn on output buffering require($item->filename); ob_end_clean(); $bolt_ex_score /= $bolt_ex_index; // make a record of the result $qs = BoltDb::escape_string($_SERVER['QUERY_STRING']); $result_id = BoltResult::insert( "(view_id, score, response) values ($view->id, $bolt_ex_score, '$qs')" ); $view->update("result_id=$result_id"); // show the answer page srand($view_id); $view_id = create_view($user, $course, $iter, BOLT_MODE_ANSWER, $view->id); show_item($iter, $user, $course, $view_id, $view->id, BOLT_MODE_ANSWER); break; case 'answer_page': $view = BoltView::lookup_id($view_id); $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->at(); if ($iter->item->name != $view->item_name) { error_page("Exercise no longer exists in course"); } $result = BoltResult::lookup_id($view->result_id); srand($view_id); $bolt_ex_query_string = $result->response; show_answer_page($iter, $result->score); break; case 'course_home': $view = finalize_view($user, $view_id, BOLT_ACTION_COURSE_HOME); Header("Location: bolt.php"); break; default: $view = $e?BoltView::lookup_id($e->last_view_id):null; if (!$view) { start_course($user, $course, $course_doc); break; } if ($view->mode == BOLT_MODE_FINISHED) { show_finished_page($course, $view->id, $view->prev_view_id); break; } $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->at(); $mode = $view->mode; if ($view->item_name == $iter->item->name && ($mode == BOLT_MODE_ANSWER)) { // if we're returning to an answer page, // we need to look up the user's responses and the score. // $view_orig = BoltView::lookup_id($view->prev_view_id); $result = BoltResult::lookup_id($view_orig->result_id); srand($view_orig->id); echo "reshow: $result->response"; $bolt_ex_query_string = $result->response; $bolt_ex_score = $result->score; $bolt_ex_index = 0; $view_id = create_view($user, $course, $iter, $mode, $view_orig->id); show_item($iter, $user, $course, $view_id, $view_orig->id, $mode); } else { $view_id = create_view($user, $course, $iter, $mode, $view->id); show_item($iter, $user, $course, $view_id, $view->id, $mode); } break; } ?>