function showResult($object_test, $id_param) { if (!checkPerm('view', true, 'organization') && !checkPerm('view', true, 'storage')) { die("You can't access"); } require_once _base_ . '/lib/lib.form.php'; require_once $GLOBALS['where_lms'] . '/class.module/track.test.php'; require_once $GLOBALS['where_lms'] . '/lib/lib.param.php'; require_once $GLOBALS['where_lms'] . '/lib/lib.test.php'; $lang =& DoceboLanguage::createInstance('test'); $id_test = $object_test->getId(); $id_reference = getLoParam($id_param, 'idReference'); $url_coded = urlencode(serialize($object_test->back_url)); $id_track = retriveTrack($id_reference, $id_test, Docebo::user()->getIdst()); if ($id_track === false) { $GLOBALS['page']->add(getErrorUi($lang->def('_TEST_TRACK_FAILURE') . getBackUi(Util::str_replace_once('&', '&', $object_test->back_url), $lang->def('_BACK'))), 'content'); } $test_man = new TestManagement($id_test); $play_man = new PlayTestManagement($id_test, Docebo::user()->getIdst(), $id_track, $test_man); $test_info = $test_man->getTestAllInfo(); $track_info = $play_man->getTrackAllInfo(); $previous_page = importVar('previous_page', false, false); $new_info = array('last_page_seen' => $previous_page, 'score_status' => 'doing'); if (isset($_POST['page_to_save']) && ($_POST['page_to_save'] > $track_info['last_page_saved'] || $test_info['mod_doanswer'])) { $play_man->storePage($_POST['page_to_save'], $test_info['mod_doanswer']); $play_man->closeTrackPageSession($_POST['page_to_save']); } $now = date('Y-m-d H:i:s'); $point_do = 0; $max_score = 0; $num_manual = 0; $manual_score = 0; $point_do_cat = array(); $re_visu_quest = sql_query("SELECT idQuest \r\n\tFROM " . $GLOBALS['prefix_lms'] . "_testtrack_quest \r\n\tWHERE idTrack = '" . $id_track . "' "); while (list($id_q) = sql_fetch_row($re_visu_quest)) { $quest_see[] = $id_q; } $reQuest = sql_query("\r\n\tSELECT q.idQuest, q.type_quest, t.type_file, t.type_class, q.idCategory \r\n\tFROM %lms_testquest AS q JOIN " . $GLOBALS['prefix_lms'] . "_quest_type AS t\r\n\tWHERE q.idTest = '" . $id_test . "' AND q.type_quest = t.type_quest AND q.idQuest IN (" . implode($quest_see, ',') . ") \r\n\tORDER BY q.sequence"); //#2093: Conto le domande $tot_questions = 0; $tot_answers = 0; $tot_rightanswers = 0; $tot_questions = $test_man->getNumberOfQuestion(); while (list($id_quest, $type_quest, $type_file, $type_class, $id_cat) = sql_fetch_row($reQuest)) { require_once $GLOBALS['where_lms'] . '/modules/question/' . $type_file; $quest_point_do = 0; $quest_obj = new $type_class($id_quest); $quest_point_do = $quest_obj->userScore($id_track); $quest_max_score = $quest_obj->getMaxScore(); if ($quest_obj->getScoreSetType() == 'manual') { ++$num_manual; $manual_score = round($manual_score + $quest_max_score, 2); } //#2093: Conto le risposte, conto le risposte corrette $tot_answers++; if ($quest_point_do == $quest_max_score) { $tot_rightanswers++; } $point_do = round($point_do + $quest_point_do, 2); $max_score = round($max_score + $quest_max_score, 2); if (isset($point_do_cat[$id_cat])) { $point_do_cat[$id_cat] = round($quest_point_do + $point_do_cat[$id_cat], 2); } else { $point_do_cat[$id_cat] = round($quest_point_do, 2); } } if ($test_info['point_type'] == '1') { // percentage score (%) // x:100=$point_do:$max_score //#2093: calcolo effettivo solo se ho tutte le risposte if ($tot_questions == $tot_answers) { $point_do = round(100 * $point_do / $max_score); //$max_score$test_info['point_required'] } else { $point_do = round(100 * $tot_rightanswers / $tot_questions); //$max_score$test_info['point_required'] } } $save_score = $point_do; // save new status in track if ($point_do >= $test_info['point_required']) { $next_status = 'passed'; if ($test_info['show_only_status']) { $score_status = 'passed'; } } else { $next_status = 'failed'; if ($test_info['show_only_status']) { $score_status = 'not_passed'; } } if (!$test_info['show_only_status']) { if ($num_manual != 0) { $score_status = 'not_checked'; } else { $score_status = 'valid'; } } $test_track = new Track_Test($id_track); $test_track->setDate($now); $test_track->status = $next_status; $test_track->update(); // -- require_once _lms_ . '/lib/lib.assessment_rule.php'; $score_arr = array(); $i = 0; foreach ($point_do_cat as $cat_id => $score) { $score_arr[$i]['score'] = $score; $score_arr[$i]['category_id'] = $cat_id; $i++; } // final score: $score_arr[$i]['score'] = $point_do; $score_arr[$i]['category_id'] = 0; $asrule = new AssessmentRuleManager($id_test); $feedback_txt = $asrule->setRulesFromScore($score_arr); $asrule->loadJs(); // -- $GLOBALS['page']->add(getTitleArea($lang->def('_TITLE') . ' : ' . $test_info['title'], 'test', $lang->def('_TEST_INFO')) . '<div class="std_block">' . ($next_status == 'failed' ? '<b>' . $lang->def('_TEST_FAILED') . '</b>' : $lang->def('_TEST_COMPLETED')) . '<br />', 'content'); if ($test_info['point_type'] != '1') { $save_score = $point_do; } else { $save_score = $point_do; //round(round($point_do / $max_score, 2) * 100, 2); } $track_info = Track_Test::getTrackInfo(Docebo::user()->getIdst(), $id_test, $id_reference); if ($score_status == 'valid' || $score_status == 'not_checked' || $score_status == 'passed' || $score_status == 'not_passed') { $new_info['date_end_attempt'] = $now; $new_info['number_of_save'] = $track_info['number_of_save'] + 1; $new_info['score'] = $save_score; $new_info['score_status'] = $score_status; $new_info['number_of_attempt'] = $track_info['number_of_attempt'] + 1; $re_update = Track_Test::updateTrack($id_track, $new_info); if (!isset($_POST['show_review'])) { $time = fromDatetimeToTimestamp(date('Y-m-d H:i:s')) - fromDatetimeToTimestamp($_SESSION['test_date_begin']); sql_query("\r\n INSERT INTO " . $GLOBALS['prefix_lms'] . "_testtrack_times\r\n (idTrack, idReference, idTest, date_attempt, number_time, score, score_status, date_begin, date_end, time) VALUES\r\n ('" . $id_track . "', '" . $id_reference . "', '" . $id_test . "', now(), '" . $new_info['number_of_save'] . "', '" . $new_info['score'] . "', '" . $new_info['score_status'] . "', '" . $_SESSION['test_date_begin'] . "', '" . date('Y-m-d H:i:s') . "', '" . $time . "')"); unset($_SESSION['test_date_begin']); } } //--- check suspension conditions ---------------------------------------------- if ($test_info['use_suspension']) { $suspend_info = array(); if ($next_status == 'failed') { $suspend_info['attempts_for_suspension'] = $track_info['attempts_for_suspension'] + 1; if ($suspend_info['attempts_for_suspension'] >= $test_info['suspension_num_attempts'] && $test_info['suspension_num_hours'] > 0) { //should we reset learning_test.suspension_num_attempts ?? $suspend_info['attempts_for_suspension'] = 0; //from now on, it uses the suspended_until parameter, so only the date is needed, we can reset the attempts count $suspend_info['suspended_until'] = date("Y-m-d H:i:s", time() + $test_info['suspension_num_hours'] * 3600); } //if num_hours is <= 0, never update attempts counter, so user won't never be de-suspended $re = Track_Test::updateTrack($id_track, $suspend_info); } else { if ($next_status == 'completed' || $next_status == 'passed') { $suspend_info['attempts_for_suspension'] = 0; $re = Track_Test::updateTrack($id_track, $suspend_info); } } } //--- end suspensions check ---------------------------------------------------- list($bonus_score, $score_status) = sql_fetch_row(sql_query("\r\n\tSELECT bonus_score, score_status\r\n\tFROM " . $GLOBALS['prefix_lms'] . "_testtrack \r\n\tWHERE idTrack = '" . (int) $id_track . "'")); if ($test_info['show_score'] && $test_info['point_type'] != '1') { //$GLOBALS['page']->add('<span class="test_score_note">'.$lang->def('_TEST_TOTAL_SCORE').'</span> '.($point_do + $bonus_score).' / '.$max_score.'<br />', 'content'); $GLOBALS['page']->add('<span class="test_score_note">' . $lang->def('_TEST_TOTAL_SCORE') . '</span> ' . ($point_do + $bonus_score) . ' / 100<br />', 'content'); if ($num_manual != 0 && $score_status != 'valid') { $GLOBALS['page']->add('<br />' . '<span class="test_score_note">' . $lang->def('_TEST_MANUAL_SCORE') . '</span> ' . $manual_score . ' ' . $lang->def('_TEST_SCORES') . '<br />', 'content'); } if ($test_info['point_required'] != 0) { $GLOBALS['page']->add('<br />' . '<span class="test_score_note">' . $lang->def('_TEST_REQUIREDSCORE_RESULT') . '</span> ' . $test_info['point_required'] . '<br />', 'content'); } } if ($test_info['show_score'] && $test_info['point_type'] == '1') { $GLOBALS['page']->add('<span class="test_score_note">' . $lang->def('_TEST_TOTAL_SCORE') . '</span> ' . $save_score . ' %' . '<br />', 'content'); if ($num_manual != 0) { $GLOBALS['page']->add('<br />' . '<span class="test_score_note">' . $lang->def('_TEST_MANUAL_SCORE') . '</span> ' . $manual_score . ' ' . $lang->def('_TEST_SCORES') . '<br />', 'content'); } } if ($test_info['show_score_cat']) { $re_category = sql_query("\r\n\t\tSELECT c.idCategory, c.name, COUNT(q.idQuest)\r\n\t\tFROM " . $GLOBALS['prefix_lms'] . "_testquest AS q \r\n\t\t\tJOIN " . $GLOBALS['prefix_lms'] . "_quest_category AS c\r\n\t\tWHERE c.idCategory = q.idCategory AND q.idTest = '" . $id_test . "' AND q.idCategory != 0 \r\n\t\tGROUP BY c.idCategory \r\n\t\tORDER BY c.name"); if (sql_num_rows($re_category)) { $GLOBALS['page']->add('<br />' . '<table summary="' . $lang->def('_TEST_CATEGORY_SCORE') . '" class="category_score">' . '<caption>' . $lang->def('_TEST_CATEGORY_SCORE') . '</caption>' . '<thead>' . '<tr>' . '<th>' . $lang->def('_TEST_QUEST_CATEGORY') . '</th>' . '<th class="number">' . $lang->def('_TEST_QUEST_NUMBER') . '</th' . '<th class="number">' . $lang->def('_TEST_TOTAL_SCORE') . '</th>' . '</tr>' . '</thead>' . '<tbody>', 'content'); while (list($id_cat, $name_cat, $quest_number) = sql_fetch_row($re_category)) { $GLOBALS['page']->add('<tr><td>' . $name_cat . '</td>' . '<td class="number">' . $quest_number . '</td>' . '<td class="number">' . (isset($point_do_cat[$id_cat]) ? $point_do_cat[$id_cat] : 0) . '</td></tr>', 'content'); } /* $GLOBALS['page']->add('<br />' .'<span class="test_score_note">'.$lang->def('_TEST_CATEGORY_SCORE').'</span><br />', 'content'); while(list($id_cat, $name_cat, $quest_number) = sql_fetch_row($re_category)) { $GLOBALS['page']->add($name_cat.', '.$lang->def('_TEST_SCORES').': ' .( isset($point_do_cat[$id_cat]) ? $point_do_cat[$id_cat] : 0 ).'<br />', 'content'); } */ $GLOBALS['page']->add('</tbody></table>', 'content'); } } $GLOBALS['page']->add('<br /><br />', 'content'); //--- if chart visualization enabled, then show it --------------------------- require_once _base_ . '/lib/lib.json.php'; $json = new Services_JSON(); if ($test_info['chart_options'] !== "") { $chart_options = $json->decode($test_info['chart_options']); } else { $chart_options = new stdClass(); } if (!property_exists($chart_options, 'use_charts')) { $chart_options->use_charts = false; } if (!property_exists($chart_options, 'selected_chart')) { $chart_options->selected_chart = 'column'; } if (!property_exists($chart_options, 'show_chart')) { $chart_options->show_chart = 'teacher'; } if ($chart_options->use_charts && $chart_options->show_chart == 'course') { cout('<div class="align-center">', 'content'); $chart = new Test_Charts($test_info['idTest'], Docebo::user()->getIdSt()); $chart->render($chart_options->selected_chart, true); cout('</div><br /><br />', 'content'); } //--- end show chart --------------------------------------------------------- if ($feedback_txt) { cout('<p>' . $feedback_txt . '</p><br />', 'content'); } $points = $point_do + $bonus_score; if ($test_info['show_solution'] == 2 && $points >= $test_info['point_required']) { $GLOBALS['page']->add(Form::openForm('test_show', 'index.php?modname=test&op=play') . Form::getHidden('next_step', 'next_step', 'test_review') . Form::getHidden('id_test', 'id_test', $id_test) . Form::getHidden('id_param', 'id_param', $id_param) . Form::getHidden('back_url', 'back_url', $url_coded) . Form::getHidden('idTrack', 'idTrack', $id_track) . Form::getButton('review', 'review', $lang->def('_TEST_REVIEW_ANSWER')) . Form::closeForm(), 'content'); } elseif ($test_info['show_doanswer'] == 2 && $points >= $test_info['point_required']) { $GLOBALS['page']->add(Form::openForm('test_show', 'index.php?modname=test&op=play') . Form::getHidden('next_step', 'next_step', 'test_review') . Form::getHidden('id_test', 'id_test', $id_test) . Form::getHidden('id_param', 'id_param', $id_param) . Form::getHidden('back_url', 'back_url', $url_coded) . Form::getHidden('idTrack', 'idTrack', $id_track) . Form::getButton('review', 'review', $lang->def('_TEST_REVIEW_ANSWER')) . Form::closeForm(), 'content'); } elseif ($test_info['show_solution'] != 2 && $test_info['show_doanswer'] != 2) { if ($test_info['show_solution'] || $test_info['show_doanswer']) { $GLOBALS['page']->add(Form::openForm('test_show', 'index.php?modname=test&op=play') . Form::getHidden('next_step', 'next_step', 'test_review') . Form::getHidden('id_test', 'id_test', $id_test) . Form::getHidden('id_param', 'id_param', $id_param) . Form::getHidden('back_url', 'back_url', $url_coded) . Form::getHidden('idTrack', 'idTrack', $id_track) . Form::getButton('review', 'review', $lang->def('_TEST_REVIEW_ANSWER')) . Form::closeForm(), 'content'); } } $GLOBALS['page']->add(Form::openForm('test_show', Util::str_replace_once('&', '&', $object_test->back_url)) . '<div class="align_right">' . Form::getButton('end_test', 'end_test', $lang->def('_TEST_END_BACKTOLESSON')) . '</div>' . Form::closeForm(), 'content'); $GLOBALS['page']->add('</div>', 'content'); }
function delfbkrule() { checkPerm('view', false, 'storage'); $res = ''; require_once _lms_ . '/lib/lib.questcategory.php'; require_once _lms_ . '/lib/lib.assessment_rule.php'; $rule_id = Get::gReq('item_id', DOTY_INT, 0); $id_test = Get::gReq('idTest', DOTY_INT, 0); $back_url = urldecode(Get::gReq('back_url', DOTY_STRING)); $url_encode = htmlentities(urlencode($back_url)); $url_base = 'index.php?modname=test&idTest=' . $id_test . '&back_url=' . $url_encode . '&op='; $asrule = new AssessmentRuleManager($id_test); if (Get::gReq('confirm', DOTY_INT, 0)) { //TODO: change me $asrule->delete($rule_id); Util::jump_to($url_base . 'feedbackman'); die; } }