$(document).ready( function(){ $('#user_custom_score').click(function() { $('#options').toggle(); }); }); "; // Action handling lp_upload_quiz_action_handling(); $interbreadcrumb[] = array( "url" => "exercice.php?".api_get_cidreq(), "name" => get_lang('Exercices'), ); // Display the header Display :: display_header(get_lang('ImportExcelQuiz'), 'Exercises'); if (isset($_GET['message'])) { if (in_array($_GET['message'], array('ExerciseEdited'))) { Display :: display_confirmation_message(get_lang($_GET['message'])); } } // display the actions echo '
'; echo lp_upload_quiz_actions(); echo '
'; // the main content lp_upload_quiz_main(); function lp_upload_quiz_actions() { $return = ''. Display::return_icon('back.png', get_lang('BackToExercisesList'),'',ICON_SIZE_MEDIUM).''; return $return; } function lp_upload_quiz_secondary_actions() { $return = '' . Display :: return_icon('reporting32.png', get_lang('Tracking')) . get_lang('Tracking') . ''; return $return; } function lp_upload_quiz_main() { // variable initialisation $lp_id = isset($_GET['lp_id']) ? intval($_GET['lp_id']) : null; $form = new FormValidator( 'upload', 'POST', api_get_self().'?'.api_get_cidreq().'&lp_id='.$lp_id, '', array('enctype' => 'multipart/form-data') ); $form->addElement('header', get_lang('ImportExcelQuiz')); $form->addElement('file', 'user_upload_quiz', get_lang('FileUpload')); $link = ''. Display::return_icon('export_excel.png', get_lang('DownloadExcelTemplate')).get_lang('DownloadExcelTemplate').''; $form->addElement('advanced_settings', $link); $table = new HTML_Table(array('class' => 'table')); $tableList = array( UNIQUE_ANSWER => get_lang('UniqueSelect'), MULTIPLE_ANSWER => get_lang('MultipleSelect'), FILL_IN_BLANKS => get_lang('FillBlanks'), MATCHING => get_lang('Matching'), FREE_ANSWER => get_lang('FreeAnswer'), GLOBAL_MULTIPLE_ANSWER => get_lang('GlobalMultipleAnswer') ); $table->setHeaderContents(0, 0, get_lang('QuestionType')); $table->setHeaderContents(0, 1, '#'); $row = 1; foreach ($tableList as $key => $label ) { $table->setCellContents($row, 0, $label); $table->setCellContents($row, 1, $key); $row++; } $table = $table->toHtml(); $form->addElement('label', get_lang('QuestionType'), $table); $form->addElement('checkbox', 'user_custom_score', null, get_lang('UseCustomScoreForAllQuestions'), array('id'=> 'user_custom_score')); $form->addElement('html', ''); $form->addRule('user_upload_quiz', get_lang('ThisFieldIsRequired'), 'required'); $form->add_progress_bar(); $form->addElement('style_submit_button', 'submit_upload_quiz', get_lang('Send'), 'class="upload"'); // Display the upload field $form->display(); } /** * Handles a given Excel spreadsheets as in the template provided */ function lp_upload_quiz_action_handling() { global $debug; $_course = api_get_course_info(); $courseId = $_course['real_id']; if (!isset($_POST['submit_upload_quiz'])) { return; } // Get the extension of the document. $path_info = pathinfo($_FILES['user_upload_quiz']['name']); // Check if the document is an Excel document if ($path_info['extension'] != 'xls') { return; } // Read the Excel document $data = new Spreadsheet_Excel_Reader(); // Set output Encoding. $data->setOutputEncoding(api_get_system_encoding()); // Reading the xls document. $data->read($_FILES['user_upload_quiz']['tmp_name']); $correctScore = isset($_POST['correct_score']) ? $_POST['correct_score'] : null; $incorrectScore = isset($_POST['incorrect_score']) ? $_POST['incorrect_score'] : null; $useCustomScore = isset($_POST['user_custom_score']) ? true : false; $propagateNegative = 0; if ($useCustomScore && !empty($incorrectScore)) { if ($incorrectScore < 0) { $propagateNegative = 1; } } // Variables $quiz_index = 0; $question_title_index = array(); $question_name_index_init = array(); $question_name_index_end = array(); $score_index = array(); $feedback_true_index = array(); $feedback_false_index = array(); $number_questions = 0; $question_description_index = array(); $noNegativeScoreIndex = array(); $questionTypeList = array(); $questionTypeIndex = array(); $categoryList = array(); // Reading all the first column items sequentially to create breakpoints for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { if ($data->sheets[0]['cells'][$i][1] == 'Quiz' && $i == 1) { $quiz_index = $i; // Quiz title position, only occurs once } elseif ($data->sheets[0]['cells'][$i][1] == 'Question') { $question_title_index[] = $i; // Question title position line $question_name_index_init[] = $i + 1; // Questions name 1st position line $number_questions++; } elseif ($data->sheets[0]['cells'][$i][1] == 'Score') { $question_name_index_end[] = $i - 1; // Question name position $score_index[] = $i; // Question score position } elseif ($data->sheets[0]['cells'][$i][1] == 'FeedbackTrue') { $feedback_true_index[] = $i; // FeedbackTrue position (line) } elseif ($data->sheets[0]['cells'][$i][1] == 'FeedbackFalse') { $feedback_false_index[] = $i; // FeedbackFalse position (line) } elseif ($data->sheets[0]['cells'][$i][1] == 'EnrichQuestion') { $question_description_index[] = $i; } elseif ($data->sheets[0]['cells'][$i][1] == 'NoNegativeScore') { $noNegativeScoreIndex[] = $i; } elseif ($data->sheets[0]['cells'][$i][1] == 'QuestionType') { $questionTypeIndex[] = $i; } } // Variables $quiz = array(); $question = array(); $new_answer = array(); $score_list = array(); $feedback_true_list = array(); $feedback_false_list = array(); $question_description = array(); $noNegativeScoreList = array(); // Getting questions. $k = $z = $q = $l = $m = $n = 0; for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { if (is_array($data->sheets[0]['cells'][$i])) { $column_data = $data->sheets[0]['cells'][$i]; // Fill all column with data to have a full array for ($x = 1; $x <= $data->sheets[0]['numCols']; $x++) { if (empty($column_data[$x])) { $data->sheets[0]['cells'][$i][$x] = ''; } } // Array filled with data $column_data = $data->sheets[0]['cells'][$i]; } else { $column_data = ''; } // Fill quiz data if ($quiz_index == $i) { // The title always in the first position $quiz = $column_data; } elseif (in_array($i, $question_title_index)) { //a complete line where 1st column is 'Question' $question[$k] = $column_data; for ($counter = 0; $counter < 12; $counter++) { $myData = isset($data->sheets[0]['cells'][$i + $counter]) ? $data->sheets[0]['cells'][$i + $counter] : null; if (isset($myData[1]) && $myData[1] == 'QuestionType') { $questionTypeList[$k] = $myData[3]; } if (isset($myData[1]) && $myData[1] == 'Category') { $categoryList[$k] = $myData[2]; } } if (!isset($questionTypeList[$k])) { $questionTypeList[$k] = null; } $k++; } elseif (in_array($i, $score_index)) { //a complete line where 1st column is 'Score' $score_list[$z] = $column_data; $z++; } elseif (in_array($i, $feedback_true_index)) { //a complete line where 1st column is 'FeedbackTrue' $feedback_true_list[$q] = $column_data; $q++; } elseif (in_array($i, $feedback_false_index)) { //a complete line where 1st column is 'FeedbackFalse' for wrong answers $feedback_false_list[$l] = $column_data; $l++; } elseif (in_array($i, $question_description_index)) { //a complete line where 1st column is 'EnrichQuestion' $question_description[$m] = $column_data; $m++; } elseif (in_array($i, $noNegativeScoreIndex)) { //a complete line where 1st column is 'NoNegativeScore' $noNegativeScoreList[$z - 1] = $column_data; } } // Get answers for ($i = 0; $i < count($question_name_index_init); $i++) { for ($j = $question_name_index_init[$i]; $j <= $question_name_index_end[$i]; $j++) { if (is_array($data->sheets[0]['cells'][$j])) { $column_data = $data->sheets[0]['cells'][$j]; // Fill all column with data for ($x = 1; $x <= $data->sheets[0]['numCols']; $x++) { if (empty($column_data[$x])) { $data->sheets[0]['cells'][$j][$x] = ''; } } $column_data = $data->sheets[0]['cells'][$j]; // Array filled of data if (is_array($column_data) && count($column_data) > 0) { $new_answer[$i][$j] = $column_data; } } } } // Quiz title. $quiz_title = $quiz[2]; if ($quiz_title != '') { // Variables $type = 2; $random = $active = $results = $max_attempt = $expired_time = 0; // Make sure feedback is enabled (3 to disable), otherwise the fields // added to the XLS are not shown, which is confusing $feedback = 0; // Quiz object $exercise = new Exercise(); $quiz_id = $exercise->createExercise( $quiz_title, $expired_time, $type, $random, $active, $results, $max_attempt, $feedback, $propagateNegative ); if ($quiz_id) { // insert into the item_property table api_item_property_update( $_course, TOOL_QUIZ, $quiz_id, 'QuizAdded', api_get_user_id() ); // Import questions. for ($i = 0; $i < $number_questions; $i++) { // Question name $question_title = $question[$i][2]; $description = isset($question_description[$i][2]) ? $question_description[$i][2] : ''; $categoryId = null; if (isset($categoryList[$i]) && !empty($categoryList[$i])) { $categoryName = $categoryList[$i]; $categoryId = Testcategory::get_category_id_for_title($categoryName, $courseId); if (empty($categoryId)) { $category = new Testcategory(null, $categoryName, ''); $categoryId = $category->addCategoryInBDD(); } } $question_description_text = "

