Internal - Fix queries, fix translations, fix exercise CRUD

pull/3543/head
Julio Montoya 5 years ago
parent 221f68727e
commit d89cd9ac5a
  1. 3
      public/main/exercise/TestCategory.php
  2. 2
      public/main/exercise/UniqueAnswerImage.php
  3. 2
      public/main/exercise/exercise_reminder.php
  4. 32
      public/main/exercise/exercise_report.php
  5. 2
      public/main/exercise/exercise_result.php
  6. 6
      public/main/exercise/exercise_show.php
  7. 2
      public/main/exercise/live_stats.php
  8. 2
      public/main/exercise/question_create.php
  9. 68
      public/main/exercise/question_pool.php
  10. 2
      public/main/exercise/stats.php
  11. 10
      public/main/exercise/unique_answer_no_option.class.php
  12. 22
      public/main/inc/lib/exercise.lib.php
  13. 2
      public/main/inc/lib/pear/HTML/QuickForm/radio.php
  14. 7
      src/CoreBundle/Entity/TrackEAttemptRecording.php
  15. 6
      src/CourseBundle/Entity/CQuiz.php
  16. 12
      src/CourseBundle/Entity/CQuizQuestionCategory.php

@ -161,7 +161,7 @@ class TestCategory
$courseId = api_get_course_int_id();
$categories = self::getCategories($courseId);
$result = ['0' => get_lang('GeneralSelected')];
$result = ['0' => get_lang('No category selected')];
foreach ($categories as $category) {
$result[$category->getIid()] = $category->getTitle();
}
@ -1131,7 +1131,6 @@ class TestCategory
{
$course = api_get_course_entity($courseId);
$session = api_get_session_entity($sessionId);
$repo = Container::getQuestionCategoryRepository();
$sessionId = (int) $sessionId;
$categories = $this->getCategories($courseId, $sessionId);

@ -277,7 +277,7 @@ class UniqueAnswerImage extends UniqueAnswer
$answerNumber = $form->addElement('text', 'counter['.$i.']', null, ' value = "'.$i.'"');
$answerNumber->freeze();
$form->addElement('radio', 'correct', null, null, $i, 'class="checkbox"');
$form->addElement('radio', 'correct', null, null, $i, ['class' => 'checkbox']);
$form->addHtmlEditor('answer['.$i.']', null, null, false, $editorConfig);
$form->addRule('answer['.$i.']', get_lang('Required field'), 'required');

@ -31,7 +31,7 @@ if (!empty($exerciseInSession)) {
if (!$objExercise) {
// Redirect to the exercise overview
// Check if the exe_id exists
header('Location: '.api_get_path(WEB_CODE_PATH).'exercise/overview.php?exerciseId='.$exerciseId.'&'.api_get_cidreq());
header('Location: '.api_get_path(WEB_CODE_PATH).'exercise/overview.php?id='.$exerciseId.'&'.api_get_cidreq());
exit;
}

@ -10,6 +10,9 @@
*
* @todo fix excel export
*/
use Chamilo\CoreBundle\Entity\TrackEAttemptRecording;
require_once __DIR__.'/../inc/global.inc.php';
$htmlHeadXtra[] = api_get_jqgrid_js();
@ -159,13 +162,14 @@ if (isset($_REQUEST['comments']) &&
if (empty($track_exercise_info)) {
api_not_allowed();
}
$student_id = $track_exercise_info['exe_user_id'];
$session_id = $track_exercise_info['session_id'];
$lp_id = $track_exercise_info['orig_lp_id'];
$lpItemId = $track_exercise_info['orig_lp_item_id'];
$lp_item_view_id = (int) $track_exercise_info['orig_lp_item_view_id'];
$exerciseId = $track_exercise_info['exe_exo_id'];
$exeWeighting = $track_exercise_info['exe_weighting'];
$exeWeighting = $track_exercise_info['max_score'];
$post_content_id = [];
$comments_exist = false;
@ -186,7 +190,7 @@ if (isset($_REQUEST['comments']) &&
}
for ($i = 0; $i < $loop_in_track; $i++) {
$my_marks = isset($_POST['marks_'.$array_content_id_exe[$i]]) ? $_POST['marks_'.$array_content_id_exe[$i]] : '';
$my_marks = isset($_POST['marks_'.$array_content_id_exe[$i]]) ? $_POST['marks_'.$array_content_id_exe[$i]] : 0;
$my_comments = '';
if (isset($_POST['comments_'.$array_content_id_exe[$i]])) {
$my_comments = $_POST['comments_'.$array_content_id_exe[$i]];
@ -203,15 +207,29 @@ if (isset($_REQUEST['comments']) &&
['question_id = ? AND exe_id = ?' => [$my_questionid, $id]]
);
$params = [
'exe_id' => $id,
'question_id' => $my_questionid,
$recording = new TrackEAttemptRecording();
$recording
->setExeId($id)
->setQuestionId($my_questionid)
->setAuthor(api_get_user_id())
->setTeacherComment($my_comments)
->setExeId($id)
->setMarks($my_marks)
->setSessionId(api_get_session_id())
;
$em = Database::getManager();
$em->persist($recording);
$em->flush();
/*$params = [
'marks' => $my_marks,
'insert_date' => api_get_utc_datetime(),
//'insert_date' => api_get_utc_datetime(),
'author' => api_get_user_id(),
'teacher_comment' => $my_comments,
'session_id' => api_get_session_id(),
];
Database::insert($TBL_TRACK_ATTEMPT_RECORDING, $params);
Database::insert($TBL_TRACK_ATTEMPT_RECORDING, $params);*/
}
$useEvaluationPlugin = false;

@ -43,7 +43,7 @@ if (empty($objExercise)) {
$objExercise = new Exercise();
$exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id);
if (!empty($exercise_stat_info) && isset($exercise_stat_info['exe_exo_id'])) {
header('Location: overview.php?exerciseId='.$exercise_stat_info['exe_exo_id'].'&'.api_get_cidreq());
header('Location: overview.php?id='.$exercise_stat_info['exe_exo_id'].'&'.api_get_cidreq());
exit;
}
api_not_allowed(true);

@ -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'];
@ -152,7 +152,7 @@ $interbreadcrumb[] = [
'name' => get_lang('Tests'),
];
$interbreadcrumb[] = [
'url' => 'overview.php?exerciseId='.$exercise_id.'&'.api_get_cidreq(),
'url' => 'overview.php?id='.$exercise_id.'&'.api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Result')];
@ -333,7 +333,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

@ -24,7 +24,7 @@ $interbreadcrumb[] = [
'name' => get_lang('Tests'),
];
$interbreadcrumb[] = [
'url' => "admin.php?exerciseId=$exercise_id&".api_get_cidreq(),
'url' => "admin.php?id=$exercise_id&".api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];

@ -94,7 +94,7 @@ if ($form->validate()) {
header('Location: question_create.php?'.api_get_cidreq().'&error=true');
exit;
}
header('Location: admin.php?exerciseId='.$values['exercise'].'&newQuestion=yes&isContent='.$values['is_content'].'&answerType='.$answer_type);
header('Location: admin.php?id='.$values['exercise'].'&newQuestion=yes&isContent='.$values['is_content'].'&answerType='.$answer_type);
exit;
} else {
// header

@ -19,7 +19,6 @@ require_once __DIR__.'/../inc/global.inc.php';
api_protect_course_script(true);
$this_section = SECTION_COURSES;
$is_allowedToEdit = api_is_allowed_to_edit(null, true);
$delete = isset($_GET['delete']) ? (int) $_GET['delete'] : null;
@ -56,7 +55,7 @@ $interbreadcrumb[] = ['url' => 'exercise.php?'.api_get_cidreq(), 'name' => get_l
if (!empty($objExercise->id)) {
$interbreadcrumb[] = [
'url' => 'admin.php?exerciseId='.$objExercise->id.'&'.api_get_cidreq(),
'url' => 'admin.php?id='.$objExercise->id.'&'.api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];
}
@ -306,7 +305,7 @@ if (isset($fromExercise) && $fromExercise > 0) {
} else {
echo '<a href="exercise.php?'.api_get_cidreq().'">'.
Display::return_icon('back.png', get_lang('BackToTestsList'), '', ICON_SIZE_MEDIUM).'</a>';
echo "<a href='admin.php?exerciseId=0'>".
echo "<a href='admin.php?id=0'>".
Display::return_icon('add_question.gif', get_lang('New question'), '', ICON_SIZE_MEDIUM).'</a>';
$titleAdd = get_lang('Manage all questions');
}
@ -408,16 +407,16 @@ $my_exercise_list['-1'] = get_lang('Orphan questions');
$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;
}
}
@ -635,7 +634,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
)";
@ -651,7 +650,7 @@ 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) {
@ -670,7 +669,7 @@ function getQuestions(
}
$select = 'DISTINCT
id,
iid,
question,
type,
level,
@ -680,9 +679,9 @@ function getQuestions(
}
$sql = "SELECT $select
FROM
$TBL_EXERCISE_QUESTION qt
INNER JOIN $TBL_QUESTIONS qu
ON qt.question_id = qu.id
$TBL_EXERCISE_QUESTION qt
INNER JOIN $TBL_QUESTIONS qu
ON qt.question_id = qu.iid
$from
{$efConditions['from']}
WHERE
@ -701,7 +700,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 = q.iid AND crc.c_id = q.c_id ";
$level_where .= " AND
crc.c_id = $selected_course AND
crc.category_id = $courseCategoryId";
@ -732,7 +731,7 @@ 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.c_id = r.c_id AND qu.iid = r.question_id)
INNER JOIN $TBL_EXERCISES ex
ON (ex.id = r.exercice_id AND ex.c_id = r.c_id)
$from
@ -749,7 +748,7 @@ 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.c_id = r.c_id AND qu.iid = r.question_id)
$from
{$efConditions['from']}
WHERE
@ -764,7 +763,7 @@ 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.c_id = r.c_id AND qu.iid = r.question_id)
$from
{$efConditions['from']}
WHERE
@ -788,7 +787,7 @@ 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) {
@ -811,7 +810,7 @@ function getQuestions(
}
$sessionCondition = api_get_session_condition($session_id, true, 'q.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, q.session_id, qt.exercice_id exerciseId ';
if ($getCount) {
$select = 'count(qu.iid) as count';
}
@ -822,9 +821,9 @@ 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)
ON (qu.iid = 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 (q.c_id = qu.c_id AND q.iid = qt.exercice_id)
{$efConditions['from']}
$from
WHERE
@ -980,19 +979,20 @@ if ($fromExercise <= 0) {
$data = [];
if (is_array($mainQuestionList)) {
foreach ($mainQuestionList as $question) {
$questionId = $question['iid'];
$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, $questionId);
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'],
$questionId,
['class' => 'question_checkbox']
);
} else {
@ -1002,7 +1002,7 @@ if (is_array($mainQuestionList)) {
$row[] = getLinkForQuestion(
$questionTagA,
$fromExercise,
$question['id'],
$questionId,
$question['type'],
$question['question'],
$sessionId,
@ -1010,12 +1010,12 @@ if (is_array($mainQuestionList)) {
);
$row[] = $question_type;
$row[] = TestCategory::getCategoryNameForQuestion($question['id'], $selected_course);
$row[] = TestCategory::getCategoryNameForQuestion($questionId, $selected_course);
$row[] = $question['level'];
$row[] = get_action_icon_for_question(
$actionIcon1,
$fromExercise,
$question['id'],
$questionId,
$question['type'],
$question['question'],
$selected_course,
@ -1029,7 +1029,7 @@ if (is_array($mainQuestionList)) {
get_action_icon_for_question(
$actionIcon2,
$fromExercise,
$question['id'],
$questionId,
$question['type'],
$question['question'],
$selected_course,
@ -1045,12 +1045,12 @@ if (is_array($mainQuestionList)) {
}
$headers = [
'',
get_lang('QuestionUpperCaseFirstLetter'),
get_lang('Type'),
'',
get_lang('Question'),
get_lang('Type'),
get_lang('QuestionCategory'),
get_lang('Difficulty'),
$actionLabel,
get_lang('Difficulty'),
$actionLabel,
];
echo $pagination;
@ -1080,7 +1080,7 @@ foreach ($data as $rows) {
$row,
$column,
$value
);
);
$column++;
}
$row++;

@ -310,7 +310,7 @@ $interbreadcrumb[] = [
'name' => get_lang('Tests'),
];
$interbreadcrumb[] = [
'url' => "admin.php?exerciseId=$exerciseId&".api_get_cidreq(),
'url' => "admin.php?id=$exerciseId&".api_get_cidreq(),
'name' => $objExercise->selectTitle(true),
];

@ -186,9 +186,15 @@ class UniqueAnswerNoOption extends Question
$answer_number = $form->addElement('text', 'counter['.$i.']', null, 'value="'.$i.'"');
$answer_number->freeze();
$form->addElement('radio', 'correct', null, null, $i, 'class="checkbox" style="margin-left: 0em;"');
$form->addElement(
'radio',
'correct',
null,
null,
$i,
['class' => 'checkbox', 'style' => 'margin-left: 0em;']
);
$form->addElement('html_editor', 'answer['.$i.']', null, [], $editor_config);
$form->addElement('html_editor', 'comment['.$i.']', null, [], $editor_config);
$form->addElement('text', 'weighting['.$i.']', null, ['style' => 'width: 60px;', 'value' => '0']);
$form->addElement('html', '</tr>');

@ -1897,7 +1897,7 @@ HOTSPOT;
$sql_inner_join_tbl_user = "
(
SELECT
u.user_id,
u.id as user_id,
firstname,
lastname,
official_code,
@ -1907,7 +1907,7 @@ HOTSPOT;
g.id as group_id
FROM $TBL_USER u
INNER JOIN $TBL_GROUP_REL_USER gru
ON (gru.user_id = u.user_id AND gru.c_id= $course_id )
ON (gru.user_id = u.id AND gru.c_id= $course_id )
INNER JOIN $TBL_GROUP g
ON (gru.group_id = g.id AND g.c_id= $course_id )
)";
@ -1933,7 +1933,7 @@ HOTSPOT;
$sql_inner_join_tbl_user = "
(
SELECT
u.user_id,
u.id as user_id,
firstname,
lastname,
official_code,
@ -1960,17 +1960,17 @@ HOTSPOT;
$sql_inner_join_tbl_user = "
(
SELECT
u.user_id,
u.id as user_id,
firstname,
lastname,
official_code,
email,
username,
g.name as group_name,
g.id as group_id
g.iid as group_id
FROM $TBL_USER u
LEFT OUTER JOIN $TBL_GROUP_REL_USER gru
ON ( gru.user_id = u.user_id AND gru.c_id= $course_id )
ON (gru.user_id = u.id AND gru.c_id= $course_id )
LEFT OUTER JOIN $TBL_GROUP g
ON (gru.group_id = g.id AND g.c_id = $course_id )
)";
@ -1982,7 +1982,7 @@ HOTSPOT;
$is_empty_sql_inner_join_tbl_user = true;
$sql_inner_join_tbl_user = "
(
SELECT u.user_id, firstname, lastname, email, username, ' ' as group_name, '' as group_id, official_code
SELECT u.id as user_id, firstname, lastname, email, username, ' ' as group_name, '' as group_id, official_code
FROM $TBL_USER u
WHERE u.status NOT IN(".api_get_users_status_ignored_in_reports('string').")
)";
@ -1996,7 +1996,7 @@ HOTSPOT;
$sql_select = 'SELECT count(te.exe_id) ';
} else {
$sql_select = "SELECT DISTINCT
user_id,
user.user_id,
$first_and_last_name,
official_code,
ce.title,
@ -2024,9 +2024,9 @@ 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.id = exe_user_id)
ON (user.user_id = exe_user_id)
WHERE
te.c_id = $course_id $session_id_and AND
ce.active <> -1 AND
@ -3859,7 +3859,7 @@ EOT;
if (empty($session_id)) {
$courseCondition = "
INNER JOIN $courseUser cu
ON cu.c_id = c.id AND cu.user_id = exe_user_id";
ON cu.c_id = c.id AND cu.user_id = exe_user_id";
$courseConditionWhere = " AND relation_type <> 2 AND cu.status = ".STUDENT;
} else {
$courseCondition = "

@ -54,7 +54,7 @@ class HTML_QuickForm_radio extends HTML_QuickForm_input
$elementLabel = null,
$text = null,
$value = null,
array $attributes = []
$attributes = []
) {
$this->labelClass = isset($attributes['label-class']) ? $attributes['label-class'] : '';
$this->radioClass = isset($attributes['radio-class']) ? $attributes['radio-class'] : 'form-check';

@ -5,6 +5,7 @@
namespace Chamilo\CoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* TrackEAttemptRecording.
@ -51,6 +52,7 @@ class TrackEAttemptRecording
/**
* @var \DateTime
* @Gedmo\Timestampable(on="create")
*
* @ORM\Column(name="insert_date", type="datetime", nullable=false)
*/
@ -77,6 +79,11 @@ class TrackEAttemptRecording
*/
protected $sessionId;
public function __construct()
{
$this->sessionId = 0;
}
/**
* Set exeId.
*

@ -250,7 +250,7 @@ class CQuiz extends AbstractResource implements ResourceInterface
protected $autoLaunch;
/**
* @var int
* @var array
*
* @ORM\Column(name="page_result_configuration", type="array", nullable=true)
*/
@ -955,12 +955,12 @@ class CQuiz extends AbstractResource implements ResourceInterface
return $this;
}
public function getPageResultConfiguration(): int
public function getPageResultConfiguration(): array
{
return $this->pageResultConfiguration;
}
public function setPageResultConfiguration(int $pageResultConfiguration): self
public function setPageResultConfiguration($pageResultConfiguration): self
{
$this->pageResultConfiguration = $pageResultConfiguration;

@ -191,21 +191,21 @@ class CQuizQuestionCategory extends AbstractResource implements ResourceInterfac
}
/**
* @return CQuizQuestionCategory[]
* @return CQuizQuestion[]|Collection
*/
public function getQuestionCategories()
public function getQuestions()
{
return $this->questionCategories;
return $this->questions;
}
/**
* @param CQuizQuestionCategory[] $questionCategories
* @param CQuizQuestion[]|Collection $questions
*
* @return CQuizQuestionCategory
*/
public function setQuestionCategories($questionCategories): self
public function setQuestions($questions)
{
$this->questionCategories = $questionCategories;
$this->questions = $questions;
return $this;
}

Loading…
Cancel
Save