get_stat_track_exercise_info_by_exe_id($exe_id); if (!empty($exercise_stat_info) && isset($exercise_stat_info['exe_exo_id'])) { header('Location: overview.php?exerciseId='.$exercise_stat_info['exe_exo_id'].'&'.api_get_cidreq()); exit; } api_not_allowed(true); } $js = ''; $htmlHeadXtra[] = $js; if (api_is_in_gradebook()) { $interbreadcrumb[] = [ 'url' => Category::getUrl(), 'name' => get_lang('ToolGradebook'), ]; } $nameTools = get_lang('Exercises'); $interbreadcrumb[] = [ 'url' => 'exercise.php?'.api_get_cidreq(), 'name' => get_lang('Exercises'), ]; $htmlHeadXtra[] = ''; $htmlHeadXtra[] = ''; $htmlHeadXtra[] = ''; if (api_get_configuration_value('quiz_prevent_copy_paste')) { $htmlHeadXtra[] = ''; } if (!empty($objExercise->getResultAccess())) { $htmlHeadXtra[] = api_get_css( api_get_path(WEB_LIBRARY_PATH).'javascript/epiclock/renderers/minute/epiclock.minute.css' ); $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js'); $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.epiclock.min.js'); $htmlHeadXtra[] = api_get_js('epiclock/renderers/minute/epiclock.minute.js'); } $showHeader = false; $showFooter = false; $pageActions = ''; $pageTop = ''; $pageBottom = ''; $pageContent = ''; if (!in_array($origin, ['learnpath', 'embeddable', 'mobileapp'])) { // So we are not in learnpath tool $showHeader = true; } // I'm in a preview mode as course admin. Display the action menu. if (api_is_course_admin() && !in_array($origin, ['learnpath', 'embeddable'])) { $pageActions = Display::toolbarAction( 'exercise_result_actions', [ Display::url( Display::return_icon('back.png', get_lang('GoBackToQuestionList'), [], 32), 'admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id ) .Display::url( Display::return_icon('edit.png', get_lang('ModifyExercise'), [], 32), 'exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->id ), ] ); } $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id); $learnpath_id = isset($exercise_stat_info['orig_lp_id']) ? $exercise_stat_info['orig_lp_id'] : 0; $learnpath_item_id = isset($exercise_stat_info['orig_lp_item_id']) ? $exercise_stat_info['orig_lp_item_id'] : 0; $learnpath_item_view_id = isset($exercise_stat_info['orig_lp_item_view_id']) ? $exercise_stat_info['orig_lp_item_view_id'] : 0; $logInfo = [ 'tool' => TOOL_QUIZ, 'tool_id' => $objExercise->id, 'action' => $learnpath_id, 'action_details' => $learnpath_id, ]; Event::registerLog($logInfo); if ($origin === 'learnpath') { $pageTop .= '
'; } $i = $total_score = $max_score = 0; $remainingMessage = ''; $attemptButton = ''; if ($origin !== 'embeddable') { $attemptButton = Display::toolbarButton( get_lang('AnotherAttempt'), api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&'.http_build_query( [ 'exerciseId' => $objExercise->id, 'learnpath_id' => $learnpath_id, 'learnpath_item_id' => $learnpath_item_id, 'learnpath_item_view_id' => $learnpath_item_view_id, ] ), 'pencil-square-o', 'info' ); } // We check if the user attempts before sending to the exercise_result.php if ($objExercise->selectAttempts() > 0) { $attempt_count = Event::get_attempt_count( api_get_user_id(), $objExercise->id, $learnpath_id, $learnpath_item_id, $learnpath_item_view_id ); if ($attempt_count >= $objExercise->selectAttempts()) { Display::addFlash( Display::return_message( sprintf(get_lang('ReachedMaxAttempts'), $objExercise->selectTitle(), $objExercise->selectAttempts()), 'warning', false ) ); if (!in_array($origin, ['learnpath', 'embeddable'])) { $showFooter = true; } $template = new Template($nameTools, $showHeader, $showFooter); $template->assign('actions', $pageActions); $template->display_one_col_template(); exit; } else { $attempt_count++; $remainingAttempts = $objExercise->selectAttempts() - $attempt_count; if ($remainingAttempts) { $attemptMessage = sprintf(get_lang('RemainingXAttempts'), $remainingAttempts); $remainingMessage = sprintf('