"; if (!empty($description)) { // Question description. $question_description_text = "

".$description."

"; } // Unique answers are the only question types available for now // through xls-format import $answerList = isset($new_answer[$i]) ? $new_answer[$i] : ''; $question_id = null; if (isset($questionTypeList[$i])) { $detectQuestionType = intval($questionTypeList[$i]); } else { $detectQuestionType = detectQuestionType( $answerList, $score_list ); } /** @var Question $answer */ switch ($detectQuestionType) { case FREE_ANSWER: $answer = new FreeAnswer(); break; case GLOBAL_MULTIPLE_ANSWER: $answer = new GlobalMultipleAnswer(); break; case MULTIPLE_ANSWER: $answer = new MultipleAnswer(); break; case FILL_IN_BLANKS: $answer = new FillBlanks(); $question_description_text = ''; break; case MATCHING: $answer = new Matching(); break; case UNIQUE_ANSWER: default: $answer = new UniqueAnswer(); break; } if ($question_title != '') { $question_id = $answer->create_question( $quiz_id, $question_title, $question_description_text, 0, // max score $answer->type ); if (!empty($categoryId)) { Testcategory::add_category_for_question_id( $categoryId, $question_id, $courseId ); } } switch ($detectQuestionType) { case GLOBAL_MULTIPLE_ANSWER: case MULTIPLE_ANSWER: case UNIQUE_ANSWER: $total = 0; if (is_array($answerList) && !empty($question_id)) { $id = 1; $objAnswer = new Answer($question_id, $courseId); $globalScore = $score_list[$i][3]; // Calculate the number of correct answers to divide the // score between them when importing from CSV $numberRightAnswers = 0; foreach ($answerList as $answer_data) { if (strtolower($answer_data[3]) == 'x') { $numberRightAnswers++; } } foreach ($answerList as $answer_data) { $answerValue = $answer_data[2]; $correct = 0; $score = 0; if (strtolower($answer_data[3]) == 'x') { $correct = 1; $score = $score_list[$i][3]; $comment = $feedback_true_list[$i][2]; } else { $comment = $feedback_false_list[$i][2]; $floatVal = (float)$answer_data[3]; if (is_numeric($floatVal)) { $score = $answer_data[3]; } } if ($useCustomScore) { if ($correct) { $score = $correctScore; } else { $score = $incorrectScore; } } // Fixing scores: switch ($detectQuestionType) { case GLOBAL_MULTIPLE_ANSWER: if (isset($noNegativeScoreList[$i][3])) { if (!(strtolower($noNegativeScoreList[$i][3]) == 'x') && !$correct ) { $score = $score_list[$i][3] * -1; } } else { $score = $score_list[$i][3] * -1; } $score /= $numberRightAnswers; break; case UNIQUE_ANSWER: break; case MULTIPLE_ANSWER: if (!$correct) { //$total = $total - $score; } break; } $objAnswer->createAnswer( $answerValue, $correct, $comment, $score, $id ); $total += $score; $id++; } $objAnswer->save(); $questionObj = Question::read( $question_id, $courseId ); switch ($detectQuestionType) { case GLOBAL_MULTIPLE_ANSWER: $questionObj->updateWeighting($globalScore); break; case UNIQUE_ANSWER: case MULTIPLE_ANSWER: default: $questionObj->updateWeighting($total); break; } $questionObj->save(); } break; case FREE_ANSWER: $questionObj = Question::read($question_id, $courseId); $globalScore = $score_list[$i][3]; $questionObj->updateWeighting($globalScore); $questionObj->save(); break; case FILL_IN_BLANKS: $scoreList = array(); $size = array(); $globalScore = 0; foreach ($answerList as $data) { $score = isset($data[3]) ? $data[3] : 0; $globalScore += $score; $scoreList[] = $score; $size[] = 200; } $scoreToString = implode(',', $scoreList); $sizeToString = implode(',', $size); //

