Skip to content

Commit 272af46

Browse files
committed
Exercise: Add exercise_subscribe_session_when_finished_failure conf setting to allow subscribing a user a session when the user has failed - refs BT#22403
1 parent ed3c958 commit 272af46

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

main/exercise/exercise.class.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2616,6 +2616,7 @@ public function createForm($form, $type = 'full')
26162616
'notifications',
26172617
'remedialcourselist',
26182618
'advancedcourselist',
2619+
'subscribe_session_when_finished_failure',
26192620
], //exclude
26202621
false, // filter
26212622
false, // tag as select
@@ -2676,6 +2677,25 @@ public function createForm($form, $type = 'full')
26762677
}
26772678
}
26782679

2680+
if (true === api_get_configuration_value('exercise_subscribe_session_when_finished_failure')) {
2681+
$optionSessionWhenFailure = [];
2682+
2683+
if ($failureSession = ExerciseLib::getSessionWhenFinishedFailure($this->iid)) {
2684+
$defaults['subscribe_session_when_finished_failure'] = $failureSession->getId();
2685+
$optionSessionWhenFailure[$failureSession->getId()] = $failureSession->getName();
2686+
}
2687+
2688+
$form->addSelectAjax(
2689+
'extra_subscribe_session_when_finished_failure',
2690+
get_lang('SubscribeSessionWhenFinishedFailure'),
2691+
$optionSessionWhenFailure,
2692+
[
2693+
'url' => api_get_path(WEB_AJAX_PATH).'session.ajax.php?'
2694+
.http_build_query(['a' => 'search_session']),
2695+
]
2696+
);
2697+
}
2698+
26792699
$settings = api_get_configuration_value('exercise_finished_notification_settings');
26802700
if (!empty($settings)) {
26812701
$options = [];

main/inc/lib/exercise.lib.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
/* For licensing terms, see /license.txt */
44

55
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
6+
use Chamilo\CoreBundle\Entity\Session as SessionEntity;
67
use Chamilo\CoreBundle\Entity\TrackEExercises;
78
use Chamilo\CourseBundle\Entity\CQuizQuestion;
89
use ChamiloSession as Session;
@@ -5792,6 +5793,13 @@ public static function displayQuestionListByAttempt(
57925793
$total_weight
57935794
);
57945795

5796+
if ($save_user_result
5797+
&& !$passed
5798+
&& true === api_get_configuration_value('exercise_subscribe_session_when_finished_failure')
5799+
) {
5800+
self::subscribeSessionWhenFinishedFailure($objExercise->iid);
5801+
}
5802+
57955803
$percentage = 0;
57965804
if (!empty($total_weight)) {
57975805
$percentage = ($total_score / $total_weight) * 100;
@@ -5812,6 +5820,40 @@ public static function displayQuestionListByAttempt(
58125820
];
58135821
}
58145822

5823+
public static function getSessionWhenFinishedFailure(int $exerciseId): ?SessionEntity
5824+
{
5825+
$objExtraField = new ExtraField('exercise');
5826+
$objExtraFieldValue = new ExtraFieldValue('exercise');
5827+
5828+
$subsSessionWhenFailureField = $objExtraField->get_handler_field_info_by_field_variable(
5829+
'subscribe_session_when_finished_failure'
5830+
);
5831+
$subsSessionWhenFailureValue = $objExtraFieldValue->get_values_by_handler_and_field_id(
5832+
$exerciseId,
5833+
$subsSessionWhenFailureField['id']
5834+
);
5835+
5836+
if (!empty($subsSessionWhenFailureValue['value'])) {
5837+
return api_get_session_entity((int) $subsSessionWhenFailureValue['value']);
5838+
}
5839+
5840+
return null;
5841+
}
5842+
5843+
private static function subscribeSessionWhenFinishedFailure(int $exerciseId): void
5844+
{
5845+
$failureSession = self::getSessionWhenFinishedFailure($exerciseId);
5846+
5847+
if ($failureSession) {
5848+
SessionManager::subscribeUsersToSession(
5849+
$failureSession->getId(),
5850+
[api_get_user_id()],
5851+
SESSION_VISIBLE_READ_ONLY,
5852+
false
5853+
);
5854+
}
5855+
}
5856+
58155857
/**
58165858
* It validates unique score when all user answers are correct by question.
58175859
* It is used for global questions.

main/install/configuration.dist.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2562,6 +2562,12 @@
25622562
// Then add the "@" symbol to the CQuiz class in the ORM\Column() line for its $textWhenFinishedFailure property.
25632563
//$_configuration['exercise_text_when_finished_failure'] = false;
25642564

2565+
// Add an option to subscribe the user at the end of test when the user has failed. Requires DB changes.
2566+
/*
2567+
INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES (17, 5, 'subscribe_session_when_finished_failure', 'SubscribeSessionWhenFinishedFailure', '', 0, 1, 0, 1, 0, NOW());
2568+
*/
2569+
//$_configuration['exercise_subscribe_session_when_finished_failure'] = false;
2570+
25652571
//hide copy icon in LP's authoring options
25662572
//$_configuration['lp_hide_copy_option'] = false;
25672573

0 commit comments

Comments
 (0)