|
|
|
@ -62,8 +62,6 @@ $htmlHeadXtra[] = $js; |
|
|
|
|
$htmlHeadXtra[] = api_get_js('jqueryui-touch-punch/jquery.ui.touch-punch.min.js'); |
|
|
|
|
$htmlHeadXtra[] = api_get_js('jquery.jsPlumb.all.js'); |
|
|
|
|
$htmlHeadXtra[] = api_get_js('d3/jquery.xcolor.js'); |
|
|
|
|
|
|
|
|
|
// This library is necessary for the time control feature. |
|
|
|
|
$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'); |
|
|
|
@ -109,8 +107,7 @@ if (isset($zoomOptions['options']) && !in_array($origin, ['embeddable', 'mobilea |
|
|
|
|
|
|
|
|
|
$(document).contextmenu(function() { |
|
|
|
|
return false; |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
</script>'; |
|
|
|
|
} |
|
|
|
@ -130,7 +127,7 @@ $exerciseResultCoordinates = isset($_REQUEST['exerciseResultCoordinates']) ? $_R |
|
|
|
|
$choice = isset($_REQUEST['choice']) ? $_REQUEST['choice'] : null; |
|
|
|
|
$choice = empty($choice) ? isset($_REQUEST['choice2']) ? $_REQUEST['choice2'] : null : null; |
|
|
|
|
$questionCategoryId = isset($_REQUEST['category_id']) ? (int) $_REQUEST['category_id'] : 0; |
|
|
|
|
$current_question = isset($_REQUEST['num']) ? (int) $_REQUEST['num'] : null; |
|
|
|
|
$current_question = $currentQuestionFromUrl = isset($_REQUEST['num']) ? (int) $_REQUEST['num'] : null; |
|
|
|
|
$currentAnswer = isset($_REQUEST['num_answer']) ? (int) $_REQUEST['num_answer'] : null; |
|
|
|
|
|
|
|
|
|
$logInfo = [ |
|
|
|
@ -189,13 +186,13 @@ if (!isset($objExercise) && isset($exerciseInSession)) { |
|
|
|
|
|
|
|
|
|
$exerciseInSession = Session::read('objExercise'); |
|
|
|
|
|
|
|
|
|
//3. $objExercise is not set, then return to the exercise list. |
|
|
|
|
// 3. $objExercise is not set, then return to the exercise list. |
|
|
|
|
if (!is_object($objExercise)) { |
|
|
|
|
header('Location: exercise.php'); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// if the user has submitted the form |
|
|
|
|
// if the user has submitted the form. |
|
|
|
|
$exercise_title = $objExercise->selectTitle(); |
|
|
|
|
$exercise_sound = $objExercise->selectSound(); |
|
|
|
|
|
|
|
|
@ -307,7 +304,6 @@ if ($objExercise->selectAttempts() > 0) { |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$attempt_html .= $messageReachedMax; |
|
|
|
|
|
|
|
|
|
if (!empty($last_attempt_info['question_list'])) { |
|
|
|
|
foreach ($last_attempt_info['question_list'] as $questions) { |
|
|
|
|
foreach ($questions as $question_data) { |
|
|
|
@ -495,10 +491,6 @@ if (!empty($exercise_stat_info['questions_to_check'])) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$params = "exe_id=$exe_id&exerciseId=$exerciseId&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id&learnpath_item_view_id=$learnpath_item_view_id&".api_get_cidreq().'&reminder='.$reminder; |
|
|
|
|
if ($debug) { |
|
|
|
|
error_log("6.1 params: -> $params"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (2 == $reminder && empty($myRemindList)) { |
|
|
|
|
if ($debug) { |
|
|
|
|
error_log('6.2 calling the exercise_reminder.php'); |
|
|
|
@ -522,7 +514,7 @@ if ($time_control) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!isset($_SESSION['expired_time'][$current_expired_time_key])) { |
|
|
|
|
//Timer - Get expired_time for a student |
|
|
|
|
// Timer - Get expired_time for a student. |
|
|
|
|
if (!empty($exercise_stat_info)) { |
|
|
|
|
$expired_time_of_this_attempt = $exercise_stat_info['expired_time_control']; |
|
|
|
|
if ($debug) { |
|
|
|
@ -585,7 +577,8 @@ $time_left = api_strtotime($clock_expired_time, 'UTC') - time(); |
|
|
|
|
* The time control feature is enable here - this feature is enable for a jquery plugin called epiclock |
|
|
|
|
* for more details of how it works see this link : http://eric.garside.name/docs.html?p=epiclock |
|
|
|
|
*/ |
|
|
|
|
if ($time_control) { //Sends the exercise form when the expired time is finished |
|
|
|
|
if ($time_control) { |
|
|
|
|
//Sends the exercise form when the expired time is finished. |
|
|
|
|
$htmlHeadXtra[] = $objExercise->showTimeControlJS($time_left); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -604,8 +597,7 @@ if (!isset($_SESSION['questionList'])) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$isLastQuestionInCategory = 0; |
|
|
|
|
if ( |
|
|
|
|
api_get_configuration_value('block_category_questions') && |
|
|
|
|
if (api_get_configuration_value('block_category_questions') && |
|
|
|
|
ONE_PER_PAGE == $objExercise->type && |
|
|
|
|
EX_Q_SELECTION_CATEGORIES_ORDERED_QUESTIONS_RANDOM == $selectionType |
|
|
|
|
) { |
|
|
|
@ -659,7 +651,6 @@ if ( |
|
|
|
|
|
|
|
|
|
$count = 1; |
|
|
|
|
$total = count($categoryList[$categoryId]); |
|
|
|
|
//var_dump($categoryList[$categoryId]); |
|
|
|
|
foreach ($categoryList[$categoryId] as $checkQuestionId) { |
|
|
|
|
if ((int) $checkQuestionId === $questionCheck->iid) { |
|
|
|
|
break; |
|
|
|
@ -669,15 +660,19 @@ if ( |
|
|
|
|
|
|
|
|
|
if ($count === $total) { |
|
|
|
|
$isLastQuestionInCategory = $categoryId; |
|
|
|
|
if ($isLastQuestionInCategory) { |
|
|
|
|
// This is the last question |
|
|
|
|
if ((int) $current_question + 1 === count($questionList)) { |
|
|
|
|
$isLastQuestionInCategory = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//var_dump($isLastQuestionInCategory, $blockedCategories); |
|
|
|
|
if (0 === $isLastQuestionInCategory) { |
|
|
|
|
$showPreviousButton = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//var_dump($categoryInfo, $count, $total); |
|
|
|
|
// Blocked if category was already answered |
|
|
|
|
if ($categoryId && in_array($categoryId, $blockedCategories)) { |
|
|
|
|
// Redirect to category intro |
|
|
|
@ -928,13 +923,100 @@ if (api_is_in_gradebook()) { |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$interbreadcrumb[] = [ |
|
|
|
|
'url' => 'exercise.php?'.api_get_cidreq(), |
|
|
|
|
'name' => get_lang('Exercises'), |
|
|
|
|
]; |
|
|
|
|
$interbreadcrumb[] = ['url' => 'exercise.php?'.api_get_cidreq(), 'name' => get_lang('Exercises')]; |
|
|
|
|
$interbreadcrumb[] = ['url' => '#', 'name' => $objExercise->selectTitle(true)]; |
|
|
|
|
|
|
|
|
|
if (!in_array($origin, ['learnpath', 'embeddable', 'mobileapp'])) { //so we are not in learnpath tool |
|
|
|
|
// Time per question. |
|
|
|
|
$questionTimeCondition = ''; |
|
|
|
|
if ($allowTimePerQuestion && $objExercise->type == ONE_PER_PAGE) { |
|
|
|
|
$objQuestionTmp = null; |
|
|
|
|
$previousQuestion = null; |
|
|
|
|
if (!empty($questionList)) { |
|
|
|
|
$i = 0; |
|
|
|
|
foreach ($questionList as $questionId) { |
|
|
|
|
$i++; |
|
|
|
|
$objQuestionTmp = Question::read($questionId); |
|
|
|
|
// if it is not the right question, goes to the next loop iteration |
|
|
|
|
if ($current_question == $i) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
$previousQuestion = $objQuestionTmp; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (api_get_configuration_value('allow_time_per_question')) { |
|
|
|
|
$extraFieldValue = new ExtraFieldValue('question'); |
|
|
|
|
$value = $extraFieldValue->get_values_by_handler_and_field_variable($objQuestionTmp->iid, 'time'); |
|
|
|
|
if (!empty($value) && isset($value['value']) && !empty($value['value'])) { |
|
|
|
|
$seconds = (int) $value['value']; |
|
|
|
|
$now = time(); |
|
|
|
|
/*$loadedQuestions = array_keys(Session::read('question_start', [])); |
|
|
|
|
if (!empty($loadedQuestions)) { |
|
|
|
|
if (!in_array($objQuestionTmp->iid, $loadedQuestions)) { |
|
|
|
|
api_not_allowed(true); |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
$timeSpent = Event::getAttemptQuestionDuration($exe_id, $objQuestionTmp->iid); |
|
|
|
|
/*$loadedQuestions = array_keys(Session::read('question_start')); |
|
|
|
|
// Block if another question is loaded at the same time. |
|
|
|
|
if (!in_array($objQuestionTmp->iid, $loadedQuestions)) { |
|
|
|
|
api_not_allowed(true); |
|
|
|
|
}*/ |
|
|
|
|
/*$timePerQuestion = Session::read('time_per_question', []); |
|
|
|
|
if (!empty($timePerQuestion) && isset($timePerQuestion[$objQuestionTmp->iid])) { |
|
|
|
|
$time = $timePerQuestion[$objQuestionTmp->iid]; |
|
|
|
|
} else { |
|
|
|
|
$time = $timePerQuestion[$objQuestionTmp->iid] = $now; |
|
|
|
|
Session::write('time_per_question', $timePerQuestion); |
|
|
|
|
} |
|
|
|
|
$timeSpent = $now - $time;*/ |
|
|
|
|
|
|
|
|
|
/*if (!empty($questionAttempt) && isset($questionAttempt['tms'])) { |
|
|
|
|
var_dump('from DB'); |
|
|
|
|
var_dump($questionAttempt['tms']); |
|
|
|
|
$time = api_strtotime($questionAttempt['tms'], 'UTC'); |
|
|
|
|
$timeSpent = $now - $time; |
|
|
|
|
} else { |
|
|
|
|
var_dump('from session'); |
|
|
|
|
$timePerQuestion = Session::read('time_per_question', []); |
|
|
|
|
if (!empty($timePerQuestion) && isset($timePerQuestion[$objQuestionTmp->iid])) { |
|
|
|
|
$time = $timePerQuestion[$objQuestionTmp->iid]; |
|
|
|
|
} else { |
|
|
|
|
$time = $timePerQuestion[$objQuestionTmp->iid] = $now; |
|
|
|
|
Session::write('time_per_question', $timePerQuestion); |
|
|
|
|
} |
|
|
|
|
var_dump($timePerQuestion); |
|
|
|
|
$timeSpent = $now - $time; |
|
|
|
|
}*/ |
|
|
|
|
//var_dump($timeSpent); |
|
|
|
|
//var_dump(api_get_utc_datetime($now).' - '.api_get_utc_datetime($time)); |
|
|
|
|
// Redirect to next question. |
|
|
|
|
if ($timeSpent > $seconds) { |
|
|
|
|
$nextQuestion = (int) $currentQuestionFromUrl + 1; |
|
|
|
|
$nextQuestionUrl = api_get_path(WEB_CODE_PATH). |
|
|
|
|
"exercise/exercise_submit.php?$params&num=$nextQuestion&remind_question_id=$remind_question_id"; |
|
|
|
|
api_location($nextQuestionUrl); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$seconds = $seconds - $timeSpent; |
|
|
|
|
//var_dump($seconds); |
|
|
|
|
$questionTimeCondition = " |
|
|
|
|
var timer = new easytimer.Timer(); |
|
|
|
|
timer.start({countdown: true, startValues: {seconds: $seconds}}); |
|
|
|
|
timer.addEventListener('secondsUpdated', function (e) { |
|
|
|
|
$('#question_timer').html(timer.getTimeValues().toString()); |
|
|
|
|
}); |
|
|
|
|
timer.addEventListener('targetAchieved', function (e) { |
|
|
|
|
$('.question-validate-btn').click(); |
|
|
|
|
}); |
|
|
|
|
"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!in_array($origin, ['learnpath', 'embeddable', 'mobileapp'])) { |
|
|
|
|
//so we are not in learnpath tool |
|
|
|
|
SessionManager::addFlashSessionReadOnly(); |
|
|
|
|
Display::display_header(null, 'Exercises'); |
|
|
|
|
} else { |
|
|
|
@ -950,7 +1032,6 @@ if ($origin === 'mobileapp') { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$show_quiz_edition = $objExercise->added_in_lp(); |
|
|
|
|
|
|
|
|
|
// I'm in a preview mode |
|
|
|
|
if (api_is_course_admin() && !in_array($origin, ['learnpath', 'embeddable'])) { |
|
|
|
|
echo '<div class="actions">'; |
|
|
|
@ -987,7 +1068,6 @@ if (!api_is_allowed_to_session_edit()) { |
|
|
|
|
|
|
|
|
|
$exercise_timeover = false; |
|
|
|
|
$limit_time_exists = !empty($objExercise->start_time) || !empty($objExercise->end_time) ? true : false; |
|
|
|
|
|
|
|
|
|
if ($limit_time_exists) { |
|
|
|
|
$exercise_start_time = api_strtotime($objExercise->start_time, 'UTC'); |
|
|
|
|
$exercise_end_time = api_strtotime($objExercise->end_time, 'UTC'); |
|
|
|
@ -1052,18 +1132,18 @@ if (isset($_custom['exercises_hidden_when_no_start_date']) && |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($allowTimePerQuestion) { |
|
|
|
|
echo '<div class="well" style="text-align: center"> |
|
|
|
|
<div id="question_timer" class="label label-warning"></div> |
|
|
|
|
</div>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($time_control) { |
|
|
|
|
echo $objExercise->returnTimeLeftDiv(); |
|
|
|
|
echo '<div style="display:none" class="warning-message" id="expired-message-id">'. |
|
|
|
|
get_lang('ExerciseExpiredTimeMessage').'</div>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($allowTimePerQuestion) { |
|
|
|
|
echo '<div class="well" style="text-align: center"> |
|
|
|
|
<div id="question_timer" class="label label-warning"></div> |
|
|
|
|
</div>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!in_array($origin, ['learnpath', 'embeddable'])) { |
|
|
|
|
echo '<div id="highlight-plugin" class="glossary-content">'; |
|
|
|
|
} |
|
|
|
@ -1116,26 +1196,27 @@ if ($reminder == 2) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($error)) { |
|
|
|
|
Display::addFlash(Display::return_message($error, 'error', false)); |
|
|
|
|
api_not_allowed(); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$script_php = 'exercise_result.php'; |
|
|
|
|
if ($objExercise->review_answers) { |
|
|
|
|
$script_php = 'exercise_reminder.php'; |
|
|
|
|
} else { |
|
|
|
|
$script_php = 'exercise_result.php'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($error)) { |
|
|
|
|
echo Display::return_message($error, 'error', false); |
|
|
|
|
} else { |
|
|
|
|
if (!empty($exercise_sound)) { |
|
|
|
|
if (!empty($exercise_sound)) { |
|
|
|
|
echo "<a |
|
|
|
|
href=\"../document/download.php?doc_url=%2Faudio%2F".Security::remove_XSS($exercise_sound)."\" |
|
|
|
|
target=\"_blank\">"; |
|
|
|
|
echo "<img src=\"../img/sound.gif\" border=\"0\" align=\"absmiddle\" alt=", get_lang('Sound')."\" /></a>"; |
|
|
|
|
} |
|
|
|
|
// Get number of hotspot questions for javascript validation |
|
|
|
|
$number_of_hotspot_questions = 0; |
|
|
|
|
$onsubmit = ''; |
|
|
|
|
$i = 0; |
|
|
|
|
if (!empty($questionList)) { |
|
|
|
|
} |
|
|
|
|
// Get number of hotspot questions for javascript validation |
|
|
|
|
$number_of_hotspot_questions = 0; |
|
|
|
|
$i = 0; |
|
|
|
|
if (!empty($questionList)) { |
|
|
|
|
foreach ($questionList as $questionId) { |
|
|
|
|
$i++; |
|
|
|
|
$objQuestionTmp = Question::read($questionId); |
|
|
|
@ -1157,38 +1238,18 @@ if (!empty($error)) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$saveIcon = Display::return_icon( |
|
|
|
|
$saveIcon = Display::return_icon( |
|
|
|
|
'save.png', |
|
|
|
|
get_lang('Saved'), |
|
|
|
|
[], |
|
|
|
|
ICON_SIZE_SMALL, |
|
|
|
|
false, |
|
|
|
|
true |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$questionTimeCondition = ''; |
|
|
|
|
if ($allowTimePerQuestion && $objExercise->type == ONE_PER_PAGE) { |
|
|
|
|
$extraFieldValue = new ExtraFieldValue('question'); |
|
|
|
|
$value = $extraFieldValue->get_values_by_handler_and_field_variable($objQuestionTmp->iid, 'time'); |
|
|
|
|
if (!empty($value) && isset($value['value']) && !empty($value['value'])) { |
|
|
|
|
$seconds = (int) $value['value']; |
|
|
|
|
$questionTimeCondition = " |
|
|
|
|
var timer = new easytimer.Timer(); |
|
|
|
|
//timer.start(); |
|
|
|
|
timer.start({countdown: true, startValues: {seconds: $seconds}}); |
|
|
|
|
timer.addEventListener('secondsUpdated', function (e) { |
|
|
|
|
$('#question_timer').html(timer.getTimeValues().toString()); |
|
|
|
|
}); |
|
|
|
|
timer.addEventListener('targetAchieved', function (e) { |
|
|
|
|
$('.question-validate-btn').click(); |
|
|
|
|
}); |
|
|
|
|
"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
echo '<script> |
|
|
|
|
echo '<script> |
|
|
|
|
function addExerciseEvent(elm, evType, fn, useCapture) { |
|
|
|
|
if (elm.addEventListener) { |
|
|
|
|
elm.addEventListener(evType, fn, useCapture); |
|
|
|
@ -1479,11 +1540,11 @@ if (!empty($error)) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
window.quizTimeEnding = false; |
|
|
|
|
</script>'; |
|
|
|
|
</script>'; |
|
|
|
|
|
|
|
|
|
echo '<form id="exercise_form" method="post" action="'. |
|
|
|
|
echo '<form id="exercise_form" method="post" action="'. |
|
|
|
|
api_get_self().'?'.api_get_cidreq().'&reminder='.$reminder. |
|
|
|
|
'&autocomplete=off&exerciseId='.$exerciseId.'" name="frm_exercise" '.$onsubmit.'> |
|
|
|
|
'&autocomplete=off&exerciseId='.$exerciseId.'" name="frm_exercise"> |
|
|
|
|
<input type="hidden" name="formSent" value="1" /> |
|
|
|
|
<input type="hidden" name="exerciseId" value="'.$exerciseId.'" /> |
|
|
|
|
<input type="hidden" name="num" value="'.$current_question.'" id="num_current_id" /> |
|
|
|
@ -1495,21 +1556,21 @@ if (!empty($error)) { |
|
|
|
|
<input type="hidden" name="learnpath_item_id" value="'.$learnpath_item_id.'" /> |
|
|
|
|
<input type="hidden" name="learnpath_item_view_id" value="'.$learnpath_item_view_id.'" />'; |
|
|
|
|
|
|
|
|
|
// Show list of questions |
|
|
|
|
$i = 1; |
|
|
|
|
$attempt_list = []; |
|
|
|
|
if (isset($exe_id)) { |
|
|
|
|
// Show list of questions |
|
|
|
|
$i = 1; |
|
|
|
|
$attempt_list = []; |
|
|
|
|
if (isset($exe_id)) { |
|
|
|
|
$attempt_list = Event::getAllExerciseEventByExeId($exe_id); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$remind_list = []; |
|
|
|
|
if (isset($exercise_stat_info['questions_to_check']) && |
|
|
|
|
$remind_list = []; |
|
|
|
|
if (isset($exercise_stat_info['questions_to_check']) && |
|
|
|
|
!empty($exercise_stat_info['questions_to_check']) |
|
|
|
|
) { |
|
|
|
|
) { |
|
|
|
|
$remind_list = explode(',', $exercise_stat_info['questions_to_check']); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach ($questionList as $questionId) { |
|
|
|
|
foreach ($questionList as $questionId) { |
|
|
|
|
// for sequential exercises |
|
|
|
|
if (ONE_PER_PAGE == $objExercise->type) { |
|
|
|
|
// if it is not the right question, goes to the next loop iteration |
|
|
|
@ -1693,18 +1754,18 @@ if (!empty($error)) { |
|
|
|
|
// quits the loop |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($objExercise->type == ALL_ON_ONE_PAGE) { |
|
|
|
|
if ($objExercise->type == ALL_ON_ONE_PAGE) { |
|
|
|
|
$exerciseActions = $objExercise->show_button( |
|
|
|
|
$questionId, |
|
|
|
|
$current_question |
|
|
|
|
); |
|
|
|
|
echo Display::div($exerciseActions, ['class' => 'exercise_actions']); |
|
|
|
|
echo '<br>'; |
|
|
|
|
} |
|
|
|
|
echo '</form>'; |
|
|
|
|
} |
|
|
|
|
echo '</form>'; |
|
|
|
|
|
|
|
|
|
if (!in_array($origin, ['learnpath', 'embeddable'])) { |
|
|
|
|
// So we are not in learnpath tool |
|
|
|
|
echo '</div>'; //End glossary div |
|
|
|
|