%s

%s', $attemptMessage, $attemptButton); } } } else { $remainingMessage = $attemptButton ? "

$attemptButton

" : ''; } $total_score = 0; if (!empty($exercise_stat_info)) { $total_score = $exercise_stat_info['exe_result']; } $max_score = $objExercise->get_max_score(); if ($origin === 'embeddable') { $pageTop .= showEmbeddableFinishButton(); } else { Display::addFlash( Display::return_message(get_lang('Saved'), 'normal', false) ); } $saveResults = true; $feedbackType = $objExercise->getFeedbackType(); ob_start(); // Display and save questions ExerciseLib::displayQuestionListByAttempt( $objExercise, $exe_id, $saveResults, $remainingMessage ); $pageContent .= ob_get_contents(); ob_end_clean(); // Save here LP status if (!empty($learnpath_id) && $saveResults) { // Save attempt in lp Exercise::saveExerciseInLp($learnpath_item_id, $exe_id); } $hookQuizEnd = HookQuizEnd::create(); $hookQuizEnd->setEventData(['exe_id' => $exe_id]); $hookQuizEnd->notifyQuizEnd(); // Unset session for clock time ExerciseLib::exercise_time_control_delete( $objExercise->id, $learnpath_id, $learnpath_item_id ); ExerciseLib::delete_chat_exercise_session($exe_id); if (!in_array($origin, ['learnpath', 'embeddable', 'mobileapp'])) { $pageBottom .= '
'; $pageBottom .= Display::url( get_lang('ReturnToCourseHomepage'), api_get_course_url(), ['class' => 'btn btn-primary'] ); $pageBottom .= '
'; if (api_is_allowed_to_session_edit()) { Exercise::cleanSessionVariables(); } $showFooter = true; } elseif (in_array($origin, ['embeddable', 'mobileapp'])) { if (api_is_allowed_to_session_edit()) { Exercise::cleanSessionVariables(); } Session::write('attempt_remaining', $remainingMessage); $showFooter = false; } else { $lp_mode = Session::read('lp_mode'); $url = '../lp/lp_controller.php?'.api_get_cidreq().'&action=view&lp_id='.$learnpath_id .'&lp_item_id='.$learnpath_item_id.'&exeId='.$exercise_stat_info['exe_id'] .'&fb_type='.$objExercise->getFeedbackType().'#atoc_'.$learnpath_item_id; $href = $lp_mode === 'fullscreen' ? ' window.opener.location.href="'.$url.'" ' : ' top.location.href="'.$url.'"'; if (api_is_allowed_to_session_edit()) { Exercise::cleanSessionVariables(); } Session::write('attempt_remaining', $remainingMessage); // Record the results in the learning path, using the SCORM interface (API) $pageBottom .= ""; $pageBottom .= ''; $showFooter = false; } $template = new Template($nameTools, $showHeader, $showFooter); $template->assign('page_top', $pageTop); $template->assign('page_content', $pageContent); $template->assign('page_bottom', $pageBottom); $layout = $template->fetch( $template->get_template('exercise/result.tpl') ); $template->assign('actions', $pageActions); $template->assign('content', $layout); $template->display_one_col_template(); function showEmbeddableFinishButton() { $js = ''; $html = Display::tag( 'p', Display::toolbarButton( get_lang('GoBackToVideo'), '#', 'undo', 'warning', ['role' => 'button', 'class' => 'btn-close-quiz'] ), ['class' => 'text-center'] ); return $js.PHP_EOL.$html; }