Explains the setup for a Pretest, where remaining questions are skipped if the learner cannot get a passing score anymore.
Yesterday I published an example project, based on a question in this community. The user wanted to add a learner-friendly feature to a pretest: if it would become impossible to obtain a passing score, the learner should be navigated immediately to content slides. I described a similar workflow 7 years ago, but for normal quiz slides. Same setup is impossible for the default Pretest slides, because one of their limitations is that you cannot trigger an advanced nor shared actions with the On Enter event of the slide. That is possible with normal quiz slides, which I used in the example file. This blog explains the setup.
Several variables were used in the file, both quizzing system and user variables:
cpQuizInfoPointsPerQuestionSlide: reusable variable, has the max score which the learner can get on the active quiz slide
cpQuizInfoPointsscored: the points scored so far by the learner, is updated after the Submit button is clicked.
cpInfoLastVisitedSlide: is used to check if the learner gets to a slide from the previous slide or from another slide (because getting a passing score has become impossible.
v_MaxPretest: has to be defined with the maximum score possible for the Pretest. In the example file I could have used the system variable cpQuizInfoTotalQuizPoints. I preferred not to do so. If the developer wants a final quiz in the same course, that variable has to be manipulated with JS or with the CpExtra Widget (InfoSemantics). The value has to be filled in on definition, in this case it was 40 points. All questions also have penalty, and partial score for MCQ with multiple correct answers.
v_PassPerc: required pass percentage for the Pretest. As explained for the previous variable, I preferred a specific variable instead of the system variable cpQuizInfoPassPercent. The value has to be filled in on definition, in this case it was set to 80 %.
v_PassScore: will be calculated from the two previous variables (is same in the example as cpQuizInfoPassPoints.
v_MaxUntil: will be calculated. What is the maximum score the learner would have gotten until the present question (all answers correct).
v_MaxRemain: will be calculated. What is the maximum score the learner can obtain with the remaining questions? Logically the sum of v_MaxUntil and v_MaxRemain should be equal to v_MaxPretest.
v_Possible: will be calculated, what is the maximum score which the learner can obtain if he/she gives a correct answer to all questions still to be answered.
Advanced Actions – Events
I used 4 advanced actions in the project. Three of them are triggered by On Enter Slide events, and one by all Success and Last Attempt actions for the quiz slides. I had only one attempt in each quiz slide.
This action is triggered by the On Enter event of the first Question slide. No condition in this action, just a sequence of commands. It is meant to calculate the values of some system variables as you can see in this screenshot:
The variable v_Passcore is calculated from two other variables which had a default value. In this case it was 40 points maximum score and 80% required for passing the test. Result will be 32 points for v_Passscore.
The variable v_MaxUntil will get its first value, which is the score for this first quiz slide.
Is also pretty simple, not conditional and is triggered by all On Enter events of the question slides, with the exception of the first one (used 6 times in the example file). On each slide the variable v_Until is increased with the new value of the question score on that slide.
This action is triggered by both the Success and the Last Attempt action of each quiz slide, in total 14 times.
The trick here is to calculate v_Possible, which is the maximum score a learner can still get after the present question, supposing he/she will give a correct answer to all the remaining questions (value of v_MaxRemain). Learner already obtained a score stored in cpQuizInfoPointsscored. That calculation happens in the first decision ‘Maths’.
Second decision is conditional, and will navigate the learner out of the Pretest (Jump to Score slide) if he will not be able to pass the test.
This is the most complicated action, because it has to take care of three situations, each of them has a conditional decision:
- If the learner has finished all questions (last visited slide was slide 8, which is the last question slide), but did fail, (comparing score with v_PassScore). In that case the appropriate state of an multistate SVG and a multistate text container is shown. The Next button appears as well.
- If the learner has not finished all questions, (last visited slide was not slide 8) another state is made visible for both multistate objects, and the Next button appears.
- If the learner has a passing score for the test, another state is shown and not the Next button, but the ‘ToTest’ button appears, which will navigate the learner to the results slide (from which a separate quiz file can be launched).
Next button has the usual ‘Go to Next Slide’, whereas the ToTest’ button jumps to the results slide, which is the last slide in the example file.