Exercise: Convert id usage for iid - refs #18452

pull/3935/head
Yannick Warnier 5 years ago committed by GitHub
parent 1234d37326
commit 915d67909d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      main/admin/questions.php
  2. 2
      main/exercise/Annotation.php
  3. 8
      main/exercise/Draggable.php
  4. 10
      main/exercise/MatchingDraggable.php
  5. 31
      main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php
  6. 3
      main/exercise/ReadingComprehension.php
  7. 93
      main/exercise/TestCategory.php
  8. 21
      main/exercise/UniqueAnswerImage.php
  9. 25
      main/exercise/admin.php
  10. 95
      main/exercise/answer.class.php
  11. 12
      main/exercise/calculated_answer.class.php
  12. 4
      main/exercise/comparative_group_report.php
  13. 455
      main/exercise/exercise.class.php
  14. 22
      main/exercise/exercise.php
  15. 8
      main/exercise/exercise_admin.php
  16. 32
      main/exercise/exercise_global_report.php
  17. 2
      main/exercise/exercise_history.php
  18. 8
      main/exercise/exercise_question_reminder.php
  19. 8
      main/exercise/exercise_reminder.php
  20. 4
      main/exercise/exercise_report.php
  21. 8
      main/exercise/exercise_result.class.php
  22. 12
      main/exercise/exercise_result.php
  23. 10
      main/exercise/exercise_show.php
  24. 21
      main/exercise/exercise_submit.php
  25. 2
      main/exercise/export/aiken/aiken_classes.php
  26. 2
      main/exercise/export/aiken/aiken_import.inc.php
  27. 30
      main/exercise/export/qti2/qti2_classes.php
  28. 4
      main/exercise/export/qti2/qti2_export.php
  29. 2
      main/exercise/export/scorm/ScormAssessmentItem.php
  30. 12
      main/exercise/export/scorm/ScormExercise.php
  31. 32
      main/exercise/export/scorm/ScormQuestion.php
  32. 8
      main/exercise/fill_blanks.class.php
  33. 2
      main/exercise/freeanswer.class.php
  34. 10
      main/exercise/global_multiple_answer.class.php
  35. 2
      main/exercise/hotpotatoes.php
  36. 2
      main/exercise/hotpotatoes_exercise_result.class.php
  37. 7
      main/exercise/hotspot_actionscript.as.php
  38. 2
      main/exercise/hotspot_actionscript_admin.as.php
  39. 2
      main/exercise/hotspot_admin.inc.php
  40. 6
      main/exercise/hotspot_answers.as.php
  41. 4
      main/exercise/hotspot_save.inc.php
  42. 2
      main/exercise/live_stats.php
  43. 12
      main/exercise/matching.class.php
  44. 10
      main/exercise/multiple_answer.class.php
  45. 10
      main/exercise/multiple_answer_combination.class.php
  46. 24
      main/exercise/multiple_answer_true_false.class.php
  47. 16
      main/exercise/oral_expression.class.php
  48. 10
      main/exercise/overview.php
  49. 2
      main/exercise/pending.php
  50. 169
      main/exercise/question.class.php
  51. 8
      main/exercise/question_admin.inc.php
  52. 8
      main/exercise/question_create.php
  53. 4
      main/exercise/question_list_admin.inc.php
  54. 92
      main/exercise/question_pool.php
  55. 4
      main/exercise/question_stats.php
  56. 2
      main/exercise/tests_category.php
  57. 14
      main/exercise/unique_answer.class.php
  58. 29
      main/exercise/unique_answer_no_option.class.php
  59. 10
      main/inc/ajax/exercise.ajax.php
  60. 70
      main/inc/lib/exercise.lib.php
  61. 3
      main/install/configuration.dist.php
  62. 32
      src/Chamilo/CourseBundle/Component/CourseCopy/CourseBuilder.php
  63. 26
      src/Chamilo/CourseBundle/Component/CourseCopy/CourseRecycler.php
  64. 41
      src/Chamilo/CourseBundle/Component/CourseCopy/CourseRestorer.php
  65. 30
      src/Chamilo/CourseBundle/Entity/CQuiz.php
  66. 23
      src/Chamilo/CourseBundle/Entity/CQuizAnswer.php
  67. 19
      src/Chamilo/CourseBundle/Entity/CQuizQuestion.php
  68. 9
      src/Chamilo/CourseBundle/Entity/CQuizQuestionCategory.php
  69. 29
      src/Chamilo/CourseBundle/Entity/CQuizQuestionOption.php

