Skip to content

Commit b12b89d

Browse files
Learnpath: Fix adaptive test in lp returns status to "not attempted" - refs #7164
1 parent 61877b5 commit b12b89d

File tree

3 files changed

+118
-22
lines changed

3 files changed

+118
-22
lines changed

public/main/exercise/exercise.class.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10133,15 +10133,18 @@ public static function saveExerciseInLp($safe_item_id, $safe_exe_id, $course_id
1013310133
$exercise->read($row_dates['exe_exo_id']);
1013410134
$status = 'completed';
1013510135

10136-
if (!empty($exercise->pass_percentage)) {
10137-
$status = 'failed';
10138-
$success = ExerciseLib::isSuccessExerciseResult(
10139-
$score,
10140-
$max_score,
10141-
$exercise->pass_percentage
10142-
);
10143-
if ($success) {
10144-
$status = 'passed';
10136+
// Adaptive / self-evaluation quizzes must always complete the LP item
10137+
if ($exercise->getFeedbackType() !== EXERCISE_FEEDBACK_TYPE_DIRECT) {
10138+
if (!empty($exercise->pass_percentage)) {
10139+
$status = 'failed';
10140+
$success = ExerciseLib::isSuccessExerciseResult(
10141+
$score,
10142+
$max_score,
10143+
$exercise->pass_percentage
10144+
);
10145+
if ($success) {
10146+
$status = 'passed';
10147+
}
1014510148
}
1014610149
}
1014710150

public/main/exercise/exercise_submit.php

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,60 @@
127127
$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? (int) $_REQUEST['learnpath_item_id'] : 0;
128128
$learnpath_item_view_id = isset($_REQUEST['learnpath_item_view_id']) ? (int) $_REQUEST['learnpath_item_view_id'] : 0;
129129

130+
// If we are not explicitly in LP context, ignore any leaked LP params and clear persisted context.
131+
// This avoids attaching standalone exercises to the last learning path attempt.
132+
if ('learnpath' !== $origin) {
133+
Session::erase('learnpath_id');
134+
Session::erase('lp_id');
135+
Session::erase('learnpath_item_id');
136+
Session::erase('lp_item_id');
137+
Session::erase('learnpath_item_view_id');
138+
Session::erase('lp_item_view_id');
139+
140+
$learnpath_id = 0;
141+
$learnpath_item_id = 0;
142+
$learnpath_item_view_id = 0;
143+
}
144+
145+
if ('learnpath' === $origin) {
146+
// Normalize common aliases used by LP tool
147+
$learnpath_id = $learnpath_id > 0 ? $learnpath_id : (int) ($_REQUEST['lp_id'] ?? 0);
148+
149+
// Some links use item_id instead of learnpath_item_id
150+
$learnpath_item_id = $learnpath_item_id > 0
151+
? $learnpath_item_id
152+
: (int) ($_REQUEST['item_id'] ?? ($_REQUEST['lp_item_id'] ?? 0));
153+
154+
$learnpath_item_view_id = $learnpath_item_view_id > 0
155+
? $learnpath_item_view_id
156+
: (int) ($_REQUEST['lp_item_view_id'] ?? 0);
157+
158+
// Restore from session when modal/navigation loses query params
159+
if ($learnpath_id <= 0) {
160+
$learnpath_id = (int) (Session::read('learnpath_id') ?? Session::read('lp_id') ?? 0);
161+
}
162+
if ($learnpath_item_id <= 0) {
163+
$learnpath_item_id = (int) (Session::read('learnpath_item_id') ?? Session::read('lp_item_id') ?? 0);
164+
}
165+
if ($learnpath_item_view_id <= 0) {
166+
$learnpath_item_view_id = (int) (Session::read('learnpath_item_view_id') ?? Session::read('lp_item_view_id') ?? 0);
167+
}
168+
169+
// Persist context for future requests (modal, JS navigation, session resume)
170+
if ($learnpath_id > 0) {
171+
Session::write('learnpath_id', $learnpath_id);
172+
Session::write('lp_id', $learnpath_id);
173+
}
174+
if ($learnpath_item_id > 0) {
175+
Session::write('learnpath_item_id', $learnpath_item_id);
176+
Session::write('lp_item_id', $learnpath_item_id);
177+
}
178+
if ($learnpath_item_view_id > 0) {
179+
Session::write('learnpath_item_view_id', $learnpath_item_view_id);
180+
Session::write('lp_item_view_id', $learnpath_item_view_id);
181+
}
182+
}
183+
130184
$reminder = isset($_REQUEST['reminder']) ? (int) $_REQUEST['reminder'] : 0;
131185
$remind_question_id = isset($_REQUEST['remind_question_id']) ? (int) $_REQUEST['remind_question_id'] : 0;
132186
$exerciseId = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : 0;
@@ -572,6 +626,20 @@
572626
. "&page=" . ($page ?? 1)
573627
. "&" . api_get_cidreq();
574628

629+
// Base query strings used by JS navigation (keep LP context on every click).
630+
$submitBaseQuery = "exe_id=$exe_id&exerciseId=$exerciseId"
631+
. "&learnpath_id=$learnpath_id"
632+
. "&learnpath_item_id=$learnpath_item_id"
633+
. "&learnpath_item_view_id=$learnpath_item_view_id"
634+
. "&reminder=$reminder"
635+
. "&" . api_get_cidreq();
636+
637+
$resultBaseQuery = "exe_id=$exe_id"
638+
. "&learnpath_id=$learnpath_id"
639+
. "&learnpath_item_id=$learnpath_item_id"
640+
. "&learnpath_item_view_id=$learnpath_item_view_id"
641+
. "&" . api_get_cidreq();
642+
575643

576644
if (2 === $reminder && empty($myRemindList)) {
577645
if ($debug) {
@@ -1533,12 +1601,14 @@ function updateDuration() {
15331601
15341602
var page = '.(int) $page.';
15351603
var totalPages = '.(int) ($totalPages ?? 1).';
1604+
var chSubmitBaseUrl = "'.api_get_self().'?'.$submitBaseQuery.'";
1605+
var chResultUrl = "exercise_result.php?'.$resultBaseQuery.'";
15361606
function navigateNext() {
15371607
var url;
15381608
if (page === totalPages) {
1539-
url = "exercise_result.php?'.api_get_cidreq().'&exe_id='.$exe_id.'&learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id.'&learnpath_item_view_id='.$learnpath_item_view_id.'";
1609+
url = chResultUrl;
15401610
} else {
1541-
url = "'.api_get_self().'?'.api_get_cidreq().'&exerciseId='.$exerciseId.'&page=" + (page + 1) + "&reminder='.$reminder.'";
1611+
url = chSubmitBaseUrl + "&page=" + (page + 1);
15421612
}
15431613
window.location = url;
15441614
}
@@ -1682,11 +1752,8 @@ function previous_question(question_num) {
16821752
}
16831753
16841754
function previous_question_and_save(previous_question_id, question_id_to_save) {
1685-
var url = \'exercise_submit.php?'.api_get_cidreq().'\'
1686-
+ \'&exerciseId='.$exerciseId.'\'
1687-
+ \'&num=\' + previous_question_id
1688-
+ \'&reminder='.$reminder.'\';
1689-
save_now(question_id_to_save, url);
1755+
var url = chSubmitBaseUrl + "&num=" + previous_question_id;
1756+
save_now(question_id_to_save, url);
16901757
}
16911758
16921759
function redirectExerciseToResult()
@@ -2150,9 +2217,7 @@ function validate_all() {
21502217
$currentPageIds = implode(',', $questionList);
21512218
echo '<div class="exercise_actions exercise-pagination mb-4">';
21522219
if ($page > 1) {
2153-
$prevUrl = api_get_self() . '?' . api_get_cidreq()
2154-
. "&exerciseId=$exerciseId&page=" . ($page - 1)
2155-
. "&reminder=$reminder";
2220+
$prevUrl = api_get_self() . '?' . $submitBaseQuery . "&page=" . ($page - 1);
21562221
echo '<button type="button" class="btn btn--secondary" '
21572222
. "onclick=\"window.location='$prevUrl'\">"
21582223
. '' . get_lang('Previous')

public/main/exercise/exercise_submit_modal.php

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,37 @@
4646
api_not_allowed();
4747
}
4848

49-
$learnpath_id = (int) ($_REQUEST['learnpath_id'] ?? 0);
50-
$learnpath_item_id = (int) ($_REQUEST['learnpath_item_id'] ?? 0);
51-
$learnpath_item_view_id = (int) ($_REQUEST['learnpath_item_view_id'] ?? 0);
49+
$learnpath_id = (int) ($_REQUEST['learnpath_id'] ?? ($_REQUEST['lp_id'] ?? 0));
50+
$learnpath_item_id = (int) ($_REQUEST['learnpath_item_id'] ?? ($_REQUEST['item_id'] ?? ($_REQUEST['lp_item_id'] ?? 0)));
51+
$learnpath_item_view_id = (int) ($_REQUEST['learnpath_item_view_id'] ?? ($_REQUEST['lp_item_view_id'] ?? 0));
52+
53+
$origin = api_get_origin();
54+
55+
// Only restore LP context from session when we are really in learnpath origin.
56+
// Otherwise, stale LP session values can leak into standalone exercises.
57+
if ('learnpath' === $origin) {
58+
if ($learnpath_id <= 0) {
59+
$learnpath_id = (int) (Session::read('learnpath_id') ?? Session::read('lp_id') ?? 0);
60+
}
61+
if ($learnpath_item_id <= 0) {
62+
$learnpath_item_id = (int) (Session::read('learnpath_item_id') ?? Session::read('lp_item_id') ?? 0);
63+
}
64+
if ($learnpath_item_view_id <= 0) {
65+
$learnpath_item_view_id = (int) (Session::read('learnpath_item_view_id') ?? Session::read('lp_item_view_id') ?? 0);
66+
}
67+
} else {
68+
Session::erase('learnpath_id');
69+
Session::erase('lp_id');
70+
Session::erase('learnpath_item_id');
71+
Session::erase('lp_item_id');
72+
Session::erase('learnpath_item_view_id');
73+
Session::erase('lp_item_view_id');
74+
75+
$learnpath_id = 0;
76+
$learnpath_item_id = 0;
77+
$learnpath_item_view_id = 0;
78+
}
79+
5280
$exerciseId = (int) ($_GET['exerciseId'] ?? 0);
5381
$exeId = (int) (Session::read('exe_id') ?? 0);
5482
$preview = (int) ($_GET['preview'] ?? 0);

0 commit comments

Comments
 (0)