bolt->update("sex=$sex, birth_year=$birth_year"); } $course_doc = require_once($course->doc_file); function finalize_view($user, $view_id, $action) { if (!$view_id) return null; $view = BoltView::lookup_id($view_id); if ($view && $view->user_id == $user->id && !$view->end_time) { $now = time(); $view->update("end_time=$now, action=$action"); return $view; } return null; } function default_mode($item) { return $item->is_exercise()?BOLT_MODE_SHOW:BOLT_MODE_LESSON; } function create_view($user, $course, $iter, $mode) { $now = time(); $item = $iter->item; $state = $iter->encode_state(); return BoltView::insert("(user_id, course_id, item_name, start_time, mode, state, fraction_done) values ($user->id, $course->id, '$item->name', $now, $mode, '$state', $iter->frac_done)"); } function show_item($iter, $user, $course, $view_id, $mode) { global $bolt_ex_mode; global $bolt_ex_index; $item = $iter->item; if ($item->is_exercise()) { $bolt_ex_mode = $mode; $bolt_ex_index = 0; switch ($mode) { case BOLT_MODE_SHOW: echo "
id> "; srand($view_id); require($item->filename); echo "

"; break; case BOLT_MODE_ANSWER: require($item->filename); echo "

id&action=next&view_id=$view_id>Next"; break; } } else { require_once($item->filename); echo "

id&action=next&view_id=$view_id>Next"; } echo "

Fraction done: $iter->frac_done

id>Course history

id&action=prev&view_id=$view_id>Prev "; } function start_course($user, $course, $course_doc) { BoltEnrollment::delete($user->id, $course->id); $iter = new BoltIter($course_doc); $iter->at(); $now = time(); $mode = default_mode($iter->item); $view_id = create_view($user, $course, $iter, $mode); BoltEnrollment::insert("(create_time, user_id, course_id, last_view_id) values ($now, $user->id, $course->id, $view_id)"); show_item($iter, $user, $course, $view_id, $mode); } $e = BoltEnrollment::lookup($user->id, $course_id); switch ($action) { case 'start': if (info_incomplete($user)) { request_info($user, $course); exit(); } if ($e) { page_head("Confirm start"); echo "You are already enrolled in $course->name. Are you sure you want to start from the beginning? "; show_button( "bolt_sched.php?action=start_confirm&course_id=$course->id", "Yes", "Start this course from the beginning" ); page_tail(); exit(); } case 'start_confirm': start_course($user, $course, $course_doc); break; case 'update_info': update_info(); start_course($user, $course, $course_doc); case 'prev': $view = finalize_view($user, $view_id, BOLT_ACTION_NEXT); break; case 'next': // "next" button in lesson or exercise answer page $view = finalize_view($user, $view_id, BOLT_ACTION_NEXT); $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->next(); if (!$iter->item) { page_head("Done with course"); echo "All done!"; page_tail(); exit(); } $state = $iter->encode_state(); $mode = default_mode($iter->item); $view_id = create_view($user, $course, $iter, $mode); show_item($iter, $user, $course, $view_id, $mode); break; case 'answer': // submit answer in exercise $view = finalize_view($user, $view_id, BOLT_ACTION_SUBMIT); $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->at(); $item = $iter->item; if (!$item->is_exercise()) { error_page("expected an exercise"); } if ($view->item_name != $item->name) { error_page("unexpected name"); } $bolt_ex_mode = BOLT_MODE_SCORE; $bolt_ex_index = 0; $bolt_ex_score = 0; $bolt_ex_response = ""; srand($view_id); ob_start(); // turn on output buffering require($item->filename); ob_end_clean(); $bolt_ex_response = BoltDb::escape_string($bolt_ex_response); $result_id = BoltResult::insert( "(view_id, score, response) values ($view->id, $bolt_ex_score, '$bolt_ex_response')" ); $view->update("result_id=$result_id"); srand($view_id); $view_id = create_view($user, $course, $iter, BOLT_MODE_ANSWER); show_item($iter, $user, $course, $view_id, BOLT_MODE_ANSWER); break; default: $iter = new BoltIter($course_doc); $iter->decode_state($view->state); $iter->at(); $mode = default_mode($iter->item); $view_id = create_view($user, $course, $iter, $mode); show_item($iter, $user, $course, $view_id, $mode); break; } ?>