diff --git a/main/admin/questions.php b/main/admin/questions.php index f53dd6a87a..b25964cb45 100644 --- a/main/admin/questions.php +++ b/main/admin/questions.php @@ -96,7 +96,7 @@ if ($formSent) { $question->courseCode = $courseCode; // Creating empty exercise $exercise = new Exercise($courseId); - $questionObject = Question::read($question->getId(), $courseId); + $questionObject = Question::read($question->getId(), $courseInfo); ob_start(); ExerciseLib::showQuestion( diff --git a/main/exercise/annotation_user.php b/main/exercise/annotation_user.php index 71fdcd5d32..cc6838d763 100644 --- a/main/exercise/annotation_user.php +++ b/main/exercise/annotation_user.php @@ -14,7 +14,7 @@ if (empty($courseInfo)) { return ''; } -$objQuestion = Question::read($questionId, $courseId); +$objQuestion = Question::read($questionId, $courseInfo); $documentPath = api_get_path(SYS_COURSE_PATH).$courseInfo['path'].'/document'; $picturePath = $documentPath.'/images'; $pictureSize = getimagesize($picturePath.'/'.$objQuestion->getPictureFilename()); diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index cddab48f69..559c690bcc 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -216,7 +216,6 @@ class Exercise } $this->force_edit_exercise_in_lp = api_get_configuration_value('force_edit_exercise_in_lp'); - $this->edit_exercise_in_lp = true; if ($this->exercise_was_added_in_lp) { $this->edit_exercise_in_lp = $this->force_edit_exercise_in_lp == true; @@ -3318,7 +3317,7 @@ class Exercise // Creates a temporary Question object $course_id = $this->course_id; - $objQuestionTmp = Question::read($questionId, $course_id); + $objQuestionTmp = Question::read($questionId, $this->course); if ($objQuestionTmp === false) { return false; @@ -6453,7 +6452,6 @@ class Exercise $new_question_list = []; if (!empty($question_list)) { $media_questions = $this->getMediaList(); - $media_active = $this->mediaIsActivated($media_questions); if ($media_active) { @@ -7476,7 +7474,7 @@ class Exercise } else { // standard test, just add each question score foreach ($questionList as $questionId) { - $question = Question::read($questionId, $this->course_id); + $question = Question::read($questionId, $this->course); $out_max_score += $question->weighting; } } @@ -8098,13 +8096,12 @@ class Exercise */ private function getQuestionOrderedList() { - $questionList = []; $TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION); // Getting question_order to verify that the question // list is correct and all question_order's were set - $sql = "SELECT DISTINCT e.question_order + $sql = "SELECT DISTINCT count(e.question_order) as count FROM $TBL_EXERCICE_QUESTION e INNER JOIN $TBL_QUESTIONS q ON (e.question_id = q.id AND e.c_id = q.c_id) @@ -8113,7 +8110,8 @@ class Exercise e.exercice_id = ".$this->id; $result = Database::query($sql); - $count_question_orders = Database::num_rows($result); + $row = Database::fetch_array($result); + $count_question_orders = $row['count']; // Getting question list from the order (question list drag n drop interface). $sql = "SELECT DISTINCT e.question_id, e.question_order @@ -8130,6 +8128,7 @@ class Exercise // the key of the array is the question position $temp_question_list = []; $counter = 1; + $questionList = []; while ($new_object = Database::fetch_object($result)) { // Correct order. $questionList[$new_object->question_order] = $new_object->question_id; @@ -8440,6 +8439,8 @@ class Exercise private function setMediaList($questionList) { $mediaList = []; + /* + * Media feature is not activated in 1.11.x if (!empty($questionList)) { foreach ($questionList as $questionId) { $objQuestionTmp = Question::read($questionId, $this->course_id); @@ -8451,7 +8452,8 @@ class Exercise $mediaList[999][] = $objQuestionTmp->id; } } - } + }*/ + $this->mediaList = $mediaList; } diff --git a/main/exercise/hotspot_answers.as.php b/main/exercise/hotspot_answers.as.php index c3cfc29b72..11f922c6dc 100755 --- a/main/exercise/hotspot_answers.as.php +++ b/main/exercise/hotspot_answers.as.php @@ -50,7 +50,7 @@ if (!api_is_allowed_to_edit(null, true)) { } } -$objQuestion = Question::read($questionId, $courseId); +$objQuestion = Question::read($questionId, $objExercise->course); $objExercise->read($exerciseId); if (empty($objQuestion) || empty($objExercise)) { diff --git a/main/exercise/question.class.php b/main/exercise/question.class.php index 0ea9c40f08..e633ae7737 100755 --- a/main/exercise/question.class.php +++ b/main/exercise/question.class.php @@ -122,22 +122,20 @@ abstract class Question /** * Reads question information from the data base. * - * @param int $id - question ID - * @param int $course_id + * @param int $id - question ID + * @param array $course_info + * @param bool $getExerciseList * * @return Question * * @author Olivier Brouckaert */ - public static function read($id, $course_id = null) + public static function read($id, $course_info = [], $getExerciseList = true) { $id = (int) $id; - if (!empty($course_id)) { - $course_info = api_get_course_info_by_id($course_id); - } else { + if (empty($course_info)) { $course_info = api_get_course_info(); } - $course_id = $course_info['real_id']; if (empty($course_id) || $course_id == -1) { @@ -171,22 +169,24 @@ abstract class Question $objQuestion->category = TestCategory::getCategoryForQuestion($id, $course_id); $objQuestion->code = isset($object->code) ? $object->code : ''; - $tblQuiz = Database::get_course_table(TABLE_QUIZ_TEST); - $sql = "SELECT DISTINCT q.exercice_id - FROM $TBL_EXERCISE_QUESTION q - INNER JOIN $tblQuiz e - ON e.c_id = q.c_id AND e.id = q.exercice_id - WHERE - q.c_id = $course_id AND - q.question_id = $id AND - e.active >= 0"; + if ($getExerciseList) { + $tblQuiz = Database::get_course_table(TABLE_QUIZ_TEST); + $sql = "SELECT DISTINCT q.exercice_id + FROM $TBL_EXERCISE_QUESTION q + INNER JOIN $tblQuiz e + ON e.c_id = q.c_id AND e.id = q.exercice_id + WHERE + q.c_id = $course_id AND + q.question_id = $id AND + e.active >= 0"; - $result = Database::query($sql); + $result = Database::query($sql); - // fills the array with the exercises which this question is in - if ($result) { - while ($obj = Database::fetch_object($result)) { - $objQuestion->exerciseList[] = $obj->exercice_id; + // fills the array with the exercises which this question is in + if ($result) { + while ($obj = Database::fetch_object($result)) { + $objQuestion->exerciseList[] = $obj->exercice_id; + } } } diff --git a/main/exercise/question_pool.php b/main/exercise/question_pool.php index 700ef22703..3964922d15 100755 --- a/main/exercise/question_pool.php +++ b/main/exercise/question_pool.php @@ -71,7 +71,7 @@ if ($is_allowedToEdit) { $current_course = api_get_course_info(); $old_question_id = $question_copy; // Reading the source question - $old_question_obj = Question::read($old_question_id, $origin_course_id); + $old_question_obj = Question::read($old_question_id, $origin_course_info); $courseId = $current_course['real_id']; if ($old_question_obj) { $old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy')); @@ -141,7 +141,7 @@ if ($is_allowedToEdit) { $current_course = api_get_course_info(); foreach ($question_data as $old_question_id) { //Reading the source question - $old_question_obj = Question::read($old_question_id, $origin_course_id); + $old_question_obj = Question::read($old_question_id, $origin_course_info); if ($old_question_obj) { $old_question_obj->updateTitle( $old_question_obj->selectTitle().' - '.get_lang('Copy') @@ -1040,7 +1040,8 @@ function get_action_icon_for_question( */ function get_question_type_for_question($in_selectedcourse, $in_questionid) { - $myObjQuestion = Question::read($in_questionid, $in_selectedcourse); + $courseInfo = api_get_course_info_by_id($in_selectedcourse); + $myObjQuestion = Question::read($in_questionid, $courseInfo); $questionType = null; if (!empty($myObjQuestion)) { list($typeImg, $typeExpl) = $myObjQuestion->get_type_icon_html(); diff --git a/main/exercise/recalculate.php b/main/exercise/recalculate.php index a591d7b07f..acec7ffb68 100644 --- a/main/exercise/recalculate.php +++ b/main/exercise/recalculate.php @@ -62,7 +62,7 @@ if ('true' === $pluginEvaluation->get(QuestionOptionsEvaluationPlugin::SETTING_E if (!$useEvaluationPlugin) { foreach ($questionList as $questionId) { - $question = Question::read($questionId, $courseId); + $question = Question::read($questionId, api_get_course_info()); $totalWeight += $question->selectWeighting(); // We're inside *one* question. Go through each possible answer for this question diff --git a/main/exercise/upload_exercise.php b/main/exercise/upload_exercise.php index 57d8213c98..14ba913367 100755 --- a/main/exercise/upload_exercise.php +++ b/main/exercise/upload_exercise.php @@ -436,7 +436,7 @@ function lp_upload_quiz_action_handling() $questionObj = Question::read( $question_id, - $courseId + $_course ); if ($questionObj) { @@ -456,7 +456,7 @@ function lp_upload_quiz_action_handling() break; case FREE_ANSWER: $globalScore = isset($scoreList[$i]) ? $scoreList[$i] : null; - $questionObj = Question::read($question_id, $courseId); + $questionObj = Question::read($question_id, $_course); if ($questionObj) { $questionObj->updateWeighting($globalScore); $questionObj->save($exercise); @@ -489,7 +489,7 @@ function lp_upload_quiz_action_handling() $objAnswer->save(); - $questionObj = Question::read($question_id, $courseId); + $questionObj = Question::read($question_id, $_course); if ($questionObj) { $questionObj->updateWeighting($globalScore); $questionObj->save($exercise); @@ -520,7 +520,7 @@ function lp_upload_quiz_action_handling() $counter++; } $objAnswer->save(); - $questionObj = Question::read($question_id, $courseId); + $questionObj = Question::read($question_id, $_course); if ($questionObj) { $questionObj->updateWeighting($globalScore); $questionObj->save($exercise); diff --git a/main/inc/ajax/exercise.ajax.php b/main/inc/ajax/exercise.ajax.php index b9bb0b0f1a..89b11c7180 100755 --- a/main/inc/ajax/exercise.ajax.php +++ b/main/inc/ajax/exercise.ajax.php @@ -498,7 +498,7 @@ switch ($action) { $total_weight = 0; if ($type == 'simple') { foreach ($question_list as $my_question_id) { - $objQuestionTmp = Question::read($my_question_id, $course_id); + $objQuestionTmp = Question::read($my_question_id, $objExercise->course); $total_weight += $objQuestionTmp->selectWeighting(); } } @@ -521,7 +521,7 @@ switch ($action) { } // Creates a temporary Question object - $objQuestionTmp = Question::read($my_question_id, $course_id); + $objQuestionTmp = Question::read($my_question_id, $objExercise->course); $myChoiceDegreeCertainty = null; if ($objQuestionTmp->type === MULTIPLE_ANSWER_TRUE_FALSE_DEGREE_CERTAINTY) { diff --git a/main/inc/lib/exercise.lib.php b/main/inc/lib/exercise.lib.php index 420fec47b9..e68943221a 100644 --- a/main/inc/lib/exercise.lib.php +++ b/main/inc/lib/exercise.lib.php @@ -56,7 +56,7 @@ class ExerciseLib // Change false to true in the following line to enable answer hinting $debug_mark_answer = $show_answers; // Reads question information - if (!$objQuestionTmp = Question::read($questionId, $course_id)) { + if (!$objQuestionTmp = Question::read($questionId, $course)) { // Question not found return false; } @@ -2545,7 +2545,7 @@ HOTSPOT; $question_list = explode(',', $exercise_stat_info['data_tracking']); if (!empty($question_list)) { foreach ($question_list as $questionId) { - $objQuestionTmp = Question::read($questionId, $course_id); + $objQuestionTmp = Question::read($questionId, $objExercise->course); // We're inside *one* question. Go through each possible answer for this question $result = $objExercise->manage_answer( $exeId, @@ -4560,7 +4560,7 @@ EOT; if (!empty($question_list)) { foreach ($question_list as $questionId) { // Creates a temporary Question object - $objQuestionTmp = Question::read($questionId); + $objQuestionTmp = Question::read($questionId, $objExercise->course); // This variable came from exercise_submit_modal.php ob_start(); $choice = null; diff --git a/plugin/questionoptionsevaluation/QuestionOptionsEvaluationPlugin.php b/plugin/questionoptionsevaluation/QuestionOptionsEvaluationPlugin.php index 9da2ebff8f..323bd2624b 100644 --- a/plugin/questionoptionsevaluation/QuestionOptionsEvaluationPlugin.php +++ b/plugin/questionoptionsevaluation/QuestionOptionsEvaluationPlugin.php @@ -203,12 +203,17 @@ class QuestionOptionsEvaluationPlugin extends Plugin */ private function recalculateQuestionScore($formula, Exercise $exercise) { - foreach ($exercise->questionList as $questionId) { - $question = Question::read($questionId); + $counter = 0; + + $table = Database::get_course_table(TABLE_QUIZ_QUESTION); + $tableAnswer = Database::get_course_table(TABLE_QUIZ_ANSWER); + foreach ($exercise->questionList as $questionId) { + $question = Question::read($questionId, $exercise->course, false); if (!in_array($question->selectType(), [UNIQUE_ANSWER, MULTIPLE_ANSWER])) { continue; } + $counter++; $questionAnswers = new Answer($questionId, $exercise->course_id, $exercise); $counts = array_count_values($questionAnswers->correct); @@ -217,7 +222,6 @@ class QuestionOptionsEvaluationPlugin extends Plugin foreach ($questionAnswers->correct as $i => $correct) { if ($question->selectType() == MULTIPLE_ANSWER || 0 === $formula) { $weighting[$i] = 1 == $correct ? 1 / $counts[1] : -1 / $counts[0]; - continue; } @@ -226,15 +230,16 @@ class QuestionOptionsEvaluationPlugin extends Plugin } } - $questionAnswers->new_nbrAnswers = $questionAnswers->nbrAnswers; - $questionAnswers->new_answer = $questionAnswers->answer; - $questionAnswers->new_comment = $questionAnswers->comment; - $questionAnswers->new_correct = $questionAnswers->correct; - $questionAnswers->new_weighting = $weighting; - $questionAnswers->new_position = $questionAnswers->position; - $questionAnswers->new_destination = $questionAnswers->destination; - $questionAnswers->new_hotspot_coordinates = $questionAnswers->hotspot_coordinates; - $questionAnswers->new_hotspot_type = $questionAnswers->hotspot_type; + for ($i = 1; $i <= $questionAnswers->nbrAnswers; $i++) { + $weightingValue = $weighting[$i]; + if (!isset($questionAnswers->iid[$i])) { + continue; + } + + $iid = $questionAnswers->iid[$i]; + $sql = "UPDATE $tableAnswer SET ponderation = '$weightingValue' WHERE iid = $iid"; + Database::query($sql); + } $allowedWeights = array_filter( $weighting, @@ -243,9 +248,15 @@ class QuestionOptionsEvaluationPlugin extends Plugin } ); - $questionAnswers->save(); - $question->updateWeighting(array_sum($allowedWeights)); - $question->save($exercise); + //$question->updateWeighting(array_sum($allowedWeights)); + //$question->save($exercise); + + $params = ['ponderation' => array_sum($allowedWeights)]; + Database::update( + $table, + $params, + ['iid = ?' => [$question->iid]] + ); } } diff --git a/plugin/questionoptionsevaluation/evaluation.php b/plugin/questionoptionsevaluation/evaluation.php index 4c68f63634..32504c7a75 100644 --- a/plugin/questionoptionsevaluation/evaluation.php +++ b/plugin/questionoptionsevaluation/evaluation.php @@ -16,7 +16,7 @@ if (empty($exerciseId)) { $exercise = new Exercise(); -if (!$exercise->read($exerciseId)) { +if (!$exercise->read($exerciseId, false)) { echo Display::return_message(get_lang('ExerciseNotFound'), 'error'); exit; @@ -48,11 +48,10 @@ $formEvaluation->addButtonSave(get_lang('Save'))->setColumnsSize([4, 7, 1]); $formEvaluation->addHidden('exercise', $exerciseId); if ($formEvaluation->validate()) { + $exercise->read($exerciseId, true); $values = $formEvaluation->exportValues(); $formula = isset($values['formula']) ? (int) $values['formula'] : 0; - $plugin->saveFormulaForExercise($formula, $exercise); - Display::addFlash( Display::return_message( sprintf($plugin->get_lang('FormulaSavedForExerciseX'), $exercise->selectTitle(true)), diff --git a/src/Chamilo/CourseBundle/Component/CourseCopy/Resources/QuizQuestion.php b/src/Chamilo/CourseBundle/Component/CourseCopy/Resources/QuizQuestion.php index 415da830db..559c9d5ac5 100644 --- a/src/Chamilo/CourseBundle/Component/CourseCopy/Resources/QuizQuestion.php +++ b/src/Chamilo/CourseBundle/Component/CourseCopy/Resources/QuizQuestion.php @@ -110,7 +110,7 @@ class QuizQuestion extends Resource $courseId = $courseInfo['real_id']; $courseCode = $courseInfo['code']; $questionId = $this->source_id; - $question = \Question::read($questionId, $courseId); + $question = \Question::read($questionId, $courseInfo); $pictureId = $question->getPictureId(); // Add the picture document in the builder if (!empty($pictureId)) {