= Bolt Tutorial, part II: Exercises = Now let's add an exercise. Create a file '''exercise1.php''': {{{ }}} and edit conifer.php: {{{ }}} The course structure is now [[Image(ex.png, nolink)]] Start the course from the beginning. When you get to the exercise you'll see [[Image(bolt_ex.jpg, nolink)]] You'll then see either [[Image(bolt_right.jpg, nolink)]] or [[Image(bolt_wrong.jpg, nolink)]] depending on whether you answered the question correctly. Some notes: * The correct answer is always the first choice listed. Bolt automatically randomly reorders the choices to remove any ordering effects. * The exercise page is used to generate both the exercise and the answer page. * If you look at your course history, you'll see that Bolt has stored your answers to the exercise, and your score, in its database. == Reviewing and repeating exercises == Suppose the student doesn't perform the exercise correctly, and you want to let them (or require them to) review the lessons and repeat the exercise? Bolt provides a powerful mechanism for this, called '''exercise sets'''. To illustrate this, first let's create a new exercise, '''conifer_ex2.php''': {{{ }}} This exercise is a set of true/false questions; the 0/1 arguments indicate which are true. Edit conifer.php to contain: {{{ function both_lessons() { return sequence( name('both lessons'), lesson( name('Introduction'), filename('conifer_intro.php') ), lesson( name('Conifers and deciduous trees'), filename('conifer_decid.php') ) ); } function second_lesson() { return lesson( name('Conifers and deciduous trees'), filename('conifer_decid.php') ); } function exercises() { return exercise_set( name('exercise set 1'), number(2), exercise( filename('conifer_ex1.php') ), exercise( filename('conifer_ex2.php') ), repeat(.3, both_lessons(), REVIEW), repeat(.7, second_lesson(), REVIEW|REPEAT), repeat(1, null, REPEAT|NEXT), refresh(array(7, 14, 28)) ); } return sequence( name('course'), both_lessons(), exercises() ); }}} The course structure is now: [[Image(xset.png, nolink)]]