@ -180,7 +180,7 @@ if ($formSent) {
foreach ($exerciseList as $exercise) {
$question->questionData .= $exercise->getTitle();
if ($exercise->getActive() == -1) {
$question->questionData .= '- ('.get_lang('ExerciseDeleted').' #'.$exercise->getIid().') ';
$question->questionData .= '- ('.get_lang('ExerciseDeleted').' #'.$exercise->getId().') ';
}
$question->questionData .= '<br />';
}

@ -41,7 +41,7 @@ class Annotation extends Question
['step' => '0.1']
);
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults(['weighting' => float_format($this->weighting, 1)]);
} else {
if ($this->isContent == 1) {

@ -50,10 +50,10 @@ class Draggable extends Question
if (isset($_POST['moreOptions'])) {
$nb_options++;
}
} elseif (!empty($this->id)) {
} elseif (!empty($this->iid)) {
$defaults['orientation'] = in_array($this->extra, ['h', 'v']) ? $this->extra : 'h';
$answer = new Answer($this->id);
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0) {
@ -154,7 +154,7 @@ class Draggable extends Question
$form->addGroup($group);
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
$form->setDefaults(['orientation' => 'h']);
@ -181,7 +181,7 @@ class Draggable extends Question
$nb_matches = $form->getSubmitValue('nb_matches');
$this->weighting = 0;
$position = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
// Insert the options
for ($i = 1; $i <= $nb_matches; $i++) {
$position++;

@ -32,8 +32,8 @@ class MatchingDraggable extends Question
$matches = [];
$answer = null;
$counter = 1;
if (isset($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0) {
@ -58,7 +58,7 @@ class MatchingDraggable extends Question
$nb_matches++;
$nb_options++;
}
} elseif (!empty($this->id)) {
} elseif (!empty($this->iid)) {
if ($answer->nbrAnswers > 0) {
$nb_matches = $nb_options = 0;
for ($i = 1; $i <= $answer->nbrAnswers; $i++) {
@ -204,7 +204,7 @@ class MatchingDraggable extends Question
$group[] = $form->addButtonSave($text, 'submitQuestion', true);
$form->addGroup($group);
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -229,7 +229,7 @@ class MatchingDraggable extends Question
$nb_options = $form->getSubmitValue('nb_options');
$this->weighting = 0;
$position = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
// Insert the options
for ($i = 1; $i <= $nb_options; $i++) {

@ -83,8 +83,8 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
$correct = 0;
$answer = null;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nbAnswers = $answer->nbrAnswers;
@ -100,7 +100,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
}
// Can be more options
$optionData = Question::readQuestionOption($this->id, $courseId);
$optionData = Question::readQuestionOption($this->iid, $courseId);
for ($i = 1; $i <= $nbAnswers; $i++) {
$renderer->setElementTemplate(
@ -201,7 +201,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
$form->addElement('hidden', 'options_count', 3);
$form->addElement('html', '</table><br /><br />');
//Extra values True, false, Dont known
//Extra values True, false, Don't known
if (!empty($this->extra)) {
$scores = explode(':', $this->extra);
if (!empty($scores)) {
@ -211,7 +211,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
}
if ($objEx->edit_exercise_in_lp === true ||
(empty($this->exerciseList) && empty($objEx->id))
(empty($this->exerciseList) && empty($objEx->iid))
) {
$form->addElement('submit', 'lessAnswers', get_lang('LessAnswer'), 'class="btn btn-danger minus"');
$form->addElement('submit', 'moreAnswers', get_lang('PlusAnswer'), 'class="btn btn-primary plus"');
@ -222,7 +222,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
$renderer->setElementTemplate('{element}&nbsp;', 'moreAnswers');
$form->addElement('html', '</div></div>');
if (!empty($this->id) && !$form->isSubmitted()) {
if (!empty($this->iid) && !$form->isSubmitted()) {
$form->setDefaults($defaults);
}
@ -238,28 +238,28 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
public function processAnswersCreation($form, $exercise)
{
$questionWeighting = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nbAnswers = $form->getSubmitValue('nb_answers');
$courseId = api_get_course_int_id();
$correct = [];
$options = Question::readQuestionOption($this->id, $courseId);
$options = Question::readQuestionOption($this->iid, $courseId);
if (!empty($options)) {
foreach ($options as $optionData) {
$id = $optionData['id'];
unset($optionData['id']);
$id = $optionData['iid'];
unset($optionData['iid']);
Question::updateQuestionOption($id, $optionData, $courseId);
}
} else {
for ($i = 1; $i <= 8; $i++) {
$lastId = Question::saveQuestionOption($this->id, $this->options[$i], $courseId, $i);
$lastId = Question::saveQuestionOption($this->iid, $this->options[$i], $courseId, $i);
$correct[$i] = $lastId;
}
}
/* Getting quiz_question_options (true, false, doubt) because
it's possible that there are more options in the future */
$newOptions = Question::readQuestionOption($this->id, $courseId);
$newOptions = Question::readQuestionOption($this->iid, $courseId);
$sortedByPosition = [];
foreach ($newOptions as $item) {
$sortedByPosition[$item['position']] = $item;
@ -282,7 +282,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
if (empty($options)) {
// If this is the first time that the question is created then change
// the default values from the form 1 and 2 by the correct "option id" registered
$goodAnswer = $sortedByPosition[$goodAnswer]['id'];
$goodAnswer = $sortedByPosition[$goodAnswer]['iid'];
}
$questionWeighting += $extraValues[0]; //By default 0 has the correct answers
$objAnswer->createAnswer($answer, $goodAnswer, $comment, '', $i);
@ -1143,11 +1143,10 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
public static function getPercentagePosition($optionId)
{
$tblAnswerOption = Database::get_course_table(TABLE_QUIZ_QUESTION_OPTION);
$courseId = api_get_course_int_id();
$optionId = (int) $optionId;
$sql = "SELECT position
FROM $tblAnswerOption
WHERE c_id = $courseId AND id = $optionId";
WHERE iid = $optionId";
$res = Database::query($sql);
if (Database::num_rows($res) == 0) {
@ -1232,7 +1231,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
$sql = "SELECT exe_exo_id
FROM $tableTrackEExercise
WHERE exe_id=".$exeId;
WHERE exe_id = ".$exeId;
$res = Database::query($sql);
$data = Database::fetch_assoc($res);
if ($data) {

@ -1,3 +1,4 @@
<?php
/* For licensing terms, see /license.txt */
@ -211,7 +212,7 @@ class ReadingComprehension extends UniqueAnswer
$template = $view->get_template('exercise/reading_comprehension.tpl');
$view->assign('id', $this->id);
$view->assign('id', $this->iid);
$view->assign('text', nl2br($text));
$view->assign('words_count', $wordsCount);
$view->assign('turns', $turns);

@ -15,7 +15,7 @@ use ChamiloSession as Session;
*/
class TestCategory
{
public $id;
public $iid;
public $name;
public $description;
@ -29,7 +29,7 @@ class TestCategory
}
/**
* return the TestCategory object with id=in_id.
* return the TestCategory object with iid=$id.
*
* @param int $id
* @param int $courseId
@ -42,13 +42,13 @@ class TestCategory
$id = (int) $id;
$courseId = empty($courseId) ? api_get_course_int_id() : (int) $courseId;
$sql = "SELECT * FROM $table
WHERE id = $id AND c_id = ".$courseId;
WHERE iid = ".$id;
$res = Database::query($sql);
if (Database::num_rows($res)) {
$row = Database::fetch_array($res);
$this->id = $row['id'];
$this->iid = $row['iid'];
$this->name = $row['title'];
$this->description = $row['description'];
@ -90,9 +90,6 @@ class TestCategory
$newId = Database::insert($table, $params);
if ($newId) {
$sql = "UPDATE $table SET id = iid WHERE iid = $newId";
Database::query($sql);
api_item_property_update(
$courseInfo,
TOOL_TEST_CATEGORY,
@ -126,19 +123,19 @@ class TestCategory
if ($category) {
$sql = "DELETE FROM $table
WHERE id= $id AND c_id=".$course_id;
WHERE iid = ".$id;
Database::query($sql);
// remove link between question and category
$sql = "DELETE FROM $tbl_question_rel_cat
WHERE category_id = $id AND c_id=".$course_id;
WHERE category_id = ".$id;
Database::query($sql);
// item_property update
$courseInfo = api_get_course_info_by_id($course_id);
api_item_property_update(
$courseInfo,
TOOL_TEST_CATEGORY,
$this->id,
$this->iid,
'TestCategoryDeleted',
api_get_user_id()
);
@ -159,7 +156,7 @@ class TestCategory
public function modifyCategory($courseId = 0)
{
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$id = (int) $this->id;
$id = (int) $this->iid;
$name = Database::escape_string($this->name);
$description = Database::escape_string($this->description);
$cat = $this->getCategory($id, $courseId);
@ -173,13 +170,13 @@ class TestCategory
$sql = "UPDATE $table SET
title = '$name',
description = '$description'
WHERE id = $id AND c_id = ".$courseId;
WHERE iid = $id";
Database::query($sql);
api_item_property_update(
$courseInfo,
TOOL_TEST_CATEGORY,
$this->id,
$this->iid,
'TestCategoryModified',
api_get_user_id()
);
@ -196,10 +193,10 @@ class TestCategory
public function getCategoryQuestionsNumber()
{
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
$id = (int) $this->id;
$id = (int) $this->iid;
$sql = "SELECT count(*) AS nb
FROM $table
WHERE category_id = $id AND c_id=".api_get_course_int_id();
WHERE category_id = $id AND c_id = ".api_get_course_int_id();
$res = Database::query($sql);
$row = Database::fetch_array($res);
@ -224,13 +221,13 @@ class TestCategory
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$categories = [];
if (empty($field)) {
$sql = "SELECT id FROM $table
$sql = "SELECT iid FROM $table
WHERE c_id = $courseId
ORDER BY title ASC";
$res = Database::query($sql);
while ($row = Database::fetch_array($res)) {
$category = new TestCategory();
$categories[] = $category->getCategory($row['id'], $courseId);
$categories[] = $category->getCategory($row['iid'], $courseId);
}
} else {
$field = Database::escape_string($field);
@ -311,7 +308,7 @@ class TestCategory
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$sql = "SELECT title
FROM $table
WHERE id = $categoryId AND c_id = $courseId";
WHERE iid = $categoryId";
$res = Database::query($sql);
$data = Database::fetch_array($res);
$result = '';
@ -341,7 +338,7 @@ class TestCategory
$categories = [];
if (!empty($categoriesInExercise)) {
foreach ($categoriesInExercise as $category) {
$categories[$category['id']] = $category;
$categories[$category['iid']] = $category;
}
}
@ -392,10 +389,10 @@ class TestCategory
$categories = self::getListOfCategoriesIDForTest($exerciseId);
foreach ($categories as $catInfo) {
$categoryId = $catInfo['id'];
$categoryId = $catInfo['iid'];
if (!empty($categoryId)) {
$result[$categoryId] = [
'id' => $categoryId,
'iid' => $categoryId,
'title' => $catInfo['title'],
//'parent_id' => $catInfo['parent_id'],
'parent_id' => '',
@ -416,10 +413,10 @@ class TestCategory
$categories = self::getListOfCategoriesIDForTestObject($exercise);
foreach ($categories as $cat_id) {
$cat = new TestCategory();
//Todo remove this weird array casting
$cat = (array) $cat->getCategory($cat_id);
$cat['iid'] = $cat['id'];
$cat['title'] = $cat['name'];
$result[$cat['id']] = $cat;
$result[$cat['iid']] = $cat;
}
return $result;
@ -467,13 +464,13 @@ class TestCategory
$count = 0;
$categories = self::getListOfCategoriesIDForTest($exerciseId);
foreach ($categories as $category) {
if (empty($category['id'])) {
if (empty($category['iid'])) {
continue;
}
$nbQuestionInThisCat = self::getNumberOfQuestionsInCategoryForTest(
$exerciseId,
$category['id']
$category['iid']
);
if ($nbQuestionInThisCat > $random) {
@ -502,7 +499,7 @@ class TestCategory
$categories = self::getCategoryListInfo('', $courseId);
$result = ['0' => get_lang('NoCategorySelected')];
for ($i = 0; $i < count($categories); $i++) {
$result[$categories[$i]->id] = $categories[$i]->name;
$result[$categories[$i]->iid] = $categories[$i]->name;
}
return $result;
@ -540,11 +537,11 @@ class TestCategory
$sql = "SELECT DISTINCT qrc.question_id, qrc.category_id
FROM $TBL_QUESTION_REL_CATEGORY qrc
INNER JOIN $TBL_EXERCICE_QUESTION eq
ON (eq.question_id = qrc.question_id AND qrc.c_id = eq.c_id)
ON (eq.question_id = qrc.question_id)
INNER JOIN $categoryTable c
ON (c.id = qrc.category_id AND c.c_id = eq.c_id)
ON (c.iid = qrc.category_id AND c.c_id = eq.c_id)
INNER JOIN $tableQuestion q
ON (q.id = qrc.question_id AND q.c_id = eq.c_id)
ON (q.iid = qrc.question_id)
WHERE
exercice_id = $exerciseId AND
qrc.c_id = $courseId
@ -729,13 +726,13 @@ class TestCategory
// foreach question
$categories = self::getListOfCategoriesIDForTest($exerciseId);
foreach ($categories as $category) {
if (empty($category['id'])) {
if (empty($category['iid'])) {
continue;
}
$nbQuestionInThisCat = self::getNumberOfQuestionsInCategoryForTest(
$exerciseId,
$category['id']
$category['iid']
);
if ($nbQuestionInThisCat > $res_num_max) {
@ -767,7 +764,7 @@ class TestCategory
return '';
}
$exerciseId = $exercise->iId;
$exerciseId = $exercise->iid;
$categoryNameList = self::getListOfCategoriesNameForTest($exerciseId);
$table = new HTML_Table(
@ -798,7 +795,7 @@ class TestCategory
if ($countCategories > 1) {
$tempResult = [];
$labels = [];
$labelsWithId = array_column($categoryNameList, 'title', 'id');
$labelsWithId = array_column($categoryNameList, 'title', 'iid');
asort($labelsWithId);
foreach ($labelsWithId as $category_id => $title) {
if (!isset($category_list[$category_id])) {
@ -922,12 +919,12 @@ class TestCategory
$courseId = (int) $courseId;
$table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY);
$categoryTable = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$exercise->id = (int) $exercise->id;
$exercise->iid = (int) $exercise->iid;
$sql = "SELECT * FROM $table qc
LEFT JOIN $categoryTable c
ON (qc.c_id = c.c_id AND c.id = qc.category_id)
WHERE qc.c_id = $courseId AND exercise_id = {$exercise->id} ";
ON (c.iid = qc.category_id)
WHERE qc.c_id = $courseId AND exercise_id = {$exercise->iid} ";
if (!empty($order)) {
$order = Database::escape_string($order);
@ -1010,8 +1007,8 @@ class TestCategory
if (!empty($this->parent_id)) {
$parent_cat = new TestCategory();
$parent_cat = $parent_cat->getCategory($this->parent_id);
$category_parent_list = [$parent_cat->id => $parent_cat->name];
$script .= '<script>$(function() { $("#parent_id").trigger("addItem",[{"title": "'.$parent_cat->name.'", "value": "'.$parent_cat->id.'"}]); });</script>';
$category_parent_list = [$parent_cat->iid => $parent_cat->name];
$script .= '<script>$(function() { $("#parent_id").trigger("addItem",[{"title": "'.$parent_cat->name.'", "value": "'.$parent_cat->iid.'"}]); });</script>';
}
$form->addElement('html', $script);
@ -1020,7 +1017,7 @@ class TestCategory
// setting the defaults
$defaults = [];
$defaults["category_id"] = $this->id;
$defaults["category_id"] = $this->iid;
$defaults["category_name"] = $this->name;
$defaults["category_description"] = $this->description;
$defaults["parent_id"] = $this->parent_id;
@ -1137,12 +1134,12 @@ class TestCategory
}
$courseId = (int) $courseId;
$tbl_cat = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$sql = "SELECT id FROM $tbl_cat
$sql = "SELECT iid FROM $tbl_cat
WHERE c_id = $courseId AND title = '".Database::escape_string($title)."'";
$res = Database::query($sql);
if (Database::num_rows($res) > 0) {
$data = Database::fetch_array($res);
$out_res = $data['id'];
$out_res = $data['iid'];
}
return $out_res;
@ -1210,11 +1207,11 @@ class TestCategory
return [];
}
$sql = "SELECT c.* FROM $table c
$sql = "SELECT cat.* FROM $table cat
INNER JOIN $itemProperty i
ON c.c_id = i.c_id AND i.ref = c.id
ON cat.c_id = i.c_id AND i.ref = cat.iid
WHERE
c.c_id = $courseId AND
cat.c_id = $courseId AND
i.tool = '".TOOL_TEST_CATEGORY."'
$sessionCondition
ORDER BY title ASC";
@ -1236,7 +1233,7 @@ class TestCategory
$html = '';
foreach ($categories as $category) {
$tmpobj = new TestCategory();
$tmpobj = $tmpobj->getCategory($category['id']);
$tmpobj = $tmpobj->getCategory($category['iid']);
$nb_question = $tmpobj->getCategoryQuestionsNumber();
$rowname = self::protectJSDialogQuote($category['title']);
$nb_question_label = $nb_question == 1 ? $nb_question.' '.get_lang('Question') : $nb_question.' '.get_lang('Questions');
@ -1247,10 +1244,10 @@ class TestCategory
$links = '';
if (!$sessionId) {
$links .= '<a href="'.api_get_self().'?action=editcategory&category_id='.$category['id'].'&'.api_get_cidreq().'">'.
$links .= '<a href="'.api_get_self().'?action=editcategory&category_id='.$category['iid'].'&'.api_get_cidreq().'">'.
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL).'</a>';
$links .= ' <a href="'.api_get_self().'?'.api_get_cidreq().'&action=deletecategory&category_id='.$category['id'].'" ';
$links .= 'onclick="return confirmDelete(\''.self::protectJSDialogQuote(get_lang('DeleteCategoryAreYouSure').'['.$rowname).'] ?\', \'id_cat'.$category['id'].'\');">';
$links .= ' <a href="'.api_get_self().'?'.api_get_cidreq().'&action=deletecategory&category_id='.$category['iid'].'" ';
$links .= 'onclick="return confirmDelete(\''.self::protectJSDialogQuote(get_lang('DeleteCategoryAreYouSure').'['.$rowname).'] ?\', \'id_cat'.$category['iid'].'\');">';
$links .= Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).'</a>';
}

@ -144,8 +144,8 @@ class UniqueAnswerImage extends UniqueAnswer
$defaults = [];
$correct = 0;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
@ -299,7 +299,7 @@ class UniqueAnswerImage extends UniqueAnswer
global $text;
$buttonGroup = [];
if ($objExercise->edit_exercise_in_lp == true ||
(empty($this->exerciseList) && empty($objExercise->id))
(empty($this->exerciseList) && empty($objExercise->iid))
) {
//setting the save button here and not in the question class.php
$buttonGroup[] = $form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers', true);
@ -315,7 +315,7 @@ class UniqueAnswerImage extends UniqueAnswer
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if (1 == $this->isContent) {
@ -336,7 +336,7 @@ class UniqueAnswerImage extends UniqueAnswer
{
$questionWeighting = $nbrGoodAnswers = 0;
$correct = $form->getSubmitValue('correct');
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$numberAnswers = $form->getSubmitValue('nb_answers');
for ($i = 1; $i <= $numberAnswers; $i++) {
@ -348,11 +348,12 @@ class UniqueAnswerImage extends UniqueAnswer
//$listDestination = $form -> getSubmitValue('destination'.$i);
//$destinationStr = $form -> getSubmitValue('destination'.$i);
$try = $scenario['try'.$i];
$lp = $scenario['lp'.$i];
$destination = $scenario['destination'.$i];
$url = trim($scenario['url'.$i]);
if (!empty($scenario)) {
$try = $scenario['try'.$i];
$lp = $scenario['lp'.$i];
$destination = $scenario['destination'.$i];
$url = trim($scenario['url'.$i]);
}
/*
How we are going to parse the destination value

@ -8,7 +8,7 @@ use ChamiloSession as Session;
* Exercise administration
* This script allows to manage (create, modify) an exercise and its questions.
*
* Following scripts are includes for a best code understanding :
* The following scripts are included :
*
* - exercise.class.php : for the creation of an Exercise object
* - question.class.php : for the creation of a Question object
@ -65,6 +65,7 @@ if (!$is_allowedToEdit) {
api_not_allowed(true);
}
// Variables sanitizing
$exerciseId = isset($_GET['exerciseId']) ? (int) $_GET['exerciseId'] : 0;
$newQuestion = isset($_GET['newQuestion']) ? $_GET['newQuestion'] : 0;
@ -116,7 +117,6 @@ $picturePath = $documentPath.'/images';
// audio path
$audioPath = $documentPath.'/audio';
// tables used in the exercise tool
if (!empty($_GET['action']) && $_GET['action'] == 'exportqti2' && !empty($_GET['questionId'])) {
require_once 'export/qti2/qti2_export.php';
$export = export_question_qti($_GET['questionId'], true);
@ -167,7 +167,7 @@ if ($objExercise->sessionId != $sessionId) {
api_not_allowed(true);
}
// doesn't select the exercise ID if we come from the question pool
// Do not select the exercise ID if we come from the question pool
if (!$fromExercise) {
// gets the right exercise ID, and if 0 creates a new exercise
if (!$exerciseId = $objExercise->selectId()) {
@ -225,7 +225,8 @@ if ($cancelQuestion) {
}
}
if (!empty($clone_question) && !empty($objExercise->id)) {
// Cloning/copying a question
if (!empty($clone_question) && !empty($objExercise->iid)) {
$old_question_obj = Question::read($clone_question);
$old_question_obj->question = $old_question_obj->question.' - '.get_lang('Copy');
@ -244,11 +245,11 @@ if (!empty($clone_question) && !empty($objExercise->id)) {
$new_answer_obj->duplicate($new_question_obj);
// Reloading tne $objExercise obj
$objExercise->read($objExercise->id, false);
$objExercise->read($objExercise->iid, false);
Display::addFlash(Display::return_message(get_lang('ItemCopied')));
header('Location: admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id.'&page='.$page);
header('Location: admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid.'&page='.$page);
exit;
}
@ -275,7 +276,7 @@ if (api_is_in_gradebook()) {
$interbreadcrumb[] = ['url' => 'exercise.php?'.api_get_cidreq(), 'name' => get_lang('Exercises')];
if (isset($_GET['newQuestion']) || isset($_GET['editQuestion'])) {
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$objExercise->id.'&'.api_get_cidreq(),
'url' => 'admin.php?exerciseId='.$objExercise->iid.'&'.api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];
} else {
@ -295,7 +296,7 @@ if (!$exerciseId && $nameTools != get_lang('ExerciseManagement')) {
// if the question is duplicated, disable the link of tool name
if ($modifyIn === 'thisExercise') {
if ($buttonBack) {
if (!empty($buttonBack)) {
$modifyIn = 'allExercises';
}
}
@ -332,18 +333,19 @@ if ($inATest) {
echo '<a href="'.api_get_path(WEB_CODE_PATH).'exercise/exercise.php?'.api_get_cidreq().'">'.
Display::return_icon('back.png', get_lang('BackToExercisesList'), '', ICON_SIZE_MEDIUM).'</a>';
}
echo '<a href="'.api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id.'&preview=1">'.
echo '<a href="'.api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid.'&preview=1">'.
Display::return_icon('preview_view.png', get_lang('Preview'), '', ICON_SIZE_MEDIUM).'</a>';
echo Display::url(
Display::return_icon('test_results.png', get_lang('Results'), '', ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id
api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid
);
echo '<a
href="'.api_get_path(WEB_CODE_PATH).'exercise/exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->id.'">'.
href="'.api_get_path(WEB_CODE_PATH).'exercise/exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('settings.png', get_lang('ModifyExercise'), '', ICON_SIZE_MEDIUM).'</a>';
// Get the cumulative max score of all questions to show it in the upper bar to the editor
$maxScoreAllQuestions = 0;
if ($showPagination === false) {
$questionList = $objExercise->selectQuestionList(true, $objExercise->random > 0 ? false : true);
@ -361,6 +363,7 @@ if ($inATest) {
if ($objExercise->added_in_lp()) {
echo Display::return_message(get_lang('AddedToLPCannotBeAccessed'), 'warning');
}
// If the question is used in another test, show a warning to the editor
if ($editQuestion && $objQuestion->existsInAnotherExercise()) {
echo Display::return_message(
Display::returnFontAwesomeIcon('exclamation-triangle"')

@ -6,13 +6,14 @@ use Chamilo\CourseBundle\Entity\CQuizAnswer;
/**
* Class Answer
* Allows to instantiate an object of type Answer
* Allows to instantiate an object of type Answer, as a *list* of answers for one question
* 5 arrays are created to receive the attributes of each answer belonging to a specified question.
*
* @author Olivier Brouckaert
*/
class Answer
{
/* The question of which we want the possible answers */
public $questionId;
// these are arrays
@ -124,9 +125,7 @@ class Answer
$questionId = $this->questionId;
$sql = "SELECT * FROM $table
WHERE
c_id = {$this->course_id} AND
question_id ='".$questionId."'
WHERE question_id = $questionId
ORDER BY position";
$result = Database::query($sql);
@ -134,7 +133,8 @@ class Answer
// while a record is found
while ($object = Database::fetch_object($result)) {
$this->id[$i] = $object->id;
$this->id[$i] = $object->iid;
$this->iid[$i] = $object->iid;
$this->answer[$i] = $object->answer;
$this->correct[$i] = $object->correct;
$this->comment[$i] = $object->comment;
@ -144,7 +144,6 @@ class Answer
$this->hotspot_type[$i] = $object->hotspot_type;
$this->destination[$i] = $object->destination;
$this->autoId[$i] = $object->id_auto;
$this->iid[$i] = $object->iid;
$i++;
}
$this->nbrAnswers = $i - 1;
@ -161,8 +160,7 @@ class Answer
$questionId = $this->questionId;
$sql = "SELECT * FROM $table
WHERE c_id = {$this->course_id}
AND question_id = $questionId
WHERE question_id = $questionId
ORDER BY position";
$result = Database::query($sql);
@ -209,16 +207,14 @@ class Answer
$table = Database::get_course_table(TABLE_QUIZ_ANSWER);
$questionId = $this->questionId;
$sql = "SELECT id FROM
$table
WHERE c_id = {$this->course_id} AND question_id ='".$questionId."'";
$sql = "SELECT iid FROM $table WHERE question_id = $questionId";
$result = Database::query($sql);
$id = [];
// while a record is found
if (Database::num_rows($result) > 0) {
while ($object = Database::fetch_array($result)) {
$id[] = $object['id'];
$id[] = $object['iid'];
}
}
@ -247,11 +243,11 @@ class Answer
}
$TBL_ANSWER = Database::get_course_table(TABLE_QUIZ_ANSWER);
$TBL_QUIZ = Database::get_course_table(TABLE_QUIZ_QUESTION);
$TBL_QUESTION = Database::get_course_table(TABLE_QUIZ_QUESTION);
$questionId = (int) $this->questionId;
$sql = "SELECT type FROM $TBL_QUIZ
WHERE c_id = {$this->course_id} AND id = $questionId";
$sql = "SELECT type FROM $TBL_QUESTION
WHERE iid = $questionId";
$result_question = Database::query($sql);
$questionType = Database::fetch_array($result_question);
@ -275,7 +271,6 @@ class Answer
iid
FROM $TBL_ANSWER
WHERE
c_id = {$this->course_id} AND
question_id='".$questionId."'
ORDER BY $field $order";
$result = Database::query($sql);
@ -324,13 +319,23 @@ class Answer
*
* @author Juan Carlos Ra<EFBFBD>a
*
* @return int - answer num
* @return int Answer num
*/
public function selectAutoId($id)
{
return isset($this->autoId[$id]) ? $this->autoId[$id] : 0;
}
/**
* Returns the unique ID (iid field).
*
* @return int Answer ID
*/
public function selectId($id)
{
return isset($this->iid[$id]) ? $this->iid[$id] : 0;
}
/**
* returns the number of answers in this question.
*
@ -394,7 +399,7 @@ class Answer
{
$table = Database::get_course_table(TABLE_QUIZ_ANSWER);
$auto_id = (int) $auto_id;
$sql = "SELECT id, answer, id_auto FROM $table
$sql = "SELECT iid, answer, id_auto FROM $table
WHERE c_id = {$this->course_id} AND id_auto='$auto_id'";
$rs = Database::query($sql);
@ -405,6 +410,31 @@ class Answer
return false;
}
/**
* return array answer by iid. Else return a bool.
*
* @param int $iid
*
* @return array
*/
public function selectAnswerById($id)
{
if (empty($id)) {
return false;
}
$table = Database::get_course_table(TABLE_QUIZ_ANSWER);
$id = (int) $id;
$sql = "SELECT iid, answer, id_auto FROM $table
WHERE iid = $id";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
return Database::fetch_array($rs, 'ASSOC');
}
return false;
}
/**
* returns the answer title from an answer's position.
*
@ -457,7 +487,7 @@ class Answer
}
$list[] = [
'id' => $i,
'iid' => $i,
'answer' => $this->answer[$i],
'comment' => $this->comment[$i],
'grade' => $this->weighting[$i],
@ -502,7 +532,7 @@ class Answer
{
$table = Database::get_course_table(TABLE_QUIZ_QUESTION);
$sql = "SELECT type FROM $table
WHERE c_id = {$this->course_id} AND id = '".$this->questionId."'";
WHERE iid = {$this->questionId}";
$res = Database::query($sql);
if (Database::num_rows($res) <= 0) {
return null;
@ -728,7 +758,7 @@ class Answer
$em->persist($quizAnswer);
$em->flush();
$iid = $quizAnswer->getIid();
$iid = $quizAnswer->getId();
if ($iid) {
$quizAnswer
@ -736,7 +766,6 @@ class Answer
->setIdAuto($iid);
$questionType = $this->getQuestionType();
if (in_array(
$questionType,
[MATCHING, MATCHING_DRAGGABLE]
@ -748,6 +777,8 @@ class Answer
// Continue to avoid matching question bug if $correctAnswerId returns false
// See : https://support.chamilo.org/issues/8334
if ($questionType == MATCHING && !$correctAnswerId) {
$em->merge($quizAnswer);
$em->flush();
continue;
}
$correctAnswerAutoId = $answer->selectAutoId($correct);
@ -821,7 +852,7 @@ class Answer
$sql = "DELETE FROM $answerTable
WHERE
c_id = {$this->course_id} AND
question_id = '".$questionId."' AND
question_id = {$questionId} AND
position ='$position'";
Database::query($sql);
$i++;
@ -852,7 +883,7 @@ class Answer
*/
public function duplicate($newQuestion, $course_info = null)
{
$newQuestionId = $newQuestion->id;
$newQuestionId = $newQuestion->iid;
if (empty($course_info)) {
$course_info = $this->course;
@ -872,7 +903,7 @@ class Answer
if (!empty($origin_options)) {
foreach ($origin_options as $item) {
$new_option_list[] = $item['id'];
$new_option_list[] = $item['iid'];
}
}
@ -883,7 +914,7 @@ class Answer
$i = 0;
if (!empty($destination_options)) {
foreach ($destination_options as $item) {
$fixed_list[$new_option_list[$i]] = $item['id'];
$fixed_list[$new_option_list[$i]] = $item['iid'];
$i++;
}
}
@ -903,7 +934,7 @@ class Answer
$temp = [];
for ($i = 1; $i <= $this->nbrAnswers; $i++) {
$answer = [
'id' => $this->id[$i],
'iid' => $this->iid[$i],
'answer' => $this->answer[$i],
'correct' => $this->correct[$i],
'comment' => $this->comment[$i],
@ -915,7 +946,7 @@ class Answer
'destination' => $this->destination[$i],
];
$temp[$answer['position']] = $answer;
$allAnswers[$this->id[$i]] = $this->answer[$i];
$allAnswers[$this->iid[$i]] = $this->answer[$i];
}
foreach ($temp as $answer) {
@ -950,7 +981,7 @@ class Answer
$em->persist($quizAnswer);
$em->flush();
$answerId = $quizAnswer->getIid();
$answerId = $quizAnswer->getId();
if ($answerId) {
$quizAnswer
@ -1002,7 +1033,7 @@ class Answer
$em->persist($quizAnswer);
$em->flush();
$answerId = $quizAnswer->getIid();
$answerId = $quizAnswer->getId();
$quizAnswer
->setId($answerId)
->setIdAuto($answerId);
@ -1012,7 +1043,7 @@ class Answer
$correctAnswers[$answerId] = $correct;
$onlyAnswers[$answerId] = $this->answer[$i];
$allAnswers[$this->id[$i]] = $this->answer[$i];
$allAnswers[$this->iid[$i]] = $this->answer[$i];
}
}
@ -1029,7 +1060,7 @@ class Answer
$tableAnswer,
$params,
[
'id = ? AND c_id = ? AND question_id = ? ' => [
'iid = ? AND c_id = ? AND question_id = ? ' => [
$answer_id,
$courseId,
$newQuestionId,

@ -32,8 +32,8 @@ class CalculatedAnswer extends Question
{
$defaults = [];
$defaults['answer'] = get_lang('DefaultTextInBlanks');
if (!empty($this->id)) {
$objAnswer = new Answer($this->id);
if (!empty($this->iid)) {
$objAnswer = new Answer($this->iid);
$preArray = explode('@@', $objAnswer->selectAnswer(1));
$defaults['formula'] = array_pop($preArray);
$defaults['answer'] = array_shift($preArray);
@ -170,7 +170,7 @@ class CalculatedAnswer extends Question
// setting the save button here and not in the question class.php
$form->addButtonSave($text, 'submitQuestion');
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -191,7 +191,7 @@ class CalculatedAnswer extends Question
[
'c_id = ? AND question_id = ?' => [
$this->course['real_id'],
$this->id,
$this->iid,
],
]
);
@ -233,7 +233,7 @@ class CalculatedAnswer extends Question
$auxAnswer .= " [".$result."]@@".$formula;
}
$this->save($exercise);
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$objAnswer->createAnswer($auxAnswer, 1, '', $this->weighting, '');
$objAnswer->position = [];
$objAnswer->save();
@ -275,7 +275,7 @@ class CalculatedAnswer extends Question
[
'where' => [
'question_id = ? AND c_id = ?' => [
$this->id,
$this->iid,
$this->course['real_id'],
],
],

@ -34,12 +34,12 @@ $interbreadcrumb[] = [
'name' => get_lang('Exercises'),
];
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$exercise->iId.'&'.api_get_cidreq(),
'url' => 'admin.php?exerciseId='.$exercise->iid.'&'.api_get_cidreq(),
'name' => $exercise->selectTitle(true),
];
$interbreadcrumb[] = [
'url' => 'exercise_report.php?'.api_get_cidreq().'&exerciseId='.$exercise->iId,
'url' => 'exercise_report.php?'.api_get_cidreq().'&exerciseId='.$exercise->iid,
'name' => get_lang('StudentScore'),
];

File diff suppressed because it is too large Load Diff

@ -181,10 +181,10 @@ if ($is_allowedToEdit) {
$quantity_results_deleted = 0;
foreach ($exerciseList as $exeItem) {
// delete result for test, if not in a gradebook
$exercise_action_locked = api_resource_is_locked_by_gradebook($exeItem['id'], LINK_EXERCISE);
$exercise_action_locked = api_resource_is_locked_by_gradebook($exeItem['iid'], LINK_EXERCISE);
if ($exercise_action_locked == false) {
$objExerciseTmp = new Exercise();
if ($objExerciseTmp->read($exeItem['id'])) {
if ($objExerciseTmp->read($exeItem['iid'])) {
$quantity_results_deleted += $objExerciseTmp->cleanResults(true);
}
}
@ -301,7 +301,7 @@ if (!empty($action) && $is_allowedToEdit) {
api_item_property_update(
$courseInfo,
TOOL_QUIZ,
$objExerciseTmp->id,
$objExerciseTmp->iid,
'visible',
$userId
);
@ -327,7 +327,7 @@ if (!empty($action) && $is_allowedToEdit) {
api_item_property_update(
$courseInfo,
TOOL_QUIZ,
$objExerciseTmp->id,
$objExerciseTmp->iid,
'visible',
$userId
);
@ -403,7 +403,7 @@ if ($is_allowedToEdit) {
api_item_property_update(
$courseInfo,
TOOL_QUIZ,
$objExerciseTmp->id,
$objExerciseTmp->iid,
'visible',
$userId
);
@ -429,7 +429,7 @@ if ($is_allowedToEdit) {
api_item_property_update(
$courseInfo,
TOOL_QUIZ,
$objExerciseTmp->id,
$objExerciseTmp->iid,
'invisible',
$userId
);
@ -580,14 +580,14 @@ if ($is_allowedToEdit) {
}
$newVisibilityStatus = '1'; //"visible"
$query = "SELECT id FROM $TBL_DOCUMENT
$query = "SELECT iid FROM $TBL_DOCUMENT
WHERE c_id = $courseId AND path='".Database::escape_string($file)."'";
$res = Database::query($query);
$row = Database :: fetch_array($res, 'ASSOC');
api_item_property_update(
$courseInfo,
TOOL_DOCUMENT,
$row['id'],
$row['iid'],
'visible',
$userId
);
@ -601,14 +601,14 @@ if ($is_allowedToEdit) {
break;
}
$newVisibilityStatus = '0'; //"invisible"
$query = "SELECT id FROM $TBL_DOCUMENT
$query = "SELECT iid FROM $TBL_DOCUMENT
WHERE c_id = $courseId AND path='".Database::escape_string($file)."'";
$res = Database::query($query);
$row = Database :: fetch_array($res, 'ASSOC');
api_item_property_update(
$courseInfo,
TOOL_DOCUMENT,
$row['id'],
$row['iid'],
'invisible',
$userId
);
@ -771,7 +771,7 @@ if (api_get_configuration_value('allow_exercise_categories') === false) {
$manager = new ExerciseCategoryManager();
$category = $manager->get($categoryId);
echo Display::page_subheader($category['name']);
echo Exercise::exerciseGrid($category['id'], $keyword);
echo Exercise::exerciseGrid($category['iid'], $keyword);
}
}

@ -160,7 +160,7 @@ if ($form->validate()) {
Display::return_message(get_lang('ExerciseAdded'), 'success')
);
}
$exercise_id = $objExercise->id;
$exercise_id = $objExercise->iid;
Session::erase('objExercise');
header('Location:admin.php?exerciseId='.$exercise_id.'&'.api_get_cidreq());
exit;
@ -177,15 +177,15 @@ if ($form->validate()) {
'name' => get_lang('Exercises'),
];
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$objExercise->id.'&'.api_get_cidreq(),
'url' => 'admin.php?exerciseId='.$objExercise->iid.'&'.api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];
Display::display_header($nameTools, get_lang('Exercise'));
echo '<div class="actions">';
if ($objExercise->id != 0) {
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id.'">'.
if ($objExercise->iid != 0) {
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('back.png', get_lang('GoBackToQuestionList'), '', ICON_SIZE_MEDIUM).'</a>';
} else {
if (!empty($_GET['lp_id']) || !empty($_POST['lp_id'])) {

@ -91,28 +91,28 @@ foreach ($students as $studentInfo) {
if (!($categoryInfo instanceof TestCategory)) {
continue;
}
if (isset($stats['category_list'][$categoryInfo->id])) {
$categoryItem = $stats['category_list'][$categoryInfo->id];
if (!isset($categoryData[$categoryInfo->id])) {
$categoryData[$categoryInfo->id]['passed'] = 0;
$categoryData[$categoryInfo->id]['wrong'] = 0;
$categoryData[$categoryInfo->id]['no_answer'] = 0;
$categoryData[$categoryInfo->id]['score'] = 0;
if (isset($stats['category_list'][$categoryInfo->iid])) {
$categoryItem = $stats['category_list'][$categoryInfo->iid];
if (!isset($categoryData[$categoryInfo->iid])) {
$categoryData[$categoryInfo->iid]['passed'] = 0;
$categoryData[$categoryInfo->iid]['wrong'] = 0;
$categoryData[$categoryInfo->iid]['no_answer'] = 0;
$categoryData[$categoryInfo->iid]['score'] = 0;
}
$categoryData[$categoryInfo->id]['passed'] += $categoryItem['passed'];
$categoryData[$categoryInfo->id]['wrong'] += $categoryItem['wrong'];
$categoryData[$categoryInfo->id]['no_answer'] += $categoryItem['no_answer'];
$categoryData[$categoryInfo->id]['score'] += $categoryItem['score'];
$categoryData[$categoryInfo->iid]['passed'] += $categoryItem['passed'];
$categoryData[$categoryInfo->iid]['wrong'] += $categoryItem['wrong'];
$categoryData[$categoryInfo->iid]['no_answer'] += $categoryItem['no_answer'];
$categoryData[$categoryInfo->iid]['score'] += $categoryItem['score'];
}
}
$userExerciseData[$exerciseId] = $stats['total_score'];
}
foreach ($categories as $categoryInfo) {
if (isset($categoryData[$categoryInfo->id])) {
$data[] = $categoryData[$categoryInfo->id]['passed'];
$data[] = $categoryData[$categoryInfo->id]['wrong'];
$data[] = $categoryData[$categoryInfo->id]['no_answer'];
$data[] = $categoryData[$categoryInfo->id]['score'];
if (isset($categoryData[$categoryInfo->iid])) {
$data[] = $categoryData[$categoryInfo->iid]['passed'];
$data[] = $categoryData[$categoryInfo->iid]['wrong'];
$data[] = $categoryData[$categoryInfo->iid]['no_answer'];
$data[] = $categoryData[$categoryInfo->iid]['score'];
} else {
$data[] = null;
$data[] = null;

@ -69,7 +69,7 @@ $sql = "SELECT *, quiz_question.question, firstname, lastname
FROM $TBL_TRACK_ATTEMPT_RECORDING t, $TBL_USER,
$TBL_EXERCISES_QUESTION quiz_question
WHERE
quiz_question.id = question_id AND
quiz_question.iid = question_id AND
user_id = author AND
exe_id = '".(int) $_GET['exe_id']."'
ORDER BY position";

@ -37,7 +37,7 @@ if (empty($objExercise) || empty($questionCategoryId) || empty($exeId) || empty(
api_not_allowed(true);
}
$categoryId = (int) $categoryObj->id;
$categoryId = (int) $categoryObj->iid;
$params = "exe_id=$exeId&exerciseId=$exerciseId&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id&learnpath_item_view_id=$learnpath_item_view_id&".api_get_cidreq();
$url = api_get_path(WEB_CODE_PATH).'exercise/exercise_submit.php?'.$params;
$validateUrl = api_get_path(WEB_CODE_PATH).'exercise/exercise_question_reminder.php?'.
@ -45,7 +45,7 @@ $validateUrl = api_get_path(WEB_CODE_PATH).'exercise/exercise_question_reminder.
$time_control = false;
$clock_expired_time = ExerciseLib::get_session_time_control_key(
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id
);
@ -104,9 +104,9 @@ if (!$hideHeaderAndFooter) {
// I'm in a preview mode as course admin. Display the action menu.
if (!$hideHeaderAndFooter && api_is_course_admin()) {
echo '<div class="actions">';
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iId.'">'.
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('back.png', get_lang('GoBackToQuestionList'), [], 32).'</a>';
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iId.'">'.
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('edit.png', get_lang('ModifyExercise'), [], 32).'</a>';
echo '</div>';
}

@ -38,7 +38,7 @@ if (!$objExercise) {
$time_control = false;
$clock_expired_time = ExerciseLib::get_session_time_control_key(
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id
);
@ -90,9 +90,9 @@ if (!$hideHeaderAndFooter) {
// I'm in a preview mode as course admin. Display the action menu.
if (!$hideHeaderAndFooter && api_is_course_admin()) {
echo '<div class="actions">';
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id.'">'.
echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('back.png', get_lang('GoBackToQuestionList'), [], 32).'</a>';
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->id.'">'.
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('edit.png', get_lang('ModifyExercise'), [], 32).'</a>';
echo '</div>';
}
@ -108,7 +108,7 @@ if (api_get_configuration_value('block_category_questions') &&
EX_Q_SELECTION_CATEGORIES_ORDERED_QUESTIONS_RANDOM == $selectionType
) {
$extraFieldValue = new ExtraFieldValue('exercise');
$extraFieldData = $extraFieldValue->get_values_by_handler_and_field_variable($objExercise->iId, 'block_category');
$extraFieldData = $extraFieldValue->get_values_by_handler_and_field_variable($objExercise->iid, 'block_category');
if ($extraFieldData && isset($extraFieldData['value']) && 1 === (int) $extraFieldData['value']) {
// get last category question list
$categoryList = Session::read('categoryList');

@ -354,7 +354,7 @@ if (isset($_REQUEST['comments']) &&
$attemptCount = Event::getAttemptPosition(
$track_exercise_info['exe_id'],
$student_id,
$objExerciseTmp->id,
$objExerciseTmp->iid,
$lp_id,
$lpItemId,
$lp_item_view_id
@ -408,7 +408,7 @@ if (isset($_REQUEST['comments']) &&
$sql = "UPDATE $TBL_LP_ITEM_VIEW
SET score = '".(float) $tot."'
$statusCondition
WHERE c_id = $course_id AND id = $lp_item_view_id";
WHERE iid = $lp_item_view_id";
Database::query($sql);
header('Location: '.api_get_path(WEB_CODE_PATH).'exercise/exercise_show.php?id='.$id.'&student='.$student_id.'&'.api_get_cidreq());

@ -92,15 +92,15 @@ class ExerciseResult
te.status as exstatus
FROM $TBL_EXERCISES AS ce
INNER JOIN $TBL_TRACK_EXERCISES AS te
ON (te.exe_exo_id = ce.id)
ON (te.exe_exo_id = ce.iid)
INNER JOIN $TBL_USER AS user
ON (user.user_id = exe_user_id)
LEFT JOIN $TBL_TABLE_LP_MAIN AS tlm
ON (tlm.id = te.orig_lp_id AND tlm.c_id = ce.c_id)
WHERE
ce.c_id = $course_id AND
te.c_id = ce.c_id $user_id_and $session_id_and AND
ce.active <>-1";
te.c_id = ce.c_id $user_id_and $session_id_and AND
ce.active <> -1";
} else {
$user_id_and = ' AND te.exe_user_id = '.api_get_user_id().' ';
$orderBy = 'lastname';
@ -129,7 +129,7 @@ class ExerciseResult
te.status as exstatus
FROM $TBL_EXERCISES AS ce
INNER JOIN $TBL_TRACK_EXERCISES AS te
ON (te.exe_exo_id = ce.id)
ON (te.exe_exo_id = ce.iid)
INNER JOIN $TBL_USER AS user
ON (user.user_id = exe_user_id)
LEFT JOIN $TBL_TABLE_LP_MAIN AS tlm

@ -101,11 +101,11 @@ if (api_is_course_admin() && !in_array($origin, ['learnpath', 'embeddable'])) {
[
Display::url(
Display::return_icon('back.png', get_lang('GoBackToQuestionList'), [], 32),
'admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id
'admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid
)
.Display::url(
Display::return_icon('settings.png', get_lang('ModifyExercise'), [], 32),
'exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->id
'exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iid
),
]
);
@ -119,7 +119,7 @@ $exerciseId = isset($exercise_stat_info['exe_exo_id']) ? $exercise_stat_info['ex
$logInfo = [
'tool' => TOOL_QUIZ,
'tool_id' => $objExercise->iId,
'tool_id' => $objExercise->iid,
'action' => $learnpath_id,
'action_details' => $learnpath_id,
];
@ -148,7 +148,7 @@ if ($origin !== 'embeddable') {
get_lang('AnotherAttempt'),
api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&'.http_build_query(
[
'exerciseId' => $objExercise->id,
'exerciseId' => $objExercise->iid,
'learnpath_id' => $learnpath_id,
'learnpath_item_id' => $learnpath_item_id,
'learnpath_item_view_id' => $learnpath_item_view_id,
@ -162,7 +162,7 @@ if ($origin !== 'embeddable') {
// We check if the user attempts before sending to the exercise_result.php
$attempt_count = Event::get_attempt_count(
$currentUserId,
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id,
$learnpath_item_view_id
@ -300,7 +300,7 @@ if (null != $remedialMessage) {
}
// Unset session for clock time
ExerciseLib::exercise_time_control_delete(
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id
);

@ -32,7 +32,7 @@ if (empty($track_exercise_info)) {
api_not_allowed($printHeaders);
}
$exercise_id = $track_exercise_info['id'];
$exercise_id = $track_exercise_info['iid'];
$student_id = $track_exercise_info['exe_user_id'];
$learnpath_id = $track_exercise_info['orig_lp_id'];
$learnpath_item_id = $track_exercise_info['orig_lp_item_id'];
@ -271,7 +271,7 @@ if (!empty($track_exercise_info)) {
case RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT_NO_FEEDBACK:
$attempts = Event::getExerciseResultsByUser(
$currentUserId,
$objExercise->id,
$objExercise->iid,
api_get_course_int_id(),
api_get_session_id(),
$track_exercise_info['orig_lp_id'],
@ -330,7 +330,7 @@ if ($show_results || $show_only_total_score || $showTotalScoreAndUserChoicesInLa
$i = $totalScore = $totalWeighting = 0;
$arrques = [];
$arrans = [];
$user_restriction = $is_allowedToEdit ? '' : " AND user_id= $student_id ";
$user_restriction = $is_allowedToEdit ? '' : " AND user_id = $student_id ";
$sql = "SELECT attempts.question_id, answer
FROM $TBL_TRACK_ATTEMPT as attempts
INNER JOIN $TBL_TRACK_EXERCISES AS stats_exercises
@ -342,7 +342,7 @@ $sql = "SELECT attempts.question_id, answer
quizz_rel_questions.c_id=".api_get_course_int_id()."
INNER JOIN $TBL_QUESTIONS AS questions
ON
questions.id = quizz_rel_questions.question_id AND
questions.iid = quizz_rel_questions.question_id AND
questions.c_id = ".api_get_course_int_id()."
WHERE
attempts.exe_id = $id $user_restriction
@ -511,7 +511,7 @@ foreach ($questionList as $questionId) {
$(function() {
new HotspotQuestion({
questionId: $questionId,
exerciseId: {$objExercise->id},
exerciseId: {$objExercise->iid},
exeId: $id,
selector: '#hotspot-solution-$questionId-$id',
for: 'solution',

@ -152,7 +152,7 @@ if (api_is_allowed_to_edit(null, true) &&
// 1. Loading the $objExercise variable
/** @var \Exercise $exerciseInSession */
$exerciseInSession = Session::read('objExercise');
if (empty($exerciseInSession) || (!empty($exerciseInSession) && $exerciseInSession->id != $_GET['exerciseId'])) {
if (empty($exerciseInSession) || (!empty($exerciseInSession) && $exerciseInSession->iid != $_GET['exerciseId'])) {
// Construction of Exercise
$objExercise = new Exercise($courseId);
Session::write('firstTime', true);
@ -193,7 +193,7 @@ if (!is_object($objExercise)) {
if ('true' === api_get_plugin_setting('positioning', 'tool_enable')) {
$plugin = Positioning::create();
if ($plugin->blockFinalExercise(api_get_user_id(), $objExercise->iId, api_get_course_int_id(), $sessionId)) {
if ($plugin->blockFinalExercise(api_get_user_id(), $objExercise->iid, api_get_course_int_id(), $sessionId)) {
api_not_allowed(true);
}
}
@ -225,7 +225,7 @@ if (0 != $objExercise->expired_time) {
// Generating the time control key for the user
$current_expired_time_key = ExerciseLib::get_time_control_key(
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id
);
@ -438,17 +438,6 @@ if (empty($exercise_stat_info)) {
if (!empty($resolvedQuestions) &&
!empty($exercise_stat_info['data_tracking'])
) {
/*$last = current(end($resolvedQuestions));
$attemptQuestionList = explode(',', $exercise_stat_info['data_tracking']);
$count = 1;
foreach ($attemptQuestionList as $question) {
if ($last['question_id'] == $question) {
break;
}
$count++;
}
$current_question = $count;
*/
// Get current question based in data_tracking question list, instead of track_e_attempt order BT#17789.
$resolvedQuestionsQuestionIds = array_keys($resolvedQuestions);
$count = 0;
@ -474,7 +463,7 @@ $selectionType = $objExercise->getQuestionSelectionType();
$allowBlockCategory = false;
if (api_get_configuration_value('block_category_questions')) {
$extraFieldValue = new ExtraFieldValue('exercise');
$extraFieldData = $extraFieldValue->get_values_by_handler_and_field_variable($objExercise->iId, 'block_category');
$extraFieldData = $extraFieldValue->get_values_by_handler_and_field_variable($objExercise->iid, 'block_category');
if ($extraFieldData && isset($extraFieldData['value']) && 1 === (int) $extraFieldData['value']) {
$allowBlockCategory = true;
}
@ -1039,7 +1028,7 @@ $show_quiz_edition = $objExercise->added_in_lp();
if (api_is_course_admin() && !in_array($origin, ['learnpath', 'embeddable'])) {
echo '<div class="actions">';
if ($show_quiz_edition == false) {
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->id.'">'.
echo '<a href="exercise_admin.php?'.api_get_cidreq().'&modifyExercise=yes&exerciseId='.$objExercise->iid.'">'.
Display::return_icon('settings.png', get_lang('ModifyExercise'), '', ICON_SIZE_MEDIUM).'</a>';
} else {
echo '<a href="#">'.

@ -20,7 +20,7 @@ class Aiken2Question extends Question
{
switch ($this->type) {
case MCUA:
$answer = new AikenAnswerMultipleChoice($this->id);
$answer = new AikenAnswerMultipleChoice($this->iid);
return $answer;
default:

@ -250,7 +250,7 @@ function aiken_import_exercise($file)
if ($answerId) {
$params = [
'id_auto' => $answerId,
'id' => $answerId,
'iid' => $answerId,
];
Database::update($tableAnswer, $params, ['iid = ?' => [$answerId]]);
}

@ -40,32 +40,32 @@ class Ims2Question extends Question
{
switch ($this->type) {
case MCUA:
$answer = new ImsAnswerMultipleChoice($this->id);
$answer = new ImsAnswerMultipleChoice($this->iid);
return $answer;
case MCMA:
$answer = new ImsAnswerMultipleChoice($this->id);
$answer = new ImsAnswerMultipleChoice($this->iid);
return $answer;
case TF:
$answer = new ImsAnswerMultipleChoice($this->id);
$answer = new ImsAnswerMultipleChoice($this->iid);
return $answer;
case FIB:
$answer = new ImsAnswerFillInBlanks($this->id);
$answer = new ImsAnswerFillInBlanks($this->iid);
return $answer;
case MATCHING:
case MATCHING_DRAGGABLE:
$answer = new ImsAnswerMatching($this->id);
$answer = new ImsAnswerMatching($this->iid);
return $answer;
case FREE_ANSWER:
$answer = new ImsAnswerFree($this->id);
$answer = new ImsAnswerFree($this->iid);
return $answer;
case HOT_SPOT:
$answer = new ImsAnswerHotspot($this->id);
$answer = new ImsAnswerHotspot($this->iid);
return $answer;
default:
@ -110,10 +110,10 @@ class ImsAnswerMultipleChoice extends Answer implements ImsAnswerInterface
$out .= ' <prompt><![CDATA['.formatExerciseQtiText($questionDesc).']]></prompt>'."\n";
if (is_array($this->answerList)) {
foreach ($this->answerList as $current_answer) {
$out .= '<simpleChoice identifier="answer_'.$current_answer['id'].'" fixed="false">
$out .= '<simpleChoice identifier="answer_'.$current_answer['iid'].'" fixed="false">
<![CDATA['.formatExerciseQtiText($current_answer['answer']).']]>';
if (isset($current_answer['comment']) && $current_answer['comment'] != '') {
$out .= '<feedbackInline identifier="answer_'.$current_answer['id'].'">
$out .= '<feedbackInline identifier="answer_'.$current_answer['iid'].'">
<![CDATA['.formatExerciseQtiText($current_answer['comment']).']]>
</feedbackInline>';
}
@ -145,7 +145,7 @@ class ImsAnswerMultipleChoice extends Answer implements ImsAnswerInterface
$out .= ' <correctResponse>'."\n";
foreach ($this->answerList as $current_answer) {
if ($current_answer['correct']) {
$out .= ' <value>answer_'.$current_answer['id'].'</value>'."\n";
$out .= ' <value>answer_'.$current_answer['iid'].'</value>'."\n";
}
}
$out .= ' </correctResponse>'."\n";
@ -156,7 +156,7 @@ class ImsAnswerMultipleChoice extends Answer implements ImsAnswerInterface
$out .= ' <mapping>'."\n";
foreach ($this->answerList as $current_answer) {
if (isset($current_answer['grade'])) {
$out .= ' <mapEntry mapKey="answer_'.$current_answer['id'].'" mappedValue="'.$current_answer['grade'].'" />'."\n";
$out .= ' <mapEntry mapKey="answer_'.$current_answer['iid'].'" mappedValue="'.$current_answer['grade'].'" />'."\n";
}
}
$out .= ' </mapping>'."\n";
@ -194,7 +194,7 @@ class ImsAnswerFillInBlanks extends Answer implements ImsAnswerInterface
$text = isset($this->answerText) ? $this->answerText : '';
if (is_array($this->answerList)) {
foreach ($this->answerList as $key => $answer) {
$key = $answer['id'];
$key = $answer['iid'];
$answer = $answer['answer'];
$len = api_strlen($answer);
$text = str_replace('['.$answer.']', '<textEntryInteraction responseIdentifier="fill_'.$key.'" expectedLength="'.api_strlen($answer).'"/>', $text);
@ -211,7 +211,7 @@ class ImsAnswerFillInBlanks extends Answer implements ImsAnswerInterface
$out = '';
if (is_array($this->answerList)) {
foreach ($this->answerList as $answer) {
$answerKey = $answer['id'];
$answerKey = $answer['iid'];
$answer = $answer['answer'];
$out .= ' <responseDeclaration identifier="fill_'.$answerKey.'" cardinality="single" baseType="identifier">'."\n";
$out .= ' <correctResponse>'."\n";
@ -364,7 +364,7 @@ class ImsAnswerHotspot extends Answer implements ImsAnswerInterface
$text .= ' <object type="'.$mimetype.'" width="250" height="230" data="'.$questionMedia.'">-</object>'."\n";
if (is_array($this->answerList)) {
foreach ($this->answerList as $key => $answer) {
$key = $answer['id'];
$key = $answer['iid'];
$answerTxt = $answer['answer'];
$len = api_strlen($answerTxt);
//coords are transformed according to QTIv2 rules here: http://www.imsproject.org/question/qtiv2p1pd/imsqti_infov2p1pd.html#element10663
@ -408,7 +408,7 @@ class ImsAnswerHotspot extends Answer implements ImsAnswerInterface
if (is_array($this->answerList)) {
$out .= ' <correctResponse>'."\n";
foreach ($this->answerList as $answerKey => $answer) {
$answerKey = $answer['id'];
$answerKey = $answer['iid'];
$answer = $answer['answer'];
$out .= '<value><![CDATA['.formatExerciseQtiText($answerKey).']]></value>';
}

@ -41,7 +41,7 @@ class ImsAssessmentItem
{
$this->question = $question;
$this->answer = $this->question->setAnswer();
$this->questionIdent = 'QST_'.$question->id;
$this->questionIdent = 'QST_'.$question->iid;
}
/**
@ -463,7 +463,7 @@ function export_question_qti($questionId, $standalone = true)
return '';
}
$question->id = $qst->id;
$question->iid = $qst->iid;
$question->type = $qst->type;
$question->question = $qst->question;
$question->description = $qst->description;

@ -26,7 +26,7 @@ class ScormAssessmentItem
{
$this->question = $question;
$this->question->setAnswer();
$this->questionIdent = 'QST_'.$question->id;
$this->questionIdent = 'QST_'.$question->iid;
}
/**

@ -100,11 +100,11 @@ class ScormExercise
*/
public function end_body()
{
$button = '<input
id="chamilo_scorm_submit"
class="btn btn-primary"
type="button"
name="chamilo_scorm_submit"
$button = '<input
id="chamilo_scorm_submit"
class="btn btn-primary"
type="button"
name="chamilo_scorm_submit"
value="OK" />';
return '</table><br />'.$button.'</form></body>';
@ -158,7 +158,7 @@ class ScormExercise
$em = Database::getManager();
// Export cquiz data
/** @var CQuiz $exercise */
$exercise = $em->find('ChamiloCourseBundle:CQuiz', $this->exercise->iId);
$exercise = $em->find('ChamiloCourseBundle:CQuiz', $this->exercise->iid);
$exercise->setDescription('');
$exercise->setTextWhenFinished('');

@ -45,7 +45,7 @@ class ScormQuestion extends Question
if (!$question) {
return '';
}
$this->id = $question->id;
$this->iid = $question->iid;
$this->js_id = $jsId;
$this->type = $question->type;
$this->question = $question->question;
@ -65,47 +65,47 @@ class ScormQuestion extends Question
{
switch ($this->type) {
case MCUA:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer = new ScormAnswerMultipleChoice($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case MCMA:
case GLOBAL_MULTIPLE_ANSWER:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer = new ScormAnswerMultipleChoice($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case TF:
$this->answer = new ScormAnswerTrueFalse($this->id);
$this->answer = new ScormAnswerTrueFalse($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case FIB:
$this->answer = new ScormAnswerFillInBlanks($this->id);
$this->answer = new ScormAnswerFillInBlanks($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case MATCHING:
case MATCHING_DRAGGABLE:
case DRAGGABLE:
$this->answer = new ScormAnswerMatching($this->id);
$this->answer = new ScormAnswerMatching($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case ORAL_EXPRESSION:
case FREE_ANSWER:
$this->answer = new ScormAnswerFree($this->id);
$this->answer = new ScormAnswerFree($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer = new ScormAnswerHotspot($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case MULTIPLE_ANSWER_COMBINATION:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer = new ScormAnswerMultipleChoice($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT_ORDER:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer = new ScormAnswerHotspot($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT_DELINEATION:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer = new ScormAnswerHotspot($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
// not supported
@ -114,7 +114,7 @@ class ScormQuestion extends Question
case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE:
case UNIQUE_ANSWER_IMAGE:
case CALCULATED_ANSWER:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer = new ScormAnswerMultipleChoice($this->iid);
$this->answer->questionJSId = $this->js_id;
break;
default:
@ -173,7 +173,7 @@ class ScormQuestion extends Question
$cols = 2;
return '<tr>
<td colspan="'.$cols.'" id="question_'.$this->id.'_title" valign="middle" style="background-color:#d6d6d6;">
<td colspan="'.$cols.'" id="question_'.$this->iid.'_title" valign="middle" style="background-color:#d6d6d6;">
'.$title.'
</td>
</tr>
@ -192,10 +192,10 @@ class ScormQuestion extends Question
$weight = $this->selectWeighting();
$js = '
questions.push('.$this->js_id.');
$(function() {
$(function() {
if (exerciseInfo.randomAnswers == true) {
$("#question_'.$this->js_id.'").shuffleRows();
}
$("#question_'.$this->js_id.'").shuffleRows();
}
});';
$js .= "\n";

@ -36,8 +36,8 @@ class FillBlanks extends Question
$defaults['answer'] = get_lang('DefaultTextInBlanks');
$defaults['select_separator'] = 0;
$blankSeparatorNumber = 0;
if (!empty($this->id)) {
$objectAnswer = new Answer($this->id);
if (!empty($this->iid)) {
$objectAnswer = new Answer($this->iid);
$answer = $objectAnswer->selectAnswer(1);
$listAnswersInfo = self::getAnswerInfo($answer);
$defaults['multiple_answer'] = 0;
@ -359,7 +359,7 @@ class FillBlanks extends Question
$form->addHtml('<div id="defineoneblank" style="color:#D04A66; margin-left:160px">'.get_lang('DefineBlanks').'</div>');
$form->addButtonSave($text, 'submitQuestion');
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -480,7 +480,7 @@ class FillBlanks extends Question
$answer .= '@'.$is_multiple;
$this->save($exercise);
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$objAnswer->createAnswer($answer, 0, '', 0, 1);
$objAnswer->save();
}

@ -33,7 +33,7 @@ class FreeAnswer extends Question
global $text;
// setting the save button here and not in the question class.php
$form->addButtonSave($text, 'submitQuestion');
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults(['weighting' => float_format($this->weighting, 1)]);
} else {
if ($this->isContent == 1) {

@ -47,8 +47,8 @@ class GlobalMultipleAnswer extends Question
$defaults = [];
$correct = 0;
$answer = false;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nb_answers = $answer->nbrAnswers;
@ -167,7 +167,7 @@ class GlobalMultipleAnswer extends Question
global $text;
if ($obj_ex->edit_exercise_in_lp ||
(empty($this->exerciseList) && empty($obj_ex->id))
(empty($this->exerciseList) && empty($obj_ex->iid))
) {
// setting the save button here and not in the question class.php
$form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers');
@ -183,7 +183,7 @@ class GlobalMultipleAnswer extends Question
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -198,7 +198,7 @@ class GlobalMultipleAnswer extends Question
*/
public function processAnswersCreation($form, $exercise)
{
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
// Score total

@ -214,7 +214,7 @@ if ((api_is_allowed_to_edit(null, true)) && (($finish == 0) || ($finish == 2)))
$hotPotatoesDocumentId = $row['iid'];
// Update the record with the 'comment' (HP title)
$query = "UPDATE $dbTable
SET comment='".Database::escape_string($title)."'
SET comment = '".Database::escape_string($title)."'
WHERE iid = $hotPotatoesDocumentId";
Database::query($query);
// Mark the addition of the HP quiz in the item_property table

@ -54,7 +54,7 @@ class HotpotatoesExerciseResult
$sql = "SELECT '', exe_name, exe_result , exe_weighting, exe_date
FROM $TBL_TRACK_HOTPOTATOES
WHERE
exe_user_id = '".$user_id."' AND
exe_user_id = $user_id AND
c_id = $course_id AND
tth.exe_name = '$hotpotato_name'
ORDER BY c_id ASC, exe_date ASC";

@ -37,7 +37,7 @@ $course_id = api_get_course_int_id();
// Query db for answers
if ($answer_type == HOT_SPOT_DELINEATION) {
$sql = "SELECT iid, id, answer, hotspot_coordinates, hotspot_type, ponderation
$sql = "SELECT iid, answer, hotspot_coordinates, hotspot_type, ponderation
FROM $TBL_ANSWERS
WHERE
c_id = $course_id AND
@ -45,7 +45,7 @@ if ($answer_type == HOT_SPOT_DELINEATION) {
hotspot_type = 'delineation'
ORDER BY iid";
} else {
$sql = "SELECT iid, id, answer, hotspot_coordinates, hotspot_type, ponderation
$sql = "SELECT iid, answer, hotspot_coordinates, hotspot_type, ponderation
FROM $TBL_ANSWERS
WHERE c_id = $course_id AND question_id = $questionId
ORDER BY position";
@ -84,7 +84,6 @@ $nmbrTries = 0;
while ($hotspot = Database::fetch_assoc($result)) {
$hotSpot = [];
$hotSpot['id'] = $hotspot['id'];
$hotSpot['iid'] = $hotspot['iid'];
$hotSpot['answer'] = $hotspot['answer'];
@ -164,7 +163,7 @@ if (Session::has("hotspot_ordered$questionId")) {
foreach ($hotspotOrdered as $hotspotOrder) {
foreach ($data['hotspots'] as $hotspot) {
if ($hotspot['id'] != $hotspotOrder) {
if ($hotspot['iid'] != $hotspotOrder) {
continue;
}

@ -67,7 +67,7 @@ $nbrAnswers = count($answers['answer']);
for ($i = 1; $i <= $nbrAnswers; $i++) {
$hotSpot = [];
$hotSpot['id'] = null;
$hotSpot['iid'] = null;
$hotSpot['answer'] = $answers['answer'][$i];
if ($answer_type == HOT_SPOT_DELINEATION) {

@ -341,7 +341,7 @@ if (isset($modifyAnswers)) {
}
// construction of the Answer object
$objAnswer = new Answer($objQuestion->id);
$objAnswer = new Answer($objQuestion->iid);
Session::write('objAnswer', $objAnswer);
if ($debug > 0) {

@ -108,7 +108,7 @@ if (in_array(
if ($objExercise->attempts > 0) {
$attempts = Event::getExerciseResultsByUser(
api_get_user_id(),
$objExercise->id,
$objExercise->iid,
$courseId,
api_get_session_id(),
$lpId,
@ -198,14 +198,14 @@ if (!$hideExpectedAnswer) {
foreach ($result as $hotSpotAnswer) {
if (RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT_NO_FEEDBACK == $resultDisable) {
if (false === $showTotalScoreAndUserChoicesInLastAttempt) {
if (!in_array($hotSpotAnswer->getIid(), $hotSpotWithAnswer)) {
if (!in_array($hotSpotAnswer->getId(), $hotSpotWithAnswer)) {
continue;
}
}
}
$hotSpot = [];
$hotSpot['id'] = $hotSpotAnswer->getIid();
$hotSpot['id'] = $hotSpotAnswer->getId();
$hotSpot['answer'] = $hotSpotAnswer->getAnswer();
switch ($hotSpotAnswer->getHotspotType()) {

@ -36,13 +36,11 @@ if ($_GET['type'] == "poly" || $_GET['type'] == "delineation" || $_GET['type'] =
}
$hotspot_coordinates = api_substr($hotspot_coordinates, 0, -2);
}
$course_id = api_get_course_int_id();
$sql = "UPDATE $TBL_ANSWER SET
hotspot_coordinates = '".Database::escape_string($hotspot_coordinates)."',
hotspot_type = '".Database::escape_string($hotspot_type)."'
WHERE
c_id = $course_id AND
id = ".intval($answerId)." AND
iid = ".intval($answerId)." AND
question_id = ".intval($questionId)."
LIMIT 1 ";
$result = Database::query($sql);

@ -37,7 +37,7 @@ Display::display_header(get_lang('StudentsWhoAreTakingTheExerciseRightNow'));
//jqgrid will use this URL to do the selects
$minutes = 60;
$url = api_get_path(WEB_AJAX_PATH).
'exercise.ajax.php?'.api_get_cidreq().'&a=get_live_stats&exercise_id='.$objExercise->id.'&minutes='.$minutes;
'exercise.ajax.php?'.api_get_cidreq().'&a=get_live_stats&exercise_id='.$objExercise->iid.'&minutes='.$minutes;
//The order is important you need to check the the $column variable in the model.ajax.php file
$columns = [

@ -38,8 +38,8 @@ class Matching extends Question
$answer = null;
$counter = 1;
if (isset($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0) {
for ($i = 1; $i <= $answer->nbrAnswers; $i++) {
@ -63,14 +63,14 @@ class Matching extends Question
$nb_matches++;
$nb_options++;
}
} elseif (!empty($this->id)) {
} elseif (!empty($this->iid)) {
if ($answer->nbrAnswers > 0) {
$nb_matches = $nb_options = 0;
for ($i = 1; $i <= $answer->nbrAnswers; $i++) {
if ($answer->isCorrect($i)) {
$nb_matches++;
$defaults['answer['.$nb_matches.']'] = $answer->selectAnswer($i);
$defaults['weighting['.$nb_matches.']'] = float_format($answer->selectWeighting($i), 1);
$defaults['weighting['.$nb_matches.']'] = float_format($answer->selectWeighting($i));
$defaults['matches['.$nb_matches.']'] = $answer->correct[$i];
} else {
$nb_options++;
@ -221,7 +221,7 @@ class Matching extends Question
$group[] = $form->addButtonSave($text, 'submitQuestion', true);
$form->addGroup($group);
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -246,7 +246,7 @@ class Matching extends Question
$nb_options = $form->getSubmitValue('nb_options');
$this->weighting = 0;
$position = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
// Insert the options
for ($i = 1; $i <= $nb_options; $i++) {

@ -63,8 +63,8 @@ class MultipleAnswer extends Question
$defaults = [];
$correct = 0;
$answer = false;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nb_answers = $answer->nbrAnswers;
@ -153,7 +153,7 @@ class MultipleAnswer extends Question
$buttonGroup = [];
global $text;
if ($obj_ex->edit_exercise_in_lp == true ||
(empty($this->exerciseList) && empty($obj_ex->id))
(empty($this->exerciseList) && empty($obj_ex->iid))
) {
// setting the save button here and not in the question class.php
$buttonGroup[] = $form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers', true);
@ -174,7 +174,7 @@ class MultipleAnswer extends Question
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -190,7 +190,7 @@ class MultipleAnswer extends Question
public function processAnswersCreation($form, $exercise)
{
$questionWeighting = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
for ($i = 1; $i <= $nb_answers; $i++) {

@ -55,8 +55,8 @@ class MultipleAnswerCombination extends Question
$correct = 0;
$answer = false;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nb_answers = $answer->nbrAnswers;
@ -153,7 +153,7 @@ class MultipleAnswerCombination extends Question
global $text;
if ($obj_ex->edit_exercise_in_lp == true ||
(empty($this->exerciseList) && empty($obj_ex->id))
(empty($this->exerciseList) && empty($obj_ex->iid))
) {
// setting the save button here and not in the question class.php
$buttonGroup = [
@ -167,7 +167,7 @@ class MultipleAnswerCombination extends Question
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -184,7 +184,7 @@ class MultipleAnswerCombination extends Question
public function processAnswersCreation($form, $exercise)
{
$questionWeighting = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
for ($i = 1; $i <= $nb_answers; $i++) {

@ -64,8 +64,8 @@ class MultipleAnswerTrueFalse extends Question
$answer = null;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
@ -80,7 +80,7 @@ class MultipleAnswerTrueFalse extends Question
}
// Can be more options
$optionData = Question::readQuestionOption($this->id, $course_id);
$optionData = Question::readQuestionOption($this->iid, $course_id);
for ($i = 1; $i <= $nb_answers; $i++) {
$form->addHtml('<tr>');
@ -226,7 +226,7 @@ class MultipleAnswerTrueFalse extends Question
global $text;
if ($obj_ex->edit_exercise_in_lp == true ||
(empty($this->exerciseList) && empty($obj_ex->id))
(empty($this->exerciseList) && empty($obj_ex->iid))
) {
// setting the save button here and not in the question class.php
$buttonGroup[] = $form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers', true);
@ -236,7 +236,7 @@ class MultipleAnswerTrueFalse extends Question
$form->addGroup($buttonGroup);
}
if (!empty($this->id) && !$form->isSubmitted()) {
if (!empty($this->iid) && !$form->isSubmitted()) {
$form->setDefaults($defaults);
}
$form->setConstants(['nb_answers' => $nb_answers]);
@ -248,23 +248,23 @@ class MultipleAnswerTrueFalse extends Question
public function processAnswersCreation($form, $exercise)
{
$questionWeighting = 0;
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
$course_id = api_get_course_int_id();
$correct = [];
$options = Question::readQuestionOption($this->id, $course_id);
$options = Question::readQuestionOption($this->iid, $course_id);
if (!empty($options)) {
foreach ($options as $optionData) {
$id = $optionData['id'];
unset($optionData['id']);
$id = $optionData['iid'];
unset($optionData['iid']);
Question::updateQuestionOption($id, $optionData, $course_id);
}
} else {
for ($i = 1; $i <= 3; $i++) {
$last_id = Question::saveQuestionOption(
$this->id,
$this->iid,
$this->options[$i],
$course_id,
$i
@ -275,7 +275,7 @@ class MultipleAnswerTrueFalse extends Question
/* Getting quiz_question_options (true, false, doubt) because
it's possible that there are more options in the future */
$new_options = Question::readQuestionOption($this->id, $course_id);
$new_options = Question::readQuestionOption($this->iid, $course_id);
$sortedByPosition = [];
foreach ($new_options as $item) {
$sortedByPosition[$item['position']] = $item;
@ -298,7 +298,7 @@ class MultipleAnswerTrueFalse extends Question
if (empty($options)) {
//If this is the first time that the question is created when
// change the default values from the form 1 and 2 by the correct "option id" registered
$goodAnswer = isset($sortedByPosition[$goodAnswer]) ? $sortedByPosition[$goodAnswer]['id'] : '';
$goodAnswer = isset($sortedByPosition[$goodAnswer]) ? $sortedByPosition[$goodAnswer]['iid'] : '';
}
$questionWeighting += $extra_values[0]; //By default 0 has the correct answers
$objAnswer->createAnswer($answer, $goodAnswer, $comment, '', $i);

@ -45,7 +45,7 @@ class OralExpression extends Question
global $text;
// setting the save button here and not in the question class.php
$form->addButtonSave($text, 'submitQuestion');
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults(['weighting' => float_format($this->weighting, 1)]);
} else {
if ($this->isContent == 1) {
@ -257,20 +257,20 @@ class OralExpression extends Question
mkdir($this->storePath.$this->sessionId.'/'.$this->exerciseId);
}
if (!empty($this->id) && !is_dir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->id)) {
mkdir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->id);
if (!empty($this->iid) && !is_dir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->iid)) {
mkdir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->iid);
}
if (!empty($this->userId) &&
!is_dir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->id.'/'.$this->userId)
!is_dir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->iid.'/'.$this->userId)
) {
mkdir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->id.'/'.$this->userId);
mkdir($this->storePath.$this->sessionId.'/'.$this->exerciseId.'/'.$this->iid.'/'.$this->userId);
}
$params = [
$this->sessionId,
$this->exerciseId,
$this->id,
$this->iid,
$this->userId,
];
@ -293,7 +293,7 @@ class OralExpression extends Question
$this->sessionId,
$this->userId,
$this->exerciseId,
$this->id,
$this->iid,
$this->exeId,
]
);
@ -309,7 +309,7 @@ class OralExpression extends Question
$params = [
$this->sessionId,
$this->exerciseId,
$this->id,
$this->iid,
$this->userId,
];

@ -55,7 +55,7 @@ $interbreadcrumb[] = [
$interbreadcrumb[] = ['url' => '#', 'name' => $objExercise->selectTitle(true)];
$time_control = false;
$clock_expired_time = ExerciseLib::get_session_time_control_key($objExercise->id, $learnpath_id, $learnpath_item_id);
$clock_expired_time = ExerciseLib::get_session_time_control_key($objExercise->iid, $learnpath_id, $learnpath_item_id);
if ($objExercise->expired_time != 0 && !empty($clock_expired_time)) {
$time_control = true;
@ -66,7 +66,7 @@ if (isset($_GET['preview'])) {
$extra_params = '&preview=1';
}
$exercise_url = api_get_path(WEB_CODE_PATH).'exercise/exercise_submit.php?'.
api_get_cidreq().'&exerciseId='.$objExercise->id.'&learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id.'&learnpath_item_view_id='.$learnpathItemViewId.$extra_params;
api_get_cidreq().'&exerciseId='.$objExercise->iid.'&learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id.'&learnpath_item_view_id='.$learnpathItemViewId.$extra_params;
if ($time_control) {
// Get time left for expiring time
@ -107,12 +107,12 @@ if ($is_allowed_to_edit) {
if ($objExercise->sessionId == $sessionId) {
$editLink = Display::url(
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL),
api_get_path(WEB_CODE_PATH).'exercise/admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id
api_get_path(WEB_CODE_PATH).'exercise/admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid
);
}
$editLink .= Display::url(
Display::return_icon('test_results.png', get_lang('Results'), [], ICON_SIZE_SMALL),
api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id,
api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid,
['title' => get_lang('Results')]
);
}
@ -231,7 +231,7 @@ if (!api_is_allowed_to_session_edit()) {
$attempts = Event::getExerciseResultsByUser(
api_get_user_id(),
$objExercise->id,
$objExercise->iid,
api_get_course_int_id(),
api_get_session_id(),
$learnpath_id,

@ -32,7 +32,7 @@ switch ($action) {
);
if (!empty($results)) {
foreach ($results as $exercise) {
$data[] = ['id' => $exercise['id'], 'text' => html_entity_decode($exercise['title'])];
$data[] = ['id' => $exercise['iid'], 'text' => html_entity_decode($exercise['title'])];
}
}

@ -77,7 +77,6 @@ abstract class Question
*/
public function __construct()
{
$this->id = 0;
$this->iid = 0;
$this->question = '';
$this->description = '';
@ -148,14 +147,13 @@ abstract class Question
$sql = "SELECT *
FROM $TBL_QUESTIONS
WHERE c_id = $course_id AND id = $id ";
WHERE iid = $id ";
$result = Database::query($sql);
// if the question has been found
if ($object = Database::fetch_object($result)) {
$objQuestion = self::getInstance($object->type);
if (!empty($objQuestion)) {
$objQuestion->id = (int) $id;
$objQuestion->iid = (int) $object->iid;
$objQuestion->question = $object->question;
$objQuestion->description = $object->description;
@ -187,7 +185,7 @@ abstract class Question
$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
ON e.iid = q.exercice_id
WHERE
q.c_id = $course_id AND
q.question_id = $id AND
@ -220,7 +218,7 @@ abstract class Question
*/
public function selectId()
{
return $this->id;
return $this->iid;
}
/**
@ -291,8 +289,8 @@ abstract class Question
q.hide_question_number AS hide_num
FROM
$tblQuiz as q
INNER JOIN $tblQuizRelQuestion AS qrq ON qrq.exercice_id = q.id
WHERE qrq.question_id = ".$this->id;
INNER JOIN $tblQuizRelQuestion AS qrq ON qrq.exercice_id = q.iid
WHERE qrq.question_id = ".$this->iid;
$res = Database::query($sql);
$result = Database::store_result($res);
if (is_array($result) &&
@ -570,7 +568,7 @@ abstract class Question
// update or add category for a question
foreach ($category_list as $category_id) {
$category_id = (int) $category_id;
$question_id = (int) $this->id;
$question_id = (int) $this->iid;
$sql = "SELECT count(*) AS nb
FROM $table
WHERE
@ -615,11 +613,11 @@ abstract class Question
// update or add category for a question
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
$categoryId = (int) $categoryId;
$question_id = (int) $this->id;
$question_id = (int) $this->iid;
$sql = "SELECT count(*) AS nb FROM $table
WHERE
question_id = $question_id AND
c_id = ".$courseId;
c_id = $courseId";
$res = Database::query($sql);
$row = Database::fetch_array($res);
$allowMandatory = api_get_configuration_value('allow_mandatory_question_in_category');
@ -633,11 +631,11 @@ abstract class Question
$extraMandatoryCondition
WHERE
question_id = $question_id AND
c_id = ".$courseId;
c_id = $courseId";
Database::query($sql);
} else {
$sql = "INSERT INTO $table (c_id, question_id, category_id)
VALUES (".$courseId.", $question_id, $categoryId)";
VALUES ($courseId, $question_id, $categoryId)";
Database::query($sql);
if ($allowMandatory) {
@ -667,14 +665,14 @@ abstract class Question
{
$courseId = empty($courseId) ? api_get_course_int_id() : (int) $courseId;
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
$questionId = (int) $this->id;
$questionId = (int) $this->iid;
if (empty($courseId) || empty($questionId)) {
return false;
}
$sql = "DELETE FROM $table
WHERE
question_id = $questionId AND
c_id = ".$courseId;
c_id = $courseId";
Database::query($sql);
return true;
@ -728,7 +726,7 @@ abstract class Question
) {
// removes old answers
$sql = "DELETE FROM $table
WHERE c_id = $course_id AND question_id = ".intval($this->id);
WHERE c_id = $course_id AND question_id = ".intval($this->iid);
Database::query($sql);
}
@ -788,7 +786,7 @@ abstract class Question
$picturePath = $this->getHotSpotFolderInCourse();
// if the question has got an ID
if ($this->id) {
if ($this->iid) {
$pictureFilename = self::generatePictureName();
$img = new Image($picture);
$img->send_image($picturePath.'/'.$pictureFilename, -1, 'jpg');
@ -853,7 +851,7 @@ abstract class Question
$picturePath = $this->getHotSpotFolderInCourse();
// if the question has got an ID and if the picture exists
if ($this->id) {
if ($this->iid) {
$picture = $this->picture;
$this->picture = '';
@ -889,7 +887,7 @@ abstract class Question
$source_path = $this->getHotSpotFolderInCourse();
// if the question has got an ID and if the picture exists
if (!$this->id || empty($this->picture)) {
if (!$this->iid || empty($this->picture)) {
return false;
}
@ -923,7 +921,7 @@ abstract class Question
$table = Database::get_course_table(TABLE_QUIZ_QUESTION);
$sql = "UPDATE $table SET
picture = '".Database::escape_string($picture)."'
WHERE c_id = $course_id AND id='".intval($questionId)."'";
WHERE c_id = $course_id AND iid = ".intval($questionId);
Database::query($sql);
$documentId = add_document(
@ -1000,9 +998,9 @@ abstract class Question
$TBL_EXERCISE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION);
$em = Database::getManager();
$exerciseId = $exercise->id;
$exerciseId = $exercise->iid;
$id = $this->id;
$id = $this->iid;
$question = $this->question;
$description = $this->description;
$weighting = $this->weighting;
@ -1033,7 +1031,7 @@ abstract class Question
Database::update(
$TBL_QUESTIONS,
$params,
['c_id = ? AND id = ?' => [$c_id, $id]]
['c_id = ? AND iid = ?' => [$c_id, $id]]
);
Event::addEvent(
@ -1061,7 +1059,7 @@ abstract class Question
FROM $TBL_QUESTIONS as question,
$TBL_EXERCISE_QUESTION as test_question
WHERE
question.id = test_question.question_id AND
question.iid = test_question.question_id AND
test_question.exercice_id = ".$exerciseId." AND
question.c_id = $c_id AND
test_question.c_id = $c_id ";
@ -1085,22 +1083,19 @@ abstract class Question
if ($exercise->questionFeedbackEnabled) {
$params['feedback'] = $this->feedback;
}
$this->id = Database::insert($TBL_QUESTIONS, $params);
if ($this->id) {
$sql = "UPDATE $TBL_QUESTIONS SET id = iid WHERE iid = {$this->id}";
Database::query($sql);
$this->iid = Database::insert($TBL_QUESTIONS, $params);
if ($this->iid) {
Event::addEvent(
LOG_QUESTION_CREATED,
LOG_QUESTION_ID,
$this->id
$this->iid
);
api_item_property_update(
$this->course,
TOOL_QUIZ,
$this->id,
$this->iid,
'QuizQuestionAdded',
api_get_user_id()
);
@ -1110,7 +1105,7 @@ abstract class Question
$quizAnswer = new CQuizAnswer();
$quizAnswer
->setCId($c_id)
->setQuestionId($this->id)
->setQuestionId($this->iid)
->setAnswer('')
->setPonderation(10)
->setPosition(1)
@ -1120,7 +1115,7 @@ abstract class Question
$em->persist($quizAnswer);
$em->flush();
$id = $quizAnswer->getIid();
$id = $quizAnswer->getId();
if ($id) {
$quizAnswer
@ -1136,7 +1131,7 @@ abstract class Question
$quizAnswer = new CQuizAnswer();
$quizAnswer
->setCId($c_id)
->setQuestionId($this->id)
->setQuestionId($this->iid)
->setAnswer('')
->setPonderation(10)
->setPosition(1)
@ -1146,7 +1141,7 @@ abstract class Question
$em->persist($quizAnswer);
$em->flush();
$id = $quizAnswer->getIid();
$id = $quizAnswer->getId();
if ($id) {
$quizAnswer
@ -1192,12 +1187,12 @@ abstract class Question
//there's only one row per question on normal db and one document per question on search engine db
$sql = 'SELECT * FROM %s
WHERE course_code=\'%s\' AND tool_id=\'%s\' AND ref_id_second_level=%s LIMIT 1';
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->id);
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->iid);
} else {
$sql = 'SELECT * FROM %s
WHERE course_code=\'%s\' AND tool_id=\'%s\'
AND ref_id_high_level=%s AND ref_id_second_level=%s LIMIT 1';
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->id);
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->iid);
}
$res = Database::query($sql);
@ -1252,7 +1247,7 @@ abstract class Question
SE_DATA => [
'type' => SE_DOCTYPE_EXERCISE_QUESTION,
'exercise_ids' => $question_exercises,
'question_id' => (int) $this->id,
'question_id' => (int) $this->iid,
],
SE_USER => (int) api_get_user_id(),
];
@ -1274,7 +1269,7 @@ abstract class Question
if ($addQs || $rmQs) {
$sql = "DELETE FROM %s
WHERE course_code = '%s' AND tool_id = '%s' AND ref_id_second_level = '%s'";
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->id);
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->iid);
} else {
$sql = "DELETE FROM %S
WHERE
@ -1283,7 +1278,7 @@ abstract class Question
AND tool_id = '%s'
AND ref_id_high_level = '%s'
AND ref_id_second_level = '%s'";
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->id);
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->iid);
}
Database::query($sql);
if ($rmQs) {
@ -1300,7 +1295,7 @@ abstract class Question
$course_id,
TOOL_QUIZ,
array_shift($question_exercises),
$this->id,
$this->iid,
$did
);
Database::query($sql);
@ -1312,7 +1307,7 @@ abstract class Question
VALUES (
NULL , '%s', '%s', %s, %s, %s
)";
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->id, $did);
$sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $exerciseId, $this->iid, $did);
Database::query($sql);
}
}
@ -1331,7 +1326,7 @@ abstract class Question
public function addToList($exerciseId, $fromSave = false)
{
$exerciseRelQuestionTable = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$id = (int) $this->id;
$id = (int) $this->iid;
$exerciseId = (int) $exerciseId;
// checks if the exercise ID is not in the list
@ -1343,7 +1338,7 @@ abstract class Question
$count = $newExercise->getQuestionCount();
$count++;
$sql = "INSERT INTO $exerciseRelQuestionTable (c_id, question_id, exercice_id, question_order)
VALUES ({$this->course['real_id']}, ".$id.", ".$exerciseId.", '$count')";
VALUES ({$this->course['real_id']}, $id, $exerciseId, $count)";
Database::query($sql);
// we do not want to reindex if we had just saved adnd indexed the question
@ -1366,7 +1361,7 @@ abstract class Question
public function removeFromList($exerciseId, $courseId = 0)
{
$table = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$id = (int) $this->id;
$id = (int) $this->iid;
$exerciseId = (int) $exerciseId;
// searches the position of the exercise ID in the list
@ -1439,14 +1434,14 @@ abstract class Question
$TBL_REPONSES = Database::get_course_table(TABLE_QUIZ_ANSWER);
$TBL_QUIZ_QUESTION_REL_CATEGORY = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
$id = (int) $this->id;
$id = (int) $this->iid;
// if the question must be removed from all exercises
if (!$deleteFromEx) {
//update the question_order of each question to avoid inconsistencies
$sql = "SELECT exercice_id, question_order
FROM $TBL_EXERCISE_QUESTION
WHERE c_id = $courseId AND question_id = ".$id;
WHERE c_id = $courseId AND question_id = $id";
$res = Database::query($sql);
if (Database::num_rows($res) > 0) {
@ -1464,28 +1459,28 @@ abstract class Question
}
$sql = "DELETE FROM $TBL_EXERCISE_QUESTION
WHERE c_id = $courseId AND question_id = ".$id;
Database::query($sql);
$sql = "DELETE FROM $TBL_QUESTIONS
WHERE c_id = $courseId AND id = ".$id;
WHERE c_id = $courseId AND question_id = $id";
Database::query($sql);
$sql = "DELETE FROM $TBL_REPONSES
WHERE c_id = $courseId AND question_id = ".$id;
WHERE c_id = $courseId AND question_id = $id";
Database::query($sql);
// remove the category of this question in the question_rel_category table
$sql = "DELETE FROM $TBL_QUIZ_QUESTION_REL_CATEGORY
WHERE
c_id = $courseId AND
question_id = ".$id;
question_id = $id";
Database::query($sql);
// Add extra fields.
$extraField = new ExtraFieldValue('question');
$extraField->deleteValuesByItem($this->iid);
$sql = "DELETE FROM $TBL_QUESTIONS
WHERE iid = $id";
Database::query($sql);
api_item_property_update(
$this->course,
TOOL_QUIZ,
@ -1568,7 +1563,7 @@ abstract class Question
$course_id = $courseInfo['real_id'];
// Read the source options
$options = self::readQuestionOption($this->id, $this->course['real_id']);
$options = self::readQuestionOption($this->iid, $this->course['real_id']);
// Inserting in the new course db / or the same course db
$params = [
@ -1584,11 +1579,6 @@ abstract class Question
$newQuestionId = Database::insert($questionTable, $params);
if ($newQuestionId) {
$sql = "UPDATE $questionTable
SET id = iid
WHERE iid = $newQuestionId";
Database::query($sql);
// Add extra fields.
$extraField = new ExtraFieldValue('question');
$extraField->copy($this->iid, $newQuestionId);
@ -1598,15 +1588,9 @@ abstract class Question
foreach ($options as $item) {
$item['question_id'] = $newQuestionId;
$item['c_id'] = $course_id;
unset($item['id']);
unset($item['iid']);
unset($item['id']);
$id = Database::insert($TBL_QUESTION_OPTIONS, $item);
if ($id) {
$sql = "UPDATE $TBL_QUESTION_OPTIONS
SET id = iid
WHERE iid = $id";
Database::query($sql);
}
}
}
@ -1965,9 +1949,9 @@ abstract class Question
//Save normal question if NOT media
if (MEDIA_QUESTION != $this->type) {
$creationMode = empty($this->id);
$creationMode = empty($this->iid);
$this->save($exercise);
$exercise->addToList($this->id);
$exercise->addToList($this->iid);
// Only update position in creation and when using ordered or random types.
if ($creationMode &&
@ -1977,7 +1961,7 @@ abstract class Question
}
$params = $form->exportValues();
$params['item_id'] = $this->id;
$params['item_id'] = $this->iid;
$extraFieldValues = new ExtraFieldValue('question');
$extraFieldValues->saveFieldValues($params);
@ -2009,7 +1993,7 @@ abstract class Question
}
$feedbackType = $objExercise->getFeedbackType();
$exerciseId = $objExercise->id;
$exerciseId = $objExercise->iid;
// 1. by default we show all the question types
$questionTypeList = self::getQuestionTypeList();
@ -2108,12 +2092,8 @@ abstract class Question
$params['name'] = $name;
$params['position'] = $position;
$params['c_id'] = $course_id;
$result = self::readQuestionOption($question_id, $course_id);
//$result = self::readQuestionOption($question_id, $course_id);
$last_id = Database::insert($table, $params);
if ($last_id) {
$sql = "UPDATE $table SET id = iid WHERE iid = $last_id";
Database::query($sql);
}
return $last_id;
}
@ -2146,11 +2126,18 @@ abstract class Question
public static function updateQuestionOption($id, $params, $course_id)
{
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_OPTION);
if (isset($params['id'])) {
// 'id' has been replaced by 'iid' but is still defined into
// $params because of Database::select() which add this index
// by default, so "undefine" it to avoid errors if the field
// does not exist
unset($params['id']);
}
return Database::update(
$table,
$params,
['c_id = ? AND id = ?' => [$course_id, $id]]
['c_id = ? AND iid = ?' => [$course_id, $id]]
);
}
@ -2174,7 +2161,7 @@ abstract class Question
$question_id,
],
],
'order' => 'id ASC',
'order' => 'iid ASC',
]
);
}
@ -2263,7 +2250,7 @@ abstract class Question
// display question category, if any
$header = '';
if ($exercise->display_category_name) {
$header = TestCategory::returnCategoryAndTitle($this->id);
$header = TestCategory::returnCategoryAndTitle($this->iid);
}
$show_media = '';
if ($show_media) {
@ -2313,7 +2300,7 @@ abstract class Question
['class' => 'question_description']
);
} else {
if (true == $score['pass']) {
if (isset($score['pass']) && true == $score['pass']) {
$message = Display::div(
sprintf(
get_lang('ReadingQuestionCongratsSpeedXReachedForYWords'),
@ -2357,7 +2344,6 @@ abstract class Question
* @param int Maximum result for the question
* @param int Type of question (see constants at beginning of question.class.php)
* @param int Question level/category
* @param string $quiz_id
*/
public function create_question(
$quiz_id,
@ -2381,9 +2367,8 @@ abstract class Question
FROM $tbl_quiz_question q
INNER JOIN $tbl_quiz_rel_question r
ON
q.id = r.question_id AND
q.iid = r.question_id AND
exercice_id = $quiz_id AND
q.c_id = $course_id AND
r.c_id = $course_id";
$rs_max = Database::query($sql);
$row_max = Database::fetch_object($rs_max);
@ -2401,10 +2386,6 @@ abstract class Question
$question_id = Database::insert($tbl_quiz_question, $params);
if ($question_id) {
$sql = "UPDATE $tbl_quiz_question
SET id = iid WHERE iid = $question_id";
Database::query($sql);
// Get the max question_order
$sql = "SELECT max(question_order) as max_order
FROM $tbl_quiz_rel_question
@ -2515,7 +2496,7 @@ abstract class Question
if (!empty($medias)) {
foreach ($medias as $media) {
$media_list[$media['id']] = empty($media['question']) ? get_lang('Untitled') : $media['question'];
$media_list[$media['iid']] = empty($media['question']) ? get_lang('Untitled') : $media['question'];
}
}
@ -2568,7 +2549,7 @@ abstract class Question
Database::update(
Database::get_course_table(TABLE_QUIZ_QUESTION),
['type' => $this->type],
['c_id = ? AND id = ?' => [$this->course['real_id'], $this->id]]
['iid = ?' => [$this->iid]]
);
$answerClasses = [
UNIQUE_ANSWER => 'UniqueAnswer',
@ -2657,9 +2638,9 @@ abstract class Question
$count = $em
->createQuery('
SELECT COUNT(qq.iid) FROM ChamiloCourseBundle:CQuizRelQuestion qq
WHERE qq.questionId = :id
WHERE qq.questionId = :iid
')
->setParameters(['id' => (int) $this->id])
->setParameters(['iid' => (int) $this->iid])
->getSingleScalarResult();
return (int) $count;
@ -2681,9 +2662,9 @@ abstract class Question
SELECT e
FROM ChamiloCourseBundle:CQuizRelQuestion qq
JOIN ChamiloCourseBundle:CQuiz e
WHERE e.iid = qq.exerciceId AND qq.questionId = :id
WHERE e.iid = qq.exerciceId AND qq.questionId = :iid
')
->setParameters(['id' => (int) $this->id])
->setParameters(['iid' => (int) $this->iid])
->getResult();
}
@ -2695,7 +2676,7 @@ abstract class Question
$result = Database::select(
'COUNT(1) AS c',
Database::get_course_table(TABLE_QUIZ_ANSWER),
['where' => ['question_id = ?' => [$this->id]]],
['where' => ['question_id = ?' => [$this->iid]]],
'first'
);
@ -2716,7 +2697,7 @@ abstract class Question
private function resizePicture($Dimension, $Max)
{
// if the question has an ID
if (!$this->id) {
if (!$this->iid) {
return false;
}

@ -10,7 +10,7 @@
*/
if (isset($_GET['editQuestion'])) {
$objQuestion = Question::read($_GET['editQuestion']);
$action = api_get_self().'?'.api_get_cidreq().'&modifyQuestion='.$modifyQuestion.'&editQuestion='.$objQuestion->id.'&page='.$page;
$action = api_get_self().'?'.api_get_cidreq().'&modifyQuestion='.$modifyQuestion.'&editQuestion='.$objQuestion->iid.'&page='.$page;
} else {
$objQuestion = Question::getInstance($_REQUEST['answerType']);
$action = api_get_self().'?'.api_get_cidreq().'&modifyQuestion='.$modifyQuestion.'&newQuestion='.$newQuestion;
@ -46,7 +46,7 @@ if (is_object($objQuestion)) {
$objQuestion->createAnswersForm($form);
// this variable $show_quiz_edition comes from admin.php blocks the exercise/quiz modifications
if (!empty($objExercise->id) && $objExercise->edit_exercise_in_lp == false) {
if (!empty($objExercise->iid) && $objExercise->edit_exercise_in_lp == false) {
$form->freeze();
}
@ -63,7 +63,7 @@ if (is_object($objQuestion)) {
if (isset($_GET['editQuestion'])) {
if (empty($exerciseId)) {
Display::addFlash(Display::return_message(get_lang('ItemUpdated')));
$url = 'admin.php?exerciseId='.$exerciseId.'&'.api_get_cidreq().'&editQuestion='.$objQuestion->id;
$url = 'admin.php?exerciseId='.$exerciseId.'&'.api_get_cidreq().'&editQuestion='.$objQuestion->iid;
echo '<script type="text/javascript">window.location.href="'.$url.'"</script>';
exit;
}
@ -78,7 +78,7 @@ if (is_object($objQuestion)) {
echo '<script type="text/javascript">window.location.href="admin.php?exerciseId='.$exerciseId.'&'.api_get_cidreq().'&page='.$page.'&message=ItemAdded"</script>';
}
} else {
echo '<script type="text/javascript">window.location.href="admin.php?exerciseId='.$exerciseId.'&page='.$page.'&hotspotadmin='.$objQuestion->id.'&'.api_get_cidreq().'"</script>';
echo '<script type="text/javascript">window.location.href="admin.php?exerciseId='.$exerciseId.'&page='.$page.'&hotspotadmin='.$objQuestion->iid.'&'.api_get_cidreq().'"</script>';
}
} else {
if (isset($questionName)) {

@ -47,14 +47,14 @@ $session_id = api_get_session_id();
$tbl_exercises = Database::get_course_table(TABLE_QUIZ_TEST);
$course_id = api_get_course_int_id();
$sql = "SELECT id,title,type,description, results_disabled
$sql = "SELECT iid, title, type, description, results_disabled
FROM $tbl_exercises
WHERE c_id = $course_id AND active<>'-1' AND session_id=".$session_id."
WHERE c_id = $course_id AND active<>'-1' AND session_id = ".$session_id."
ORDER BY title ASC";
$result = Database::query($sql);
$exercises['-'] = '-'.get_lang('SelectExercise').'-';
while ($row = Database :: fetch_array($result)) {
$exercises[$row['id']] = cut($row['title'], EXERCISE_MAX_NAME_SIZE);
$exercises[$row['iid']] = cut($row['title'], EXERCISE_MAX_NAME_SIZE);
}
$form->addElement('select', 'exercise', get_lang('Exercise'), $exercises);
@ -83,7 +83,7 @@ if ($form->validate()) {
// check feedback_type from current exercise for type of question delineation
$exercise_id = intval($values['exercise']);
$sql = "SELECT feedback_type FROM $tbl_exercises WHERE c_id = $course_id AND id = '$exercise_id'";
$sql = "SELECT feedback_type FROM $tbl_exercises WHERE c_id = $course_id AND iid = $exercise_id";
$rs_feedback_type = Database::query($sql);
$row_feedback_type = Database::fetch_row($rs_feedback_type);
$feedback_type = $row_feedback_type[0];

@ -239,7 +239,7 @@ if (!$inATest) {
<div id="question_list">
';
$category_list = TestCategory::getListOfCategoriesNameForTest($objExercise->id, false);
$category_list = TestCategory::getListOfCategoriesNameForTest($objExercise->iid, false);
if (is_array($questionList)) {
foreach ($questionList as $id) {
@ -358,7 +358,7 @@ if (!$inATest) {
// Question category
$txtQuestionCat = Security::remove_XSS(
TestCategory::getCategoryNameForQuestion($objQuestionTmp->id)
TestCategory::getCategoryNameForQuestion($objQuestionTmp->iid)
);
if (empty($txtQuestionCat)) {
$txtQuestionCat = '-';

@ -55,9 +55,9 @@ if (!empty($fromExercise)) {
$nameTools = get_lang('QuestionPool');
$interbreadcrumb[] = ['url' => 'exercise.php?'.api_get_cidreq(), 'name' => get_lang('Exercises')];
if (!empty($objExercise->id)) {
if (!empty($objExercise->iid)) {
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$objExercise->id.'&'.api_get_cidreq(),
'url' => 'admin.php?exerciseId='.$objExercise->iid.'&'.api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];
}
@ -399,16 +399,16 @@ $my_exercise_list['-1'] = get_lang('OrphanQuestions');
$titleSavedAsHtml = api_get_configuration_value('save_titles_as_html');
if (is_array($exercise_list)) {
foreach ($exercise_list as $row) {
$my_exercise_list[$row['id']] = '';
if ($row['id'] == $fromExercise && $selected_course == api_get_course_int_id()) {
$my_exercise_list[$row['id']] = ">&nbsp;&nbsp;&nbsp;&nbsp;";
$my_exercise_list[$row['iid']] = '';
if ($row['iid'] == $fromExercise && $selected_course == api_get_course_int_id()) {
$my_exercise_list[$row['iid']] = ">&nbsp;&nbsp;&nbsp;&nbsp;";
}
$exerciseTitle = $row['title'];
if ($titleSavedAsHtml) {
$exerciseTitle = strip_tags(api_html_entity_decode(trim($exerciseTitle)));
}
$my_exercise_list[$row['id']] .= $exerciseTitle;
$my_exercise_list[$row['iid']] .= $exerciseTitle;
}
}
@ -626,7 +626,7 @@ function getQuestions(
if (!empty($fromExercise)) {
$currentCourseId = api_get_course_int_id();
$currentExerciseCondition = "
AND qu.id NOT IN (
AND qu.iid NOT IN (
SELECT question_id FROM $TBL_EXERCISE_QUESTION
WHERE exercice_id = $fromExercise AND c_id = $currentCourseId
)";
@ -642,18 +642,18 @@ function getQuestions(
$from = ", $TBL_COURSE_REL_CATEGORY crc ";
$where .= " AND
crc.c_id = $selected_course AND
crc.question_id = qu.id AND
crc.question_id = qu.iid AND
crc.category_id = $courseCategoryId";
}
if (isset($exerciseLevel) && -1 != $exerciseLevel) {
$where .= ' AND level='.$exerciseLevel;
$where .= ' AND level = '.$exerciseLevel;
}
if (isset($answerType) && $answerType > 0) {
$where .= ' AND type='.$answerType;
$where .= ' AND type = '.$answerType;
}
if (!empty($questionId)) {
$where .= ' AND qu.iid='.$questionId;
$where .= ' AND qu.iid = '.$questionId;
}
if (!empty($description)) {
@ -661,10 +661,10 @@ function getQuestions(
}
$select = 'DISTINCT
id,
question,
type,
level,
qu.iid,
qu.question,
qu.type,
qu.level,
qt.exercice_id exerciseId';
if ($getCount) {
$select = 'count(qu.iid) as count';
@ -673,7 +673,7 @@ function getQuestions(
FROM
$TBL_EXERCISE_QUESTION qt
INNER JOIN $TBL_QUESTIONS qu
ON qt.question_id = qu.id
ON qt.question_id = qu.iid
$from
{$efConditions['from']}
WHERE
@ -692,7 +692,7 @@ function getQuestions(
$from = '';
if (isset($courseCategoryId) && $courseCategoryId > 0) {
$from = " INNER JOIN $TBL_COURSE_REL_CATEGORY crc
ON crc.question_id = q.id AND crc.c_id = q.c_id ";
ON crc.question_id = ex.iid ";
$level_where .= " AND
crc.c_id = $selected_course AND
crc.category_id = $courseCategoryId";
@ -706,11 +706,11 @@ function getQuestions(
}
if (!empty($questionId)) {
$answer_where .= ' AND q.iid='.$questionId;
$answer_where .= ' AND ex.iid = '.$questionId;
}
if (!empty($description)) {
$answer_where .= " AND q.description LIKE '%$description%'";
$answer_where .= " AND ex.description LIKE '%$description%'";
}
$select = ' qu.*, r.exercice_id exerciseId ';
@ -723,13 +723,13 @@ function getQuestions(
SELECT $select
FROM $TBL_QUESTIONS qu
INNER JOIN $TBL_EXERCISE_QUESTION r
ON (qu.c_id = r.c_id AND qu.id = r.question_id)
ON (qu.iid = r.question_id)
INNER JOIN $TBL_EXERCISES ex
ON (ex.id = r.exercice_id AND ex.c_id = r.c_id)
ON (ex.iid = r.exercice_id)
$from
{$efConditions['from']}
WHERE
ex.c_id = '$selected_course' AND
ex.c_id = $selected_course AND
ex.active = '-1'
$level_where
$answer_where
@ -740,11 +740,11 @@ function getQuestions(
SELECT $select
FROM $TBL_QUESTIONS qu
LEFT OUTER JOIN $TBL_EXERCISE_QUESTION r
ON (qu.c_id = r.c_id AND qu.id = r.question_id)
ON (qu.iid = r.question_id)
$from
{$efConditions['from']}
WHERE
qu.c_id = '$selected_course' AND
qu.c_id = $selected_course AND
r.question_id is null
$level_where
$answer_where
@ -755,11 +755,11 @@ function getQuestions(
SELECT $select
FROM $TBL_QUESTIONS qu
INNER JOIN $TBL_EXERCISE_QUESTION r
ON (qu.c_id = r.c_id AND qu.id = r.question_id)
ON (qu.iid = r.question_id)
$from
{$efConditions['from']}
WHERE
r.c_id = '$selected_course' AND
r.c_id = $selected_course AND
(r.exercice_id = '-1' OR r.exercice_id = '0')
$level_where
$answer_where
@ -779,18 +779,18 @@ function getQuestions(
$from = ", $TBL_COURSE_REL_CATEGORY crc ";
$filter .= " AND
crc.c_id = $selected_course AND
crc.question_id = qu.id AND
crc.question_id = qu.iid AND
crc.category_id = $courseCategoryId";
}
if (isset($exerciseLevel) && -1 != $exerciseLevel) {
$filter .= ' AND level='.$exerciseLevel.' ';
$filter .= ' AND level = '.$exerciseLevel.' ';
}
if (isset($answerType) && $answerType > 0) {
$filter .= ' AND qu.type='.$answerType.' ';
$filter .= ' AND qu.type = '.$answerType.' ';
}
if (!empty($questionId)) {
$filter .= ' AND qu.iid='.$questionId;
$filter .= ' AND qu.iid = '.$questionId;
}
if (!empty($description)) {
@ -800,9 +800,9 @@ function getQuestions(
if (-1 == $session_id || empty($session_id)) {
$session_id = 0;
}
$sessionCondition = api_get_session_condition($session_id, true, 'q.session_id');
$sessionCondition = api_get_session_condition($session_id, true, 'ex.session_id');
$select = 'qu.iid, qu.id, question, qu.type, level, q.session_id, qt.exercice_id exerciseId ';
$select = 'qu.iid, question, qu.type, level, ex.session_id, qt.exercice_id exerciseId ';
if ($getCount) {
$select = 'count(qu.iid) as count';
}
@ -813,15 +813,15 @@ function getQuestions(
FROM
$TBL_QUESTIONS as qu
INNER JOIN $TBL_EXERCISE_QUESTION as qt
ON (qu.id = qt.question_id AND qu.c_id = qt.c_id)
INNER JOIN $TBL_EXERCISES as q
ON (q.c_id = qu.c_id AND q.id = qt.exercice_id)
ON (qu.iid = qt.question_id)
INNER JOIN $TBL_EXERCISES as ex
ON (ex.c_id = qu.c_id AND ex.iid = qt.exercice_id)
{$efConditions['from']}
$from
WHERE
qu.c_id = $selected_course AND
qt.c_id = $selected_course AND
q.c_id = $selected_course
ex.c_id = $selected_course
$sessionCondition
$filter
$currentExerciseCondition
@ -973,17 +973,17 @@ if (is_array($mainQuestionList)) {
foreach ($mainQuestionList as $question) {
$row = [];
// This function checks if the question can be read
$question_type = get_question_type_for_question($selected_course, $question['id']);
$question_type = get_question_type_for_question($selected_course, $question['iid']);
if (empty($question_type)) {
continue;
}
$sessionId = isset($question['session_id']) ? $question['session_id'] : null;
if (!$objExercise->hasQuestion($question['id'])) {
if (!$objExercise->hasQuestion($question['iid'])) {
$row[] = Display::input(
'checkbox',
'questions[]',
$question['id'],
$question['iid'],
['class' => 'question_checkbox']
);
} else {
@ -993,7 +993,7 @@ if (is_array($mainQuestionList)) {
$row[] = getLinkForQuestion(
$questionTagA,
$fromExercise,
$question['id'],
$question['iid'],
$question['type'],
$question['question'],
$sessionId,
@ -1001,12 +1001,12 @@ if (is_array($mainQuestionList)) {
);
$row[] = $question_type;
$row[] = TestCategory::getCategoryNameForQuestion($question['id'], $selected_course);
$row[] = TestCategory::getCategoryNameForQuestion($question['iid'], $selected_course);
$row[] = $question['level'];
$row[] = get_action_icon_for_question(
$actionIcon1,
$fromExercise,
$question['id'],
$question['iid'],
$question['type'],
$question['question'],
$selected_course,
@ -1020,7 +1020,7 @@ if (is_array($mainQuestionList)) {
get_action_icon_for_question(
$actionIcon2,
$fromExercise,
$question['id'],
$question['iid'],
$question['type'],
$question['question'],
$selected_course,
@ -1300,10 +1300,10 @@ function isQuestionInActiveQuiz($questionId)
Database::query(
"SELECT COUNT(qq.question_id) count
FROM $tblQuizRelQuestion qq
INNER JOIN $tblQuiz q
ON qq.exercice_id = q.iid
INNER JOIN $tblQuiz ex
ON qq.exercice_id = ex.iid
WHERE
q.active = 1 AND
ex.active = 1 AND
qq.question_id = $questionId"
)
);

@ -36,12 +36,12 @@ $interbreadcrumb[] = [
'name' => get_lang('Exercises'),
];
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$exercise->iId.'&'.api_get_cidreq(),
'url' => 'admin.php?exerciseId='.$exercise->iid.'&'.api_get_cidreq(),
'name' => $exercise->selectTitle(true),
];
$interbreadcrumb[] = [
'url' => 'exercise_report.php?'.api_get_cidreq().'&exerciseId='.$exercise->iId,
'url' => 'exercise_report.php?'.api_get_cidreq().'&exerciseId='.$exercise->iid,
'name' => get_lang('StudentScore'),
];
$courseId = api_get_course_int_id();

@ -142,7 +142,7 @@ function edit_category_form($action)
// setting the defaults
$defaults = [];
$defaults['category_id'] = $objcat->id;
$defaults['category_id'] = $objcat->iid;
$defaults['category_name'] = $objcat->name;
$defaults['category_description'] = $objcat->description;
$form->setDefaults($defaults);

@ -84,8 +84,8 @@ class UniqueAnswer extends Question
$defaults = [];
$correct = 0;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nb_answers = $answer->nbrAnswers;
@ -236,7 +236,7 @@ class UniqueAnswer extends Question
global $text;
$buttonGroup = [];
if (true === $obj_ex->edit_exercise_in_lp || (empty($this->exerciseList) && empty($obj_ex->id))) {
if (true === $obj_ex->edit_exercise_in_lp || (empty($this->exerciseList) && empty($obj_ex->iid))) {
//setting the save button here and not in the question class.php
$buttonGroup[] = $form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers', true);
$buttonGroup[] = $form->addButtonCreate(get_lang('PlusAnswer'), 'moreAnswers', true);
@ -264,7 +264,7 @@ class UniqueAnswer extends Question
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
if ($this->isContent == 1) {
@ -342,7 +342,7 @@ class UniqueAnswer extends Question
{
$questionWeighting = $nbrGoodAnswers = 0;
$correct = $form->getSubmitValue('correct');
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
for ($i = 1; $i <= $nb_answers; $i++) {
@ -516,7 +516,7 @@ class UniqueAnswer extends Question
$em->persist($quizAnswer);
$em->flush();
$id = $quizAnswer->getIid();
$id = $quizAnswer->getId();
if ($id) {
$quizAnswer
@ -529,7 +529,7 @@ class UniqueAnswer extends Question
if ($correct) {
$sql = "UPDATE $tbl_quiz_question
SET ponderation = (ponderation + $score)
WHERE c_id = $course_id AND id = ".$question_id;
WHERE c_id = $course_id AND iid = ".$question_id;
Database::query($sql);
}
}

@ -80,8 +80,8 @@ class UniqueAnswerNoOption extends Question
$defaults = [];
$correct = 0;
$answer = false;
if (!empty($this->id)) {
$answer = new Answer($this->id);
if (!empty($this->iid)) {
$answer = new Answer($this->iid);
$answer->read();
if ($answer->nbrAnswers > 0 && !$form->isSubmitted()) {
$nb_answers = $answer->nbrAnswers;
@ -100,7 +100,7 @@ class UniqueAnswerNoOption extends Question
$count = 1;
if (isset($_POST['lessAnswers'])) {
if (!isset($_SESSION['less_answer'])) {
$_SESSION['less_answer'] = $this->id;
$_SESSION['less_answer'] = $this->iid;
$nb_answers--;
}
}
@ -198,12 +198,12 @@ class UniqueAnswerNoOption extends Question
$i++;
}
if (empty($this->id)) {
if (empty($this->iid)) {
$form->addElement('hidden', 'new_question', 1);
}
//Adding the "I don't know" question answer
//if (empty($this -> id)) {
//if (empty($this -> iid)) {
$i = 666;
$form->addHtml('<tr>');
@ -254,7 +254,7 @@ class UniqueAnswerNoOption extends Question
global $text;
//ie6 fix
if ($obj_ex->edit_exercise_in_lp == true ||
(empty($this->exerciseList) && empty($obj_ex->id))
(empty($this->exerciseList) && empty($obj_ex->iid))
) {
//setting the save button here and not in the question class.php
$buttonGroup[] = $form->addButtonDelete(get_lang('LessAnswer'), 'lessAnswers', true);
@ -270,7 +270,7 @@ class UniqueAnswerNoOption extends Question
}
$defaults['correct'] = $correct;
if (!empty($this->id)) {
if (!empty($this->iid)) {
$form->setDefaults($defaults);
} else {
$form->setDefaults($defaults);
@ -287,7 +287,7 @@ class UniqueAnswerNoOption extends Question
{
$questionWeighting = $nbrGoodAnswers = 0;
$correct = $form->getSubmitValue('correct');
$objAnswer = new Answer($this->id);
$objAnswer = new Answer($this->iid);
$nb_answers = $form->getSubmitValue('nb_answers');
$minus = 1;
if ($form->getSubmitValue('new_question')) {
@ -300,11 +300,12 @@ class UniqueAnswerNoOption extends Question
$comment = trim($form->getSubmitValue('comment['.$i.']'));
$weighting = trim($form->getSubmitValue('weighting['.$i.']'));
$scenario = $form->getSubmitValue('scenario');
$try = $scenario['try'.$i];
$lp = $scenario['lp'.$i];
$destination = $scenario['destination'.$i];
$url = trim($scenario['url'.$i]);
if (!empty($scenario)) {
$try = $scenario['try'.$i];
$lp = $scenario['lp'.$i];
$destination = $scenario['destination'.$i];
$url = trim($scenario['url'.$i]);
}
/*
How we are going to parse the destination value
@ -346,7 +347,7 @@ class UniqueAnswerNoOption extends Question
$destination = 0;
}
if ('' == $url) {
if (empty($url)) {
$url = 0;
}

@ -35,7 +35,7 @@ switch ($action) {
if (!empty($results)) {
foreach ($results as $exercise) {
$data[] = ['id' => $exercise['id'], 'text' => html_entity_decode($exercise['title'])];
$data[] = ['id' => $exercise['iid'], 'text' => html_entity_decode($exercise['title'])];
}
}
@ -92,7 +92,7 @@ switch ($action) {
exit;
}
if ($exerciseInSession->id != $exerciseId) {
if ($exerciseInSession->iid != $exerciseId) {
if ($debug) {
error_log("Cannot update, exercise are different.");
}
@ -242,7 +242,7 @@ switch ($action) {
GROUP BY exe_user_id
) as aa
ON aa.exe_user_id = user_id
ORDER BY `$sidx` $sord
ORDER BY $sidx $sord
LIMIT $start, $limit";
$result = Database::query($sql);
@ -614,7 +614,7 @@ switch ($action) {
// Check if time is over.
if ($objExercise->expired_time != 0) {
$clockExpiredTime = ExerciseLib::get_session_time_control_key(
$objExercise->id,
$objExercise->iid,
$learnpath_id,
$learnpath_item_id
);
@ -848,7 +848,7 @@ switch ($action) {
[
'exe_id' => (int) $exeId,
'quiz' => [
'id' => (int) $objExercise->id,
'id' => (int) $objExercise->iid,
'title' => $objExercise->selectTitle(true),
],
'question' => [

@ -49,7 +49,7 @@ class ExerciseLib
$show_icon = false
) {
$course_id = $exercise->course_id;
$exerciseId = $exercise->iId;
$exerciseId = $exercise->iid;
if (empty($course_id)) {
return '';
@ -82,7 +82,7 @@ class ExerciseLib
$questionDescription = $objQuestionTmp->selectDescription();
if ($show_title) {
if ($exercise->display_category_name) {
TestCategory::displayCategoryAndTitle($objQuestionTmp->id);
TestCategory::displayCategoryAndTitle($objQuestionTmp->iid);
}
$titleToDisplay = $objQuestionTmp->getTitleToDisplay($current_item);
if ($answerType == READING_COMPREHENSION) {
@ -157,12 +157,12 @@ class ExerciseLib
$cpt1 = [];
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
$answerCorrect = $objAnswerTmp->isCorrect($answerId);
$numAnswer = $objAnswerTmp->selectAutoId($answerId);
$numAnswer = $objAnswerTmp->selectId($answerId);
if ($answerCorrect == 0) {
// options (A, B, C, ...) that will be put into the list-box
// have the "correct" field set to 0 because they are answer
$cpt1[$x] = $letter;
$answer_matching[$x] = $objAnswerTmp->selectAnswerByAutoId($numAnswer);
$answer_matching[$x] = $objAnswerTmp->selectAnswerById($numAnswer);
$x++;
$letter++;
}
@ -173,7 +173,7 @@ class ExerciseLib
$select_items[0]['letter'] = '--';
$select_items[0]['answer'] = '';
foreach ($answer_matching as $id => $value) {
$select_items[$i]['id'] = $value['id_auto'];
$select_items[$i]['id'] = $value['iid'];
$select_items[$i]['letter'] = $cpt1[$id];
$select_items[$i]['answer'] = $value['answer'];
$i++;
@ -483,7 +483,7 @@ class ExerciseLib
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
$answer = $objAnswerTmp->selectAnswer($answerId);
$answerCorrect = $objAnswerTmp->isCorrect($answerId);
$numAnswer = $objAnswerTmp->selectAutoId($answerId);
$numAnswer = $objAnswerTmp->selectId($answerId);
$comment = $objAnswerTmp->selectComment($answerId);
$attributes = [];
@ -1467,7 +1467,7 @@ HTML;
$answers = $objAnswerTmp->selectAnswerByAutoId(
$objAnswerTmp->selectAutoId($answerId)
);
$answers_hotspot[$answers['id']] = $objAnswerTmp->selectAnswer(
$answers_hotspot[$answers['iid']] = $objAnswerTmp->selectAnswer(
$answerId
);
}
@ -1515,7 +1515,7 @@ HTML;
<script>
new ".($answerType == HOT_SPOT ? "HotspotQuestion" : "DelineationQuestion")."({
questionId: $questionId,
exerciseId: {$exercise->id},
exerciseId: {$exercise->iid},
exeId: 0,
selector: '#hotspot-preview-$questionId',
'for': 'preview',
@ -1530,7 +1530,7 @@ HTML;
if (!$only_questions) {
if ($show_title) {
if ($exercise->display_category_name) {
TestCategory::displayCategoryAndTitle($objQuestionTmp->id);
TestCategory::displayCategoryAndTitle($objQuestionTmp->iid);
}
echo $objQuestionTmp->getTitleToDisplay($current_item);
}
@ -1557,7 +1557,7 @@ HOTSPOT;
$(function() {
new ".($answerType == HOT_SPOT_DELINEATION ? 'DelineationQuestion' : 'HotspotQuestion')."({
questionId: $questionId,
exerciseId: {$exercise->id},
exerciseId: {$exercise->iid},
exeId: 0,
selector: '#question_div_' + $questionId + ' .hotspot-image',
'for': 'user',
@ -1608,7 +1608,7 @@ HOTSPOT;
if (!$only_questions) {
if ($show_title) {
if ($exercise->display_category_name) {
TestCategory::displayCategoryAndTitle($objQuestionTmp->id);
TestCategory::displayCategoryAndTitle($objQuestionTmp->iid);
}
echo $objQuestionTmp->getTitleToDisplay($current_item);
}
@ -1763,7 +1763,7 @@ HOTSPOT;
$sql = " SELECT q.*, tee.*
FROM $quizTable as q
INNER JOIN $trackExerciseTable as tee
ON q.id = tee.exe_exo_id
ON q.iid = tee.exe_exo_id
INNER JOIN $courseTable c
ON c.id = tee.c_id
WHERE tee.exe_id = $exeId
@ -1801,7 +1801,7 @@ HOTSPOT;
$exercise_id = (int) $exercise_id;
$table = Database::get_course_table(TABLE_QUIZ_TEST);
$sql = "SELECT expired_time FROM $table
WHERE c_id = $course_id AND id = $exercise_id";
WHERE c_id = $course_id AND iid = $exercise_id";
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
if (!empty($row['expired_time'])) {
@ -2374,7 +2374,7 @@ HOTSPOT;
$sql = " $sql_select
FROM $TBL_EXERCICES AS ce
INNER JOIN $sql_inner_join_tbl_track_exercices AS te
ON (te.exe_exo_id = ce.id)
ON (te.exe_exo_id = ce.iid)
INNER JOIN $sql_inner_join_tbl_user AS user
ON (user.user_id = exe_user_id)
WHERE
@ -3551,7 +3551,7 @@ EOT;
} else {
// All exercises
$conditions = [
'where' => ["$sql_active_exercises (session_id = 0 OR session_id IS NULL OR session_id = ? ) AND c_id=?" => $params],
'where' => ["$sql_active_exercises (session_id = 0 OR session_id IS NULL OR session_id = ? ) AND c_id = ?" => $params],
'order' => 'title',
];
}
@ -4592,13 +4592,13 @@ EOT;
$tabCategory = GroupManager::get_category_from_group(
$tabGroups[$i]['iid']
);
if ($tabCategory["id"] != $currentCatId) {
$res .= "<option value='-1' disabled='disabled'>".$tabCategory["title"]."</option>";
$currentCatId = $tabCategory["id"];
if ($tabCategory['iid'] != $currentCatId) {
$res .= "<option value='-1' disabled='disabled'>".$tabCategory['title']."</option>";
$currentCatId = $tabCategory['iid'];
}
$res .= "<option ".$tabSelected[$tabGroups[$i]["id"]]."style='margin-left:40px' value='".
$tabGroups[$i]["id"]."'>".
$tabGroups[$i]["name"].
$res .= "<option ".$tabSelected[$tabGroups[$i]['iid']]."style='margin-left:40px' value='".
$tabGroups[$i]['iid']."'>".
$tabGroups[$i]['name'].
"</option>";
}
$res .= "</select>";
@ -4684,7 +4684,7 @@ EOT;
}
if (!empty($objExercise->getResultAccess())) {
$url = api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id;
$url = api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.api_get_cidreq().'&exerciseId='.$objExercise->iid;
echo $objExercise->returnTimeLeftDiv();
echo $objExercise->showSimpleTimeControl(
$objExercise->getResultAccessTimeDiff($exercise_stat_info),
@ -4750,7 +4750,7 @@ EOT;
if ($objExercise->attempts > 0) {
$attempts = Event::getExerciseResultsByUser(
api_get_user_id(),
$objExercise->id,
$objExercise->iid,
$courseId,
$sessionId,
$exercise_stat_info['orig_lp_id'],
@ -4870,7 +4870,7 @@ EOT;
$exerciseResult = Session::read('exerciseResult');
$exerciseResultCoordinates = Session::read('exerciseResultCoordinates');
$delineationResults = Session::read('hotspot_delineation_result');
$delineationResults = isset($delineationResults[$objExercise->id]) ? $delineationResults[$objExercise->id] : null;
$delineationResults = isset($delineationResults[$objExercise->iid]) ? $delineationResults[$objExercise->iid] : null;
}
$countPendingQuestions = 0;
@ -5294,7 +5294,7 @@ EOT;
*/
public static function displayResultsInRanking($exercise, $currentUserId, $courseId, $sessionId = 0)
{
$exerciseId = $exercise->iId;
$exerciseId = $exercise->iid;
$data = self::exerciseResultsInRanking($exerciseId, $courseId, $sessionId);
$table = new HTML_Table(['class' => 'table table-hover table-striped table-bordered']);
@ -6077,7 +6077,7 @@ EOT;
$sql = "SELECT q.question, question_id, count(q.iid) count
FROM $attemptTable t
INNER JOIN $questionTable q
ON (q.c_id = t.c_id AND q.id = t.question_id)
ON (q.iid = t.question_id)
INNER JOIN $trackTable te
ON (te.c_id = q.c_id AND t.exe_id = te.exe_id)
WHERE
@ -6100,7 +6100,7 @@ EOT;
public static function getExerciseResultsCount($type, $courseId, Exercise $exercise, $sessionId = 0)
{
$courseId = (int) $courseId;
$exerciseId = (int) $exercise->iId;
$exerciseId = (int) $exercise->iid;
$trackTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
@ -6221,7 +6221,7 @@ EOT;
// If there are no pending questions (Open questions).
if (0 === $countPendingQuestions) {
/*$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'signature_mandatory'
);
@ -6236,7 +6236,7 @@ EOT;
// Notifications.
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'notifications'
);
$exerciseNotification = '';
@ -6251,19 +6251,19 @@ EOT;
if ($exercisePassed) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'MailSuccess'
);
} else {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'MailAttempt'.$attemptCountToSend
);
}
// Blocking exercise.
$blockPercentageExtra = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'blocking_percentage'
);
$blockPercentage = false;
@ -6274,7 +6274,7 @@ EOT;
$passBlock = $stats['total_percentage'] > $blockPercentage;
if (false === $passBlock) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
'MailIsBlockByPercentage'
);
}
@ -6417,7 +6417,7 @@ EOT;
if (isset($attempt['add_pdf']) && $attempt['add_pdf']) {
// Get pdf content
$pdfExtraData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
$attempt['add_pdf']
);
@ -6451,7 +6451,7 @@ EOT;
$content = isset($attempt['content_default']) ? $attempt['content_default'] : '';
if (isset($attempt['content'])) {
$extraFieldData = $exerciseExtraFieldValue->get_values_by_handler_and_field_variable(
$objExercise->iId,
$objExercise->iid,
$attempt['content']
);
if ($extraFieldData && isset($extraFieldData['value']) && !empty($extraFieldData['value'])) {

@ -1637,6 +1637,9 @@ $_configuration['auth_password_links'] = [
// Enable recording of all answers (even temporary) in the track_e_attempt_recording table
// This requires a column to be added to the table with the following query:
// ALTER TABLE track_e_attempt_recording ADD COLUMN answer longtext default '' AFTER question_id;
// This is an experimental feature, known to create issues in the
// exercise_report.php page when wanting to grade an attempt (due to usage in
// get_exam_results_data()).
//$_configuration['quiz_answer_extra_recording'] = false;
// Disable clean results for teachers

@ -788,11 +788,11 @@ class CourseBuilder
$questionList = [];
while ($obj = Database::fetch_object($db_result)) {
if (strlen($obj->sound) > 0) {
$sql = "SELECT id FROM $table_doc
$sql = "SELECT iid FROM $table_doc
WHERE c_id = $courseId AND path = '/audio/".$obj->sound."'";
$res = Database::query($sql);
$doc = Database::fetch_object($res);
$obj->sound = $doc->id;
$obj->sound = $doc->iid;
}
$this->findAndSetDocumentsInText($obj->description);
@ -832,14 +832,14 @@ class CourseBuilder
// Building normal tests (many queries)
$sql = "SELECT * FROM $table_que
WHERE c_id = $courseId AND id IN ('$questionListToString')";
WHERE c_id = $courseId AND iid IN ('$questionListToString')";
$result = Database::query($sql);
while ($obj = Database::fetch_object($result)) {
// find the question category
// @todo : need to be adapted for multi category questions in 1.10
$question_category_id = TestCategory::getCategoryForQuestion(
$obj->id,
$obj->iid,
$courseId
);
@ -847,7 +847,7 @@ class CourseBuilder
// build the backup resource question object
$question = new QuizQuestion(
$obj->id,
$obj->iid,
$obj->question,
$obj->description,
$obj->ponderation,
@ -865,7 +865,7 @@ class CourseBuilder
$db_result2 = Database::query($sql);
while ($obj2 = Database::fetch_object($db_result2)) {
$question->add_answer(
$obj2->id,
$obj2->iid,
$obj2->answer,
$obj2->correct,
$obj2->comment,
@ -881,7 +881,7 @@ class CourseBuilder
if ($obj->type == MULTIPLE_ANSWER_TRUE_FALSE) {
$table_options = Database::get_course_table(TABLE_QUIZ_QUESTION_OPTION);
$sql = 'SELECT * FROM '.$table_options.'
WHERE c_id = '.$courseId.' AND question_id = '.$obj->id;
WHERE c_id = '.$courseId.' AND question_id = '.$obj->iid;
$db_result3 = Database::query($sql);
while ($obj3 = Database::fetch_object($db_result3)) {
$question_option = new QuizQuestionOption($obj3);
@ -929,16 +929,16 @@ class CourseBuilder
while ($obj = Database::fetch_object($result)) {
// Orphan questions
if (!empty($obj->question_id)) {
$obj->id = $obj->question_id;
$obj->iid = $obj->question_id;
}
// Avoid adding the same question twice
if (!isset($this->course->resources[$obj->id])) {
// find the question category
// @todo : need to be adapted for multi category questions in 1.10
$question_category_id = TestCategory::getCategoryForQuestion($obj->id, $courseId);
$question_category_id = TestCategory::getCategoryForQuestion($obj->iid, $courseId);
$question = new QuizQuestion(
$obj->id,
$obj->iid,
$obj->question,
$obj->description,
$obj->ponderation,
@ -956,7 +956,7 @@ class CourseBuilder
if (Database::num_rows($db_result2)) {
while ($obj2 = Database::fetch_object($db_result2)) {
$question->add_answer(
$obj2->id,
$obj2->iid,
$obj2->answer,
$obj2->correct,
$obj2->comment,
@ -966,7 +966,7 @@ class CourseBuilder
$obj2->hotspot_type
);
}
$orphanQuestionIds[] = $obj->id;
$orphanQuestionIds[] = $obj->iid;
}
$this->course->add_resource($question);
}
@ -975,7 +975,7 @@ class CourseBuilder
}
$obj = [
'id' => -1,
'iid' => -1,
'title' => get_lang('OrphanQuestions'),
'type' => 2,
];
@ -1032,7 +1032,7 @@ class CourseBuilder
$this->course->add_resource($orphan_questions);
while ($obj = Database::fetch_object($db_result)) {
$question = new QuizQuestion(
$obj->id,
$obj->iid,
$obj->question,
$obj->description,
$obj->ponderation,
@ -1048,7 +1048,7 @@ class CourseBuilder
$db_result2 = Database::query($sql);
while ($obj2 = Database::fetch_object($db_result2)) {
$question->add_answer(
$obj2->id,
$obj2->iid,
$obj2->answer,
$obj2->correct,
$obj2->comment,
@ -1086,7 +1086,7 @@ class CourseBuilder
/** @var TestCategory $category */
$courseCopyTestCategory = new CourseCopyTestCategory(
$category->id,
$category->iid,
$category->name,
$category->description
);

@ -324,7 +324,7 @@ class CourseRecycler
f.c_id = $courseId AND
i.c_id = f.c_id AND
i.tool = 'forum' AND
f.iid = i.ref AND
f.iid = i.ref AND
i.visibility = 1";
$sql = "DELETE FROM $forumCategoryTable
WHERE c_id = $courseId AND cat_id NOT IN ($subQuery)";
@ -351,7 +351,7 @@ class CourseRecycler
l.c_id = $courseId AND
i.c_id = l.c_id AND
i.tool = 'link' AND
l.iid = i.ref AND
l.iid = i.ref AND
i.visibility = 1";
$sql = "DELETE FROM $linkCategoryTable
WHERE c_id = $courseId AND id NOT IN ($subQuery)";
@ -428,7 +428,7 @@ class CourseRecycler
// Deletion of the tests first. Questions in these tests are
// not deleted and become orphan at this point
$sql = "DELETE FROM ".$table_qui."
WHERE c_id = ".$this->course_id." AND id IN(".$ids.")";
WHERE c_id = ".$this->course_id." AND iid IN(".$ids.")";
Database::query($sql);
$sql = "DELETE FROM ".$table_rel."
WHERE c_id = ".$this->course_id." AND exercice_id IN(".$ids.")";
@ -440,26 +440,26 @@ class CourseRecycler
// If this query was ever too slow, there is an alternative here:
// https://github.com/beeznest/chamilo-lms-icpna/commit/a38eab725402188dffff50245ee068d79bcef779
$sql = " (
SELECT q.id, ex.c_id FROM $table_qui_que q
SELECT q.iid, ex.c_id FROM $table_qui_que q
INNER JOIN $table_rel r
ON (q.c_id = r.c_id AND q.id = r.question_id)
ON (q.c_id = r.c_id AND q.iid = r.question_id)
INNER JOIN $table_qui ex
ON (ex.id = r.exercice_id AND ex.c_id = r.c_id)
WHERE ex.c_id = ".$this->course_id." AND (ex.active = '-1' OR ex.id = '-1')
ON (ex.iid = r.exercice_id AND ex.c_id = r.c_id)
WHERE ex.c_id = ".$this->course_id." AND (ex.active = '-1' OR ex.iid = '-1')
)
UNION
(
SELECT q.id, r.c_id FROM $table_qui_que q
SELECT q.iid, r.c_id FROM $table_qui_que q
LEFT OUTER JOIN $table_rel r
ON (q.c_id = r.c_id AND q.id = r.question_id)
ON (q.c_id = r.c_id AND q.iid = r.question_id)
WHERE q.c_id = ".$this->course_id." AND r.question_id is null
)
UNION
(
SELECT q.id, r.c_id FROM $table_qui_que q
SELECT q.iid, r.c_id FROM $table_qui_que q
INNER JOIN $table_rel r
ON (q.c_id = r.c_id AND q.id = r.question_id)
ON (q.c_id = r.c_id AND q.iid = r.question_id)
WHERE r.c_id = ".$this->course_id." AND (r.exercice_id = '-1' OR r.exercice_id = '0')
)";
$db_result = Database::query($sql);
@ -476,7 +476,7 @@ class CourseRecycler
WHERE c_id = ".$this->course_id." AND question_id IN(".$orphan_ids.")";
Database::query($sql);
$sql = "DELETE FROM ".$table_qui_que."
WHERE c_id = ".$this->course_id." AND id IN(".$orphan_ids.")";
WHERE c_id = ".$this->course_id." AND iid IN(".$orphan_ids.")";
Database::query($sql);
}
// Also delete questions categories and options

@ -1839,6 +1839,12 @@ class CourseRestorer
$table_rel = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$table_doc = Database::get_course_table(TABLE_DOCUMENT);
$resources = $this->course->resources;
// Check if the "id" column still exists
$idColumn = true;
$columns = Database::listTableColumns($table_qui);
if (!in_array('id', $columns)) {
$idColumn = false;
}
foreach ($resources[RESOURCE_QUIZ] as $id => $quiz) {
if (isset($quiz->obj)) {
@ -1929,7 +1935,7 @@ class CourseRestorer
}
$new_id = Database::insert($table_qui, $params);
if ($new_id) {
if ($new_id && $idColumn) {
$sql = "UPDATE $table_qui SET id = iid WHERE iid = $new_id";
Database::query($sql);
}
@ -1943,7 +1949,7 @@ class CourseRestorer
$order = 0;
if (!empty($quiz->question_ids)) {
foreach ($quiz->question_ids as $index => $question_id) {
$qid = $this->restore_quiz_question($question_id);
$qid = $this->restore_quiz_question($question_id, $idColumn);
$question_order = $quiz->question_orders[$index] ? $quiz->question_orders[$index] : ++$order;
$sql = "INSERT IGNORE INTO $table_rel SET
c_id = ".$this->destination_course_id.",
@ -1960,9 +1966,10 @@ class CourseRestorer
/**
* Restore quiz-questions.
*
* @params int $id question id
* @param int $id Question id
* @param bool $idColumn Whether the 'id' column still exists in this table
*/
public function restore_quiz_question($id)
public function restore_quiz_question($id, $idColumn = true)
{
$em = Database::getManager();
$resources = $this->course->resources;
@ -2019,7 +2026,7 @@ class CourseRestorer
$new_id = Database::insert($table_que, $params);
if ($new_id) {
if ($new_id && $idColumn) {
$sql = "UPDATE $table_que SET id = iid WHERE iid = $new_id";
Database::query($sql);
} else {
@ -2084,7 +2091,7 @@ class CourseRestorer
$em->persist($quizAnswer);
$em->flush();
$answerId = $quizAnswer->getIid();
$answerId = $quizAnswer->getId();
if ($answerId) {
$quizAnswer
@ -2133,8 +2140,13 @@ class CourseRestorer
$answerId = Database::insert($table_ans, $params);
if ($answerId) {
$sql = "UPDATE $table_ans SET id = iid, id_auto = iid WHERE iid = $answerId";
Database::query($sql);
if ($idColumn) {
$sql = "UPDATE $table_ans SET id = iid, id_auto = iid WHERE iid = $answerId";
Database::query($sql);
} else {
$sql = "UPDATE $table_ans SET id_auto = iid WHERE iid = $answerId";
Database::query($sql);
}
}
$correctAnswers[$answerId] = $answer['correct'];
@ -2153,15 +2165,18 @@ class CourseRestorer
if ($question_option_list) {
$old_option_ids = [];
foreach ($question_option_list as $item) {
$old_id = $item['id'];
unset($item['id']);
if (isset($item['iid'])) {
$old_id = $item['iid'];
unset($item['iid']);
unset($item['id']);
} else {
$old_id = $item['id'];
unset($item['id']);
}
$item['question_id'] = $new_id;
$item['c_id'] = $this->destination_course_id;
$question_option_id = Database::insert($table_options, $item);
if ($question_option_id) {
if ($question_option_id && $idColumn) {
$old_option_ids[$old_id] = $question_option_id;
$sql = "UPDATE $table_options SET id = iid WHERE iid = $question_option_id";
Database::query($sql);
@ -2223,7 +2238,7 @@ class CourseRestorer
$table_ans,
$params,
[
'id = ? AND c_id = ? AND question_id = ? ' => [
'iid = ? AND c_id = ? AND question_id = ? ' => [
$answer_id,
$this->destination_course_id,
$new_id,
@ -2255,7 +2270,7 @@ class CourseRestorer
$table_ans,
$params,
[
'id = ? AND c_id = ? AND question_id = ? ' => [
'iid = ? AND c_id = ? AND question_id = ? ' => [
$answer_id,
$this->destination_course_id,
$new_id,

@ -31,6 +31,7 @@ class CQuiz
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="c_id", type="integer")
*/
protected $cId;
@ -38,6 +39,7 @@ class CQuiz
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="id", type="integer", nullable=true)
*/
protected $id;
@ -751,13 +753,13 @@ class CQuiz
/**
* Set id.
*
* @param int $id
* @param int $iid
*
* @return CQuiz
*/
public function setId($id)
public function setId($iid)
{
$this->id = $id;
$this->iid = $iid;
return $this;
}
@ -769,7 +771,7 @@ class CQuiz
*/
public function getId()
{
return $this->id;
return $this->iid;
}
/**
@ -835,24 +837,4 @@ class CQuiz
return $this;
}
/**
* @return int
*/
public function getIid()
{
return $this->iid;
}
/**
* @param int $iid
*
* @return CQuiz
*/
public function setIid($iid)
{
$this->iid = $iid;
return $this;
}
}

@ -45,6 +45,7 @@ class CQuizAnswer
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="id", type="integer", nullable=true)
*/
protected $id;
@ -121,7 +122,7 @@ class CQuizAnswer
public function __construct()
{
$this->id = null;
$this->iid = null;
$this->idAuto = 0;
$this->correct = null;
$this->comment = null;
@ -133,15 +134,15 @@ class CQuizAnswer
}
/**
* Set id.
* Set iid.
*
* @param int $id
* @param int $iid
*
* @return CQuizAnswer
*/
public function setId($id)
public function setId($iid)
{
$this->id = $id;
$this->iid = $iid;
return $this;
}
@ -153,7 +154,7 @@ class CQuizAnswer
*/
public function getId()
{
return $this->id;
return $this->iid;
}
/**
@ -443,14 +444,4 @@ class CQuizAnswer
{
return $this->cId;
}
/**
* Get iid.
*
* @return int
*/
public function getIid()
{
return $this->iid;
}
}

@ -38,6 +38,7 @@ class CQuizQuestion
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="id", type="integer", nullable=true)
*/
protected $id;
@ -332,13 +333,13 @@ class CQuizQuestion
/**
* Set id.
*
* @param int $id
* @param int $iid
*
* @return CQuizQuestion
*/
public function setId($id)
public function setId($iid)
{
$this->id = $id;
$this->iid = $iid;
return $this;
}
@ -350,7 +351,7 @@ class CQuizQuestion
*/
public function getId()
{
return $this->id;
return $this->iid;
}
/**
@ -376,14 +377,4 @@ class CQuizQuestion
{
return $this->cId;
}
/**
* Get iid.
*
* @return int
*/
public function getIid()
{
return $this->iid;
}
}

@ -37,6 +37,7 @@ class CQuizQuestionCategory
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="id", type="integer", nullable=true)
*/
protected $id;
@ -106,13 +107,13 @@ class CQuizQuestionCategory
/**
* Set id.
*
* @param int $id
* @param int $iid
*
* @return CQuizQuestionCategory
*/
public function setId($id)
public function setId($iid)
{
$this->id = $id;
$this->iid = $iid;
return $this;
}
@ -124,7 +125,7 @@ class CQuizQuestionCategory
*/
public function getId()
{
return $this->id;
return $this->iid;
}
/**

@ -37,6 +37,7 @@ class CQuizQuestionOption
/**
* @var int
*
* @deprecated Now using iid
* @ORM\Column(name="id", type="integer", nullable=true)
*/
protected $id;
@ -137,13 +138,13 @@ class CQuizQuestionOption
/**
* Set id.
*
* @param int $id
* @param int $iid
*
* @return CQuizQuestionOption
*/
public function setId($id)
public function setId($iid)
{
$this->id = $id;
$this->iid = $iid;
return $this;
}
@ -155,7 +156,7 @@ class CQuizQuestionOption
*/
public function getId()
{
return $this->id;
return $this->iid;
}
/**
@ -181,24 +182,4 @@ class CQuizQuestionOption
{
return $this->cId;
}
/**
* @return int
*/
public function getIid()
{
return $this->iid;
}
/**
* @param int $iid
*
* @return CQuizQuestionOption
*/
public function setIid($iid)
{
$this->iid = $iid;
return $this;
}
}

Loading…
Cancel
Save