From 87bdefa8e025ffcc345d9d9ab12ae320c9bb86ed Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Mon, 9 Nov 2020 15:51:18 +0100 Subject: [PATCH] Exercises: Fix remind list when using "block_category_questions" BT#17789 --- main/exercise/exercise.class.php | 56 ++++++++++---------- main/exercise/exercise_question_reminder.php | 4 ++ main/exercise/exercise_reminder.php | 11 ++++ main/exercise/exercise_submit.php | 17 +++--- main/inc/ajax/exercise.ajax.php | 42 ++++++++------- 5 files changed, 76 insertions(+), 54 deletions(-) diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index 54701845dd..ac304d3549 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -7076,31 +7076,32 @@ class Exercise } /** - * @param int $exe_id - * @param int $question_id + * @param int $exeId + * @param int $questionId * @param string $action */ - public function editQuestionToRemind($exe_id, $question_id, $action = 'add') + public function editQuestionToRemind($exeId, $questionId, $action = 'add') { - $exercise_info = self::get_stat_track_exercise_info_by_exe_id($exe_id); - $question_id = (int) $question_id; - $exe_id = (int) $exe_id; - $track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); + $exercise_info = self::get_stat_track_exercise_info_by_exe_id($exeId); + $questionId = (int) $questionId; + $exeId = (int) $exeId; + if ($exercise_info) { + $track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); if (empty($exercise_info['questions_to_check'])) { - if ($action == 'add') { + if ($action === 'add') { $sql = "UPDATE $track_exercises - SET questions_to_check = '$question_id' - WHERE exe_id = $exe_id "; + SET questions_to_check = '$questionId' + WHERE exe_id = $exeId "; Database::query($sql); } } else { $remind_list = explode(',', $exercise_info['questions_to_check']); $remind_list_string = ''; - if ($action == 'add') { - if (!in_array($question_id, $remind_list)) { + if ($action === 'add') { + if (!in_array($questionId, $remind_list)) { $newRemindList = []; - $remind_list[] = $question_id; + $remind_list[] = $questionId; $questionListInSession = Session::read('questionList'); if (!empty($questionListInSession)) { foreach ($questionListInSession as $originalQuestionId) { @@ -7111,11 +7112,11 @@ class Exercise } $remind_list_string = implode(',', $newRemindList); } - } elseif ($action == 'delete') { + } elseif ($action === 'delete') { if (!empty($remind_list)) { - if (in_array($question_id, $remind_list)) { + if (in_array($questionId, $remind_list)) { $remind_list = array_flip($remind_list); - unset($remind_list[$question_id]); + unset($remind_list[$questionId]); $remind_list = array_flip($remind_list); if (!empty($remind_list)) { @@ -7129,7 +7130,7 @@ class Exercise $value = Database::escape_string($remind_list_string); $sql = "UPDATE $track_exercises SET questions_to_check = '$value' - WHERE exe_id = $exe_id "; + WHERE exe_id = $exeId "; Database::query($sql); } } @@ -10244,8 +10245,12 @@ class Exercise $learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? (int) $_REQUEST['learnpath_item_id'] : 0; $learnpath_item_view_id = isset($_REQUEST['learnpath_item_view_id']) ? (int) $_REQUEST['learnpath_item_view_id'] : 0; - $remind_list = $exercise_stat_info['questions_to_check']; - $remind_list = explode(',', $remind_list); + if (empty($exercise_stat_info)) { + return ''; + } + + $remindList = $exercise_stat_info['questions_to_check']; + $remindList = explode(',', $remindList); $exeId = $exercise_stat_info['exe_id']; $exerciseId = $exercise_stat_info['exe_exo_id']; @@ -10257,14 +10262,10 @@ class Exercise $counter = 0; // Loop over all question to show results for each of them, one by one foreach ($questionList as $questionId) { - // destruction of the Question object - unset($objQuestionTmp); - // creates a temporary Question object - $objQuestionTmp = Question:: read($questionId); + $objQuestionTmp = Question::read($questionId); $check_id = 'remind_list['.$questionId.']'; - $attributes = ['id' => $check_id, 'onclick' => "save_remind_item(this, '$questionId');"]; - if (in_array($questionId, $remind_list)) { + if (in_array($questionId, $remindList)) { $attributes['checked'] = 1; } @@ -10280,7 +10281,7 @@ class Exercise '; $counter++; $questionTitle = $counter.'. '.strip_tags($objQuestionTmp->selectTitle()); - // Check if the question doesn't have an answer + // Check if the question doesn't have an answer. if (!in_array($questionId, $exercise_result)) { $questionTitle = Display::label($questionTitle, 'danger'); } @@ -10290,6 +10291,7 @@ class Exercise $questionTitle = Display::tag('label', $checkbox.$questionTitle, $label_attributes); $table .= Display::div($questionTitle, ['class' => 'exercise_reminder_item ']); } + $content .= Display::div('', ['id' => 'message']). Display::div($table, ['class' => 'question-check-test']); @@ -10301,7 +10303,7 @@ class Exercise }); function final_submit() { - // Normal inputs + // Normal inputs. window.location = "'.api_get_path(WEB_CODE_PATH).'exercise/exercise_result.php?'.api_get_cidreq().'&exe_id='.$exeId.'&" + lp_data; } diff --git a/main/exercise/exercise_question_reminder.php b/main/exercise/exercise_question_reminder.php index 93a893dda4..c14dead549 100644 --- a/main/exercise/exercise_question_reminder.php +++ b/main/exercise/exercise_question_reminder.php @@ -84,6 +84,10 @@ if ($validateCategory) { SET blocked_categories = '$value' WHERE exe_id = $exeId"; Database::query($sql); + + // Cleaning old remind list. + $objExercise->removeAllQuestionToRemind($exeId); + api_location($url.'&num='.$currentQuestion); } diff --git a/main/exercise/exercise_reminder.php b/main/exercise/exercise_reminder.php index ea7b24b049..9c7b04c6cb 100755 --- a/main/exercise/exercise_reminder.php +++ b/main/exercise/exercise_reminder.php @@ -101,6 +101,17 @@ echo Display::page_header(get_lang('QuestionsToReview')); if ($time_control) { echo $objExercise->returnTimeLeftDiv(); } + +$selectionType = $objExercise->getQuestionSelectionType(); +if (api_get_configuration_value('block_category_questions') && + ONE_PER_PAGE == $objExercise->type && + EX_Q_SELECTION_CATEGORIES_ORDERED_QUESTIONS_RANDOM == $selectionType +) { + // get last category question list + $categoryList = Session::read('categoryList'); + $question_list = end($categoryList); +} + echo $objExercise->getReminderTable($question_list, $exercise_stat_info); $exerciseActions = Display::url( diff --git a/main/exercise/exercise_submit.php b/main/exercise/exercise_submit.php index 62ea55b4af..b8bf6630db 100755 --- a/main/exercise/exercise_submit.php +++ b/main/exercise/exercise_submit.php @@ -641,6 +641,12 @@ if (api_get_configuration_value('block_category_questions') && $count++; } + // Use reminder list to get the current question. + if (2 === $reminder && !empty($myRemindList)) { + $remindQuestionId = current($myRemindList); + $questionCheck = Question::read($remindQuestionId); + } + $categoryId = 0; if (null !== $questionCheck) { $categoryId = $questionCheck->category; @@ -648,7 +654,6 @@ if (api_get_configuration_value('block_category_questions') && if (!empty($categoryId)) { $categoryInfo = $categoryList[$categoryId]; - $count = 1; $total = count($categoryList[$categoryId]); foreach ($categoryList[$categoryId] as $checkQuestionId) { @@ -673,9 +678,9 @@ if (api_get_configuration_value('block_category_questions') && } } - // Blocked if category was already answered + // Blocked if category was already answered. if ($categoryId && in_array($categoryId, $blockedCategories)) { - // Redirect to category intro + // Redirect to category intro. $url = api_get_path(WEB_CODE_PATH).'exercise/exercise_question_reminder.php?'. $params.'&num='.$current_question.'&category_id='.$isLastQuestionInCategory; api_location($url); @@ -841,9 +846,7 @@ if (is_null($current_question)) { } if ($question_count != 0) { - if ($objExercise->type == ALL_ON_ONE_PAGE || - $current_question > $question_count - ) { + if ($objExercise->type == ALL_ON_ONE_PAGE || $current_question > $question_count) { if (api_is_allowed_to_session_edit()) { // goes to the script that will show the result of the exercise if ($objExercise->type == ALL_ON_ONE_PAGE) { @@ -1108,11 +1111,11 @@ if ($showQuestionClock) { if (!in_array($origin, ['learnpath', 'embeddable'])) { echo '
'; } - if ($reminder == 2) { $data_tracking = $exercise_stat_info['data_tracking']; $data_tracking = explode(',', $data_tracking); $current_question = 1; //set by default the 1st question + if (!empty($myRemindList)) { // Checking which questions we are going to call from the remind list for ($i = 0; $i < count($data_tracking); $i++) { diff --git a/main/inc/ajax/exercise.ajax.php b/main/inc/ajax/exercise.ajax.php index 81de25b1f8..7c203255c8 100755 --- a/main/inc/ajax/exercise.ajax.php +++ b/main/inc/ajax/exercise.ajax.php @@ -351,27 +351,29 @@ switch ($action) { if (empty($objExercise) || empty($exeId)) { echo 0; exit; - } else { - $option = isset($_GET['option']) ? $_GET['option'] : ''; - switch ($option) { - case 'add_all': - $questionListInSession = Session::read('questionList'); - $objExercise->addAllQuestionToRemind($exeId, $questionListInSession); - break; - case 'remove_all': - $objExercise->removeAllQuestionToRemind($exeId); - break; - default: - $objExercise->editQuestionToRemind( - $exeId, - $_REQUEST['question_id'], - $_REQUEST['action'] - ); - break; - } - echo 1; - exit; } + + $option = isset($_GET['option']) ? $_GET['option'] : ''; + switch ($option) { + case 'add_all': + $questionListInSession = Session::read('questionList'); + $objExercise->addAllQuestionToRemind($exeId, $questionListInSession); + break; + case 'remove_all': + $objExercise->removeAllQuestionToRemind($exeId); + break; + default: + $objExercise->editQuestionToRemind( + $exeId, + $_REQUEST['question_id'], + $_REQUEST['action'] + ); + break; + } + + echo 1; + exit; + break; case 'save_exercise_by_now': $course_info = api_get_course_info_by_id($course_id);