Basic question funcionality based in "medias" see #5714

skala
Julio Montoya 13 years ago
parent 91da5b8767
commit 9b10817bc6
  1. 40
      main/exercice/exercise.class.php
  2. 278
      main/exercice/exercise_submit.php
  3. 1
      main/exercice/media_question.class.php
  4. 8
      main/exercice/question.class.php
  5. 20
      main/inc/ajax/exercise.ajax.php
  6. 3
      main/inc/lib/autoload.class.php

@ -1585,9 +1585,13 @@ class Exercise {
return $id;
}
public function show_button($question_id, $questionNum) {
public function show_button($question_id, $questionNum, $inside_media = false) {
global $origin, $safe_lp_id, $safe_lp_item_id, $safe_lp_item_view_id;
$nbrQuestions = count($this->get_validated_question_list());
if ($inside_media) {
$nbrQuestions = count($this->get_media_list());
}
$html = $label = '';
$confirmation_alert = $this->type == ALL_ON_ONE_PAGE? " onclick=\"javascript:if(!confirm('".get_lang("ConfirmYourChoice")."')) return false;\" ":"";
@ -3478,10 +3482,36 @@ class Exercise {
}
return false;
}
function get_media_list() {
$questionList = self::get_validated_question_list();
$media_questions = array();
if (!empty($questionList)) {
foreach ($questionList as $questionId) {
$objQuestionTmp = Question::read($questionId);
if (isset($objQuestionTmp->parent_id) && $objQuestionTmp->parent_id != 0) {
$media_questions[$objQuestionTmp->parent_id][] = $objQuestionTmp->id;
} else {
//Always the last item
$media_questions[999][] = $objQuestionTmp->id;
}
}
}
return $media_questions;
}
function media_is_activated($media_list) {
$active = false;
if (isset($media_list) && !empty($media_list) && count($media_list) > 1) {
$active = true;
}
return $active;
}
function get_validated_question_list() {
$tabres = array();
$isRandomByCategory = $this->isRandomByCat();
if ($isRandomByCategory == 0) {
if ($this->isRandom()) {
$tabres = $this->selectRandomList();
@ -3492,16 +3522,14 @@ class Exercise {
if ($this->isRandom()) {
if (!class_exists("Testcategory")) {
require_once("testcategory.class.php");
}
//
}
// USE question categories
//
//
// get questions by category for this exercice
// we have to choice $objExercise->random question in each array values of $tabCategoryQuestions
// key of $tabCategoryQuestions are the categopy id (0 for not in a category)
// value is the array of question id of this category
$questionList = array();
$tabCategoryQuestions = array();
$questionList = array();
$tabCategoryQuestions = Testcategory::getQuestionsByCat($this->id);
$isRandomByCategory = $this->selectRandomByCat();
// on tri les catégories en fonction du terme entre [] en tête de la description de la catégorie

@ -352,12 +352,20 @@ $exercise_sound = $objExercise->selectSound();
//in LP's is enabled the "remember question" feature?
$media_questions = $objExercise->get_media_list();
$media_question_is_active = $objExercise->media_is_activated($media_questions);
if (!isset($_SESSION['questionList'])) {
// selects the list of question ID
$questionList = $objExercise->get_validated_question_list();
if ($objExercise->isRandom() && !empty($exercise_stat_info['data_tracking'])) {
$questionList = explode(',', $exercise_stat_info['data_tracking']);
}
if ($media_question_is_active) {
//$questionList = $media_questions;
}
Session::write('questionList', $questionList);
if ($debug > 0) { error_log('$_SESSION[questionList] was set'); }
} else {
@ -370,10 +378,14 @@ if ($debug) error_log('8. Question list loaded '.print_r($questionList, 1));
//Real question count
$question_count = 0;
if (!empty($questionList)) {
if (!empty($questionList)) {
$question_count = count($questionList);
}
if ($media_question_is_active) {
$question_count = count($media_questions);
}
if ($formSent && isset($_POST)) {
if ($debug) { error_log('9. $formSent was set'); }
@ -389,6 +401,8 @@ if ($formSent && isset($_POST)) {
$choice = array($hotspot_id => '');
}
// Filling array exercise result
// if the user has answered at least one question
if (is_array($choice)) {
if ($debug) { error_log('9.1. $choice is an array '.print_r($choice, 1)); }
@ -801,9 +815,16 @@ if (!empty($error)) {
url = "exercise_submit.php?'.$params.'&num="+previous_question_id;
//Save the current question
save_now(question_id_to_save, url);
}
function save_now(question_id, url_extra) {
}
function save_now(question_id, url_extra, redirect) {
if(redirect == undefined) {
redirect = true;
}
//1. Normal choice inputs
var my_choice = $(\'*[name*="choice[\'+question_id+\']"]\').serialize();
@ -817,7 +838,6 @@ if (!empty($error)) {
if (typeof(FCKeditorAPI) !== "undefined") {
var oEditor = FCKeditorAPI.GetInstance("choice["+question_id+"]") ;
var fck_content = "";
if (oEditor) {
fck_content = oEditor.GetHTML();
my_choice = {};
@ -834,35 +854,42 @@ if (!empty($error)) {
// Only for the first time
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('loading1.gif')).'");
$.ajax({
type:"post",
url: "'.api_get_path(WEB_AJAX_PATH).'exercise.ajax.php?a=save_exercise_by_now",
data: "'.$params.'&type=simple&question_id="+question_id+"&"+my_choice+"&"+hotspot+"&"+remind_list,
success: function(return_value) {
if (return_value == "ok") {
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('save.png', get_lang('Saved'), array(), ICON_SIZE_SMALL)).'");
} else if (return_value == "error") {
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('error.png', get_lang('Error'), array(), ICON_SIZE_SMALL)).'");
} else if (return_value == "one_per_page") {
var url = "";
if ('.$reminder.' == 1 ) {
url = "exercise_reminder.php?'.$params.'&num='.$current_question.'";
} else if ('.$reminder.' == 2 ) {
url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'&reminder=2";
} else {
url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'";
}
if (url_extra) {
url = url_extra;
}
window.location = url;
}
},
error: function() {
$("#save_for_now_"+question_id).html(" '.addslashes(Display::return_icon('loading1.gif')).'");
$.ajax({
type:"post",
url: "'.api_get_path(WEB_AJAX_PATH).'exercise.ajax.php?a=save_exercise_by_now",
data: "'.$params.'&type=simple&question_id="+question_id+"&"+my_choice+"&"+hotspot+"&"+remind_list,
success: function(return_value) {
if (return_value == "ok") {
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('save.png', get_lang('Saved'), array(), ICON_SIZE_SMALL)).'");
} else if (return_value == "error") {
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('error.png', get_lang('Error'), array(), ICON_SIZE_SMALL)).'");
} else if (return_value == "one_per_page") {
var url = "";
if ('.$reminder.' == 1 ) {
url = "exercise_reminder.php?'.$params.'&num='.$current_question.'";
} else if ('.$reminder.' == 2 ) {
url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'&reminder=2";
} else {
url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'";
}
if (url_extra) {
url = url_extra;
}
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('save.png')).'");
if (redirect) {
window.location = url;
}
}
},
error: function() {
$("#save_for_now_"+question_id).html("'.addslashes(Display::return_icon('error.png', get_lang('Error'), array(), ICON_SIZE_SMALL)).'");
}
});
return false;
}
@ -952,45 +979,32 @@ if (!empty($error)) {
}
//Media question list render
$media_questions = array();
$media_question_is_active = false;
if (!empty($questionList)) {
foreach ($questionList as $questionId) {
$objQuestionTmp = Question::read($questionId);
if (isset($objQuestionTmp->parent_id) && $objQuestionTmp->parent_id != 0) {
$media_questions[$objQuestionTmp->parent_id][] = $objQuestionTmp;
$media_question_is_active = true;
} else {
$media_questions[0][] = $objQuestionTmp;
}
}
}
if ($media_question_is_active) {
foreach ($media_questions as $media_id => $question_list_in_media) {
if (!empty($media_id)) {
$objQuestionTmp = Question::read($media_id);
//echo Display::page_subheader($objQuestionTmp->selectTitle());
}
foreach($question_list_in_media as $questionId) {
}
}
}
render_question_list($objExercise, $questionList, $current_question, $exerciseResult, $attempt_list, $remind_list);
$media_list = array();
if ($media_question_is_active) {
//Media behaviour
foreach ($media_questions as $media_id => $question_list_in_media) {
$media_list[] = $media_id;
}
render_question_list($objExercise, $media_list, $current_question, $exerciseResult, $attempt_list, $remind_list, $media_questions);
} else {
//Normal behaviour
render_question_list($objExercise, $questionList, $current_question, $exerciseResult, $attempt_list, $remind_list);
}
echo '</form>';
}
function render_question_list($objExercise, $questionList, $current_question, $exerciseResult, $attempt_list, $remind_list) {
function render_question_list($objExercise, $questionList, $current_question, $exerciseResult, $attempt_list, $remind_list, $media_questions = array()) {
global $origin;
$i = 1;
//Normal question list render
foreach ($questionList as $questionId) {
// for sequential exercises
if ($objExercise->type == ONE_PER_PAGE) {
// if it is not the right question, goes to the next loop iteration
@ -1003,7 +1017,7 @@ function render_question_list($objExercise, $questionList, $current_question, $e
if (isset($exerciseResult[$questionId])) {
// construction of the Question object
$objQuestionTmp = Question::read($questionId);
$questionName = $objQuestionTmp->selectTitle();
//$questionName = $objQuestionTmp->selectTitle();
// destruction of the Question object
unset ($objQuestionTmp);
Display :: display_normal_message(get_lang('AlreadyAnswered'));
@ -1013,53 +1027,29 @@ function render_question_list($objExercise, $questionList, $current_question, $e
}
}
}
$user_choice = $attempt_list[$questionId];
$remind_highlight = '';
//Hides questions when reviewing a ALL_ON_ONE_PAGE exercise see #4542 no_remind_highlight class hide with jquery
if ($objExercise->type == ALL_ON_ONE_PAGE && isset($_GET['reminder']) && $_GET['reminder'] == 2) {
$remind_highlight = 'no_remind_highlight';
}
$exercise_actions = '';
$is_remind_on = false;
$attributes = array('id' =>'remind_list['.$questionId.']');
if (in_array($questionId, $remind_list)) {
$is_remind_on = true;
$attributes['checked'] = 1;
$remind_question = true;
$remind_highlight = ' remind_highlight ';
}
//Showing the question
echo '<div id="question_div_'.$questionId.'" class="main_question '.$remind_highlight.'" >';
//Shows the question + possible answers
showQuestion($questionId, false, $origin, $i, true, false, $user_choice, false);
//BUtton save and continue
switch ($objExercise->type) {
case ONE_PER_PAGE:
$exercise_actions .= $objExercise->show_button($questionId, $current_question);
break;
case ALL_ON_ONE_PAGE :
$button = '<a href="javascript://" class="btn" onclick="save_now(\''.$questionId.'\'); ">'.get_lang('SaveForNow').'</a>';
$button .= '<span id="save_for_now_'.$questionId.'"></span>&nbsp;';
$exercise_actions .= Display::div($button, array('class'=>'exercise_save_now_button'));
break;
}
//Checkbox review answers
if ($objExercise->review_answers) {
$remind_question_div = Display::tag('label', Display::input('checkbox', 'remind_list['.$questionId.']', '', $attributes).get_lang('ReviewQuestionLater'), array('class' => 'checkbox', 'for' =>'remind_list['.$questionId.']'));
$exercise_actions .= Display::div($remind_question_div, array('class'=>'exercise_save_now_button'));
//Medias
if (isset($media_questions) && !empty($media_questions)) {
$media_question_list = $media_questions[$questionId];
$objQuestionTmp = Question::read($questionId);
if ($objQuestionTmp) {
echo Display::page_subheader($objQuestionTmp->selectTitle());
echo $objQuestionTmp->selectDescription();
}
echo Display::div($exercise_actions, array('class'=>'form-actions'));
echo '</div>';
$count_of_questions_inside_media = count($media_question_list);
$counter = 1;
foreach ($media_question_list as $my_question_id) {
if ($counter == $count_of_questions_inside_media) {
$last_question_in_media = true;
}
render_question($objExercise, $my_question_id, $attempt_list, $remind_list, $i, $current_question, true, $count_of_questions_inside_media, $last_question_in_media);
$counter++;
}
} else {
render_question($objExercise, $questionId, $attempt_list, $remind_list, $i, $current_question);
}
$i++;
// for sequential exercises
@ -1068,12 +1058,82 @@ function render_question_list($objExercise, $questionList, $current_question, $e
break;
}
}
// end foreach()
if ($objExercise->type == ALL_ON_ONE_PAGE) {
$exercise_actions = $objExercise->show_button($questionId, $current_question);
echo Display::div($exercise_actions, array('class'=>'exercise_actions'));
}
}
function render_question($objExercise, $questionId, $attempt_list, $remind_list, $i, $current_question, $inside_media = false, $count_of_questions_inside_media = 0, $last_question_in_media = false) {
global $origin;
$user_choice = $attempt_list[$questionId];
$remind_highlight = null;
//Hides questions when reviewing a ALL_ON_ONE_PAGE exercise see #4542 no_remind_highlight class hide with jquery
if ($objExercise->type == ALL_ON_ONE_PAGE && isset($_GET['reminder']) && $_GET['reminder'] == 2) {
$remind_highlight = 'no_remind_highlight';
}
$is_remind_on = false;
$attributes = array('id' =>'remind_list['.$questionId.']');
if (in_array($questionId, $remind_list)) {
$is_remind_on = true;
$attributes['checked'] = 1;
$remind_highlight = ' remind_highlight ';
}
//Showing the question
$exercise_actions = null;
echo '<div id="question_div_'.$questionId.'" class="main_question '.$remind_highlight.'" >';
//Shows the question + possible answers
showQuestion($questionId, false, $origin, $i, true, false, $user_choice, false);
//BUtton save and continue
switch ($objExercise->type) {
case ONE_PER_PAGE:
$exercise_actions .= $objExercise->show_button($questionId, $current_question, $inside_media);
break;
case ALL_ON_ONE_PAGE :
$button = '<a href="javascript://" class="btn" onclick="save_now(\''.$questionId.'\'); ">'.get_lang('SaveForNow').'</a>';
$button .= '<span id="save_for_now_'.$questionId.'"></span>&nbsp;';
$exercise_actions .= Display::div($button, array('class'=>'exercise_save_now_button'));
break;
}
if ($inside_media) {
/*$button = '<a href="javascript://" class="btn" onclick="save_now(\''.$questionId.'\'); ">'.get_lang('SaveForNow').'</a>';
$button .= '<span id="save_for_now_'.$questionId.'"></span>&nbsp;';
$exercise_actions = Display::div($button, array('class'=>'exercise_save_now_button'));
$exercise_actions .= $objExercise->show_button($questionId, $current_question);*/
if ($count_of_questions_inside_media > 1) {
$button = '<a href="javascript://" class="btn" onclick="save_now(\''.$questionId.'\', false, false); ">'.get_lang('SaveForNow').'</a>';
$button .= '<span id="save_for_now_'.$questionId.'"></span>&nbsp;';
$exercise_actions = Display::div($button, array('class'=>'exercise_save_now_button'));
}
if ($last_question_in_media) {
$exercise_actions = $objExercise->show_button($questionId, $current_question, $inside_media);
}
}
//Checkbox review answers
if ($objExercise->review_answers) {
$remind_question_div = Display::tag('label', Display::input('checkbox', 'remind_list['.$questionId.']', '', $attributes).get_lang('ReviewQuestionLater'), array('class' => 'checkbox', 'for' =>'remind_list['.$questionId.']'));
$exercise_actions .= Display::div($remind_question_div, array('class'=>'exercise_save_now_button'));
}
echo Display::div($exercise_actions, array('class'=>'form-actions'));
echo '</div>';
}
if ($origin != 'learnpath') {
//so we are not in learnpath tool
echo '</div>'; //End glossary div

@ -19,6 +19,7 @@ class MediaQuestion extends Question {
$new_params = array(
'c_id' => api_get_course_int_id(),
'question' => $params['questionName'],
'description' => $params['questionDescription'],
'parent_id' => 0,
'type' => MEDIA_QUESTION
);

@ -1301,15 +1301,15 @@ abstract class Question
* @param FormValidator $form the formvalidator instance
* @param Exercise $objExercise the Exercise instance
*/
function processCreation ($form, $objExercise) {
function processCreation ($form, $objExercise) {
$this->updateParentId($form->getSubmitValue('parent_id'));
$this->updateTitle($form->getSubmitValue('questionName'));
$this->updateDescription($form->getSubmitValue('questionDescription'));
$this->updateLevel($form->getSubmitValue('questionLevel'));
$this->updateCategory($form->getSubmitValue('questionCategory'));
//For parent_id != 0
if ($objExercise->parent_id != 0) {
//Save normal question if NOT media
if ($this->type != MEDIA_QUESTION) {
$this->save($objExercise->id);
// modify the exercise

@ -99,9 +99,7 @@ switch ($action) {
$i=0;
if (!empty($results)) {
foreach($results as $row) {
//$user_info = api_get_user_info($row['exe_user_id']);
//print_r($row);
foreach($results as $row) {
$sql = "SELECT SUM(count_question_id) as count_question_id FROM (
SELECT 1 as count_question_id FROM $track_attempt a
WHERE user_id = {$row['exe_user_id']} and exe_id = {$row['exe_id']}
@ -169,8 +167,7 @@ switch ($action) {
//Needed in manage_answer
$learnpath_id = isset($_REQUEST['learnpath_id']) ? intval($_REQUEST['learnpath_id']) : 0;
$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? intval($_REQUEST['learnpath_item_id']) : 0;
$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? intval($_REQUEST['learnpath_item_id']) : 0;
//Attempt id
$exe_id = $_REQUEST['exe_id'];
@ -202,18 +199,7 @@ switch ($action) {
$attempt_list = array();
//First time here we create an attempt (getting the exe_id)
if (empty($exercise_stat_info)) {
/*
//$exe_id = create_event_exercice($objExercise->selectId());
$current_expired_time_key = get_time_control_key($objExercise->id);
if (isset($_SESSION['expired_time'][$current_expired_time_key])) { //Only for exercice of type "One page"
$expired_date = $_SESSION['expired_time'][$current_expired_time_key];
} else {
$expired_date = '0000-00-00 00:00:00';
}
$exe_id = $objExercise->save_stat_track_exercise_info($expired_date, $safe_lp_id, $safe_lp_item_id, $safe_lp_item_view_id, $question_list, 0); //total weight 0 by now
$total_score = $total_weight = 0;
*/
if (empty($exercise_stat_info)) {
} else {
//We know the user we get the exe_id
$exe_id = $exercise_stat_info['exe_id'];

@ -726,8 +726,9 @@ class Autoload
$result['Log'] = '/main/inc/lib/log.class.php';
$result['Login'] = '/main/inc/lib/login.lib.php';
$result['LoginRedirection'] = '/main/inc/lib/login_redirection.class.php';
$result['Matching'] = '/main/exercice/matching.class.php';
$result['Matching'] = '/main/exercice/matching.class.php';
$result['MessageManager'] = '/main/inc/lib/message.lib.php';
$result['MediaQuestion'] = '/main/exercice/media_question.class.php';
$result['Model'] = '/main/inc/lib/model.lib.php';
$result['Model\Course'] = '/main/inc/lib/course.class.php';
$result['Model\Document'] = '/main/inc/lib/document.class.php';

Loading…
Cancel
Save