Texte long avec les [mots] à [remplir] mis entre [crochets]

::10,10,10:200.36363999999998,200,200:0@' $answerValue = $description.'::'.$scoreToString.':'.$sizeToString.':0@'; $objAnswer = new Answer($question_id, $courseId); $objAnswer->createAnswer( $answerValue, '', //$correct, '', //$comment, $globalScore, 1 ); $objAnswer->save(); $questionObj = Question::read($question_id, $courseId); $questionObj->updateWeighting($globalScore); $questionObj->save(); break; case MATCHING: $globalScore = $score_list[$i][3]; $position = 1; $objAnswer = new Answer($question_id, $courseId); foreach ($answerList as $data) { $option = isset($data[3]) ? $data[3] : ''; $objAnswer->createAnswer($option, 0, '', 0, $position); $position++; } $counter = 1; foreach ($answerList as $data) { $value = isset($data[2]) ? $data[2] : ''; $position++; $objAnswer->createAnswer( $value, $counter, ' ', $globalScore, $position ); $counter++; } $objAnswer->save(); $questionObj = Question::read($question_id, $courseId); $questionObj->updateWeighting($globalScore); $questionObj->save(); break; } } } if (isset($_SESSION['lpobject'])) { if ($debug > 0) { error_log('New LP - SESSION[lpobject] is defined', 0); } $oLP = unserialize($_SESSION['lpobject']); if (is_object($oLP)) { if ($debug > 0) { error_log('New LP - oLP is object', 0); } if ((empty($oLP->cc)) OR $oLP->cc != api_get_course_id()) { if ($debug > 0) { error_log('New LP - Course has changed, discard lp object', 0); } $oLP = null; Session::erase('oLP'); Session::erase('lpobject'); } else { $_SESSION['oLP'] = $oLP; } } } if (isset($_SESSION['oLP']) && isset($_GET['lp_id'])) { $previous = $_SESSION['oLP']->select_previous_item_id(); $parent = 0; // Add a Quiz as Lp Item $_SESSION['oLP']->add_item($parent, $previous, TOOL_QUIZ, $quiz_id, $quiz_title, ''); // Redirect to home page for add more content header('location: ../newscorm/lp_controller.php?'.api_get_cidreq().'&action=add_item&type=step&lp_id='.Security::remove_XSS($_GET['lp_id'])); exit; } else { // header('location: exercice.php?' . api_get_cidreq()); echo ''; } } } /** * @param array $answers_data * @return int */ function detectQuestionType($answers_data) { $correct = 0; $isNumeric = false; if (empty($answers_data)) { return FREE_ANSWER; } foreach ($answers_data as $answer_data) { if (strtolower($answer_data[3]) == 'x') { $correct++; } else { if (is_numeric($answer_data[3])) { $isNumeric = true; } } } if ($correct == 1) { $type = UNIQUE_ANSWER; } else if ($correct > 1) { $type = MULTIPLE_ANSWER; } else { $type = FREE_ANSWER; } if ($type == MULTIPLE_ANSWER) { if ($isNumeric) { $type = MULTIPLE_ANSWER; } else { $type = GLOBAL_MULTIPLE_ANSWER; } } return $type; } if (!isset($origin) || isset($origin) && $origin != 'learnpath') { //so we are not in learnpath tool Display :: display_footer(); }