Add quiz category table see BT#10052

ofaj
jmontoyaa 9 years ago
parent c6de28f856
commit c6c019b9c7
  1. 2
      app/Migrations/Schema/V111/Version111.php
  2. 162
      main/exercice/exercise.class.php
  3. 7
      src/Chamilo/CourseBundle/Entity/CQuiz.php
  4. 142
      src/Chamilo/CourseBundle/Entity/CQuizCategory.php

@ -45,6 +45,8 @@ class Version111 extends AbstractMigrationChamilo
$this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('configure_exercise_visibility_in_course','false','No') "); $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('configure_exercise_visibility_in_course','false','No') ");
$this->addSql("ALTER TABLE c_forum_forum ADD moderated TINYINT(1) DEFAULT NULL"); $this->addSql("ALTER TABLE c_forum_forum ADD moderated TINYINT(1) DEFAULT NULL");
$this->addSql("ALTER TABLE c_forum_post ADD status INT DEFAULT NULL"); $this->addSql("ALTER TABLE c_forum_post ADD status INT DEFAULT NULL");
$this->addSql("CREATE TABLE c_quiz_rel_category (iid BIGINT AUTO_INCREMENT NOT NULL, c_id INT NOT NULL, category_id INT NOT NULL, exercise_id INT NOT NULL, count_questions INT NOT NULL, PRIMARY KEY(iid))");
$this->addSql("ALTER TABLE c_quiz ADD COLUMN question_selection_type INT");
$table = $schema->getTable('session_rel_user'); $table = $schema->getTable('session_rel_user');
if (!$table->hasColumn('duration')) { if (!$table->hasColumn('duration')) {

@ -68,10 +68,7 @@ class Exercise
public $emailAlert; public $emailAlert;
public $notifyUserByEmail = 0; public $notifyUserByEmail = 0;
public $sessionId = 0; public $sessionId = 0;
public $specialCategoryOrders = false;
public $quizRelCategoryTable = false; public $quizRelCategoryTable = false;
// CREATE TABLE c_quiz_rel_category (iid BIGINT AUTO_INCREMENT NOT NULL, c_id INT NOT NULL, category_id INT NOT NULL, exercise_id INT NOT NULL, count_questions INT NOT NULL, PRIMARY KEY(iid));
// ALTER TABLE c_quiz ADD COLUMN question_selection_type INT;
/** /**
* Constructor of the class * Constructor of the class
@ -114,7 +111,6 @@ class Exercise
} }
$this->course_id = $course_info['real_id']; $this->course_id = $course_info['real_id'];
$this->course = $course_info; $this->course = $course_info;
$this->specialCategoryOrders = api_get_configuration_value('exercise_enable_category_order');
} }
/** /**
@ -436,25 +432,15 @@ class Exercise
*/ */
public function updateRandomByCat($random) public function updateRandomByCat($random)
{ {
if ($this->specialCategoryOrders) { if (in_array($random, array(
if (in_array($random, array( EXERCISE_CATEGORY_RANDOM_SHUFFLED,
EXERCISE_CATEGORY_RANDOM_SHUFFLED, EXERCISE_CATEGORY_RANDOM_ORDERED,
EXERCISE_CATEGORY_RANDOM_ORDERED, EXERCISE_CATEGORY_RANDOM_DISABLED
EXERCISE_CATEGORY_RANDOM_DISABLED )
) )) {
)) { $this->randomByCat = $random;
$this->randomByCat = $random;
} else {
$this->randomByCat = EXERCISE_CATEGORY_RANDOM_DISABLED;
}
} else { } else {
if ($random == 1) { $this->randomByCat = EXERCISE_CATEGORY_RANDOM_DISABLED;
$this->randomByCat = 1;
} else if ($random == 2) {
$this->randomByCat = 2;
} else {
$this->randomByCat = 0;
}
} }
} }
@ -1094,84 +1080,38 @@ class Exercise
*/ */
public function selectQuestionList($from_db = false) public function selectQuestionList($from_db = false)
{ {
if ($this->specialCategoryOrders == false) { if ($from_db && !empty($this->id)) {
if ($from_db && !empty($this->id)) { $nbQuestions = $this->getQuestionCount();
$TBL_EXERCISE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $questionSelectionType = $this->getQuestionSelectionType();
$TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION);
$sql = "SELECT DISTINCT e.question_order
FROM $TBL_EXERCISE_QUESTION e
INNER JOIN $TBL_QUESTIONS q
ON (e.question_id = q.id AND e.c_id = ".$this->course_id." AND q.c_id = ".$this->course_id.")
WHERE e.exercice_id = ".intval($this->id);
$result = Database::query($sql);
$count_question_orders = Database::num_rows($result);
$sql = "SELECT DISTINCT e.question_id, e.question_order
FROM $TBL_EXERCISE_QUESTION e
INNER JOIN $TBL_QUESTIONS q
ON (e.question_id= q.id AND e.c_id = ".$this->course_id." AND q.c_id = ".$this->course_id.")
WHERE e.exercice_id = ".intval($this->id)."
ORDER BY question_order";
$result = Database::query($sql);
// fills the array with the question ID for this exercise
// the key of the array is the question position
$temp_question_list = array();
$counter = 1;
$question_list = array();
while ($new_object = Database::fetch_object($result)) {
$question_list[$new_object->question_order]= $new_object->question_id;
$temp_question_list[$counter] = $new_object->question_id;
$counter++;
}
if (!empty($temp_question_list)) { switch ($questionSelectionType) {
if (count($temp_question_list) != $count_question_orders) { case EX_Q_SELECTION_ORDERED:
$question_list = $temp_question_list; $questionList = $this->getQuestionOrderedList();
break;
case EX_Q_SELECTION_RANDOM:
// Not a random exercise, or if there are not at least 2 questions
if ($this->random == 0 || $nbQuestions < 2) {
$questionList = $this->getQuestionOrderedList();
} else {
$questionList = $this->selectRandomList();
} }
} break;
default:
return $question_list; $questionList = $this->getQuestionOrderedList();
$result = $this->getQuestionListWithCategoryListFilteredByCategorySettings(
$questionList,
$questionSelectionType
);
$this->categoryWithQuestionList = $result['category_with_questions_list'];
$questionList = $result['question_list'];
break;
} }
return $this->questionList; return $questionList;
} else { }
if ($from_db && !empty($this->id)) {
$nbQuestions = $this->getQuestionCount();
$questionSelectionType = $this->getQuestionSelectionType();
switch ($questionSelectionType) { return $this->questionList;
case EX_Q_SELECTION_ORDERED:
$questionList = $this->getQuestionOrderedList();
break;
case EX_Q_SELECTION_RANDOM:
// Not a random exercise, or if there are not at least 2 questions
if ($this->random == 0 || $nbQuestions < 2) {
$questionList = $this->getQuestionOrderedList();
} else {
$questionList = $this->selectRandomList();
}
break;
default:
$questionList = $this->getQuestionOrderedList();
$result = $this->getQuestionListWithCategoryListFilteredByCategorySettings(
$questionList,
$questionSelectionType
);
$this->categoryWithQuestionList = $result['category_with_questions_list'];
$questionList = $result['question_list'];
break;
}
return $questionList;
}
return $this->questionList;
}
} }
/** /**
@ -1639,15 +1579,12 @@ class Exercise
'display_category_name' => $display_category_name, 'display_category_name' => $display_category_name,
'pass_percentage' => $pass_percentage, 'pass_percentage' => $pass_percentage,
'results_disabled' => $results_disabled, 'results_disabled' => $results_disabled,
'question_selection_type' => $this->getQuestionSelectionType()
]; ];
} }
$params = array_merge($params, $paramsExtra); $params = array_merge($params, $paramsExtra);
if ($this->specialCategoryOrders) {
$params['question_selection_type'] = intval($this->getQuestionSelectionType());
}
Database::update( Database::update(
$TBL_EXERCISES, $TBL_EXERCISES,
$params, $params,
@ -1716,12 +1653,10 @@ class Exercise
$sql = "UPDATE $TBL_EXERCISES SET id = iid WHERE iid = {$this->id} "; $sql = "UPDATE $TBL_EXERCISES SET id = iid WHERE iid = {$this->id} ";
Database::query($sql); Database::query($sql);
if ($this->quizRelCategoryTable) { $sql = "UPDATE $TBL_EXERCICES
$sql = "UPDATE $TBL_EXERCICES SET question_selection_type= ".intval($this->getQuestionSelectionType())."
SET question_selection_type= ".intval($this->getQuestionSelectionType())." WHERE id = ".$this->id." AND c_id = ".$this->course_id;
WHERE id = ".$this->id." AND c_id = ".$this->course_id; Database::query($sql);
Database::query($sql);
}
// insert into the item_property table // insert into the item_property table
api_item_property_update( api_item_property_update(
@ -2007,7 +1942,7 @@ class Exercise
} }
} }
if ($this->specialCategoryOrders) { if (true) {
$option = array( $option = array(
EX_Q_SELECTION_ORDERED => get_lang('OrderedByUser'), EX_Q_SELECTION_ORDERED => get_lang('OrderedByUser'),
// defined by user // defined by user
@ -2131,7 +2066,7 @@ class Exercise
} else { } else {
// number of random question // number of random question
/*
$max = ($this->id > 0) ? $this->selectNbrQuestions() : 10 ; $max = ($this->id > 0) ? $this->selectNbrQuestions() : 10 ;
$option = range(0, $max); $option = range(0, $max);
$option[0] = get_lang('No'); $option[0] = get_lang('No');
@ -2157,7 +2092,7 @@ class Exercise
$radio_display_cat_name = array(); $radio_display_cat_name = array();
$radio_display_cat_name[] = $form->createElement('radio', 'display_category_name', null, get_lang('Yes'), '1'); $radio_display_cat_name[] = $form->createElement('radio', 'display_category_name', null, get_lang('Yes'), '1');
$radio_display_cat_name[] = $form->createElement('radio', 'display_category_name', null, get_lang('No'), '0'); $radio_display_cat_name[] = $form->createElement('radio', 'display_category_name', null, get_lang('No'), '0');
$form->addGroup($radio_display_cat_name, null, get_lang('QuestionDisplayCategoryName'), ''); $form->addGroup($radio_display_cat_name, null, get_lang('QuestionDisplayCategoryName'), '');*/
} }
// Attempts // Attempts
$attempt_option = range(0, 10); $attempt_option = range(0, 10);
@ -6252,9 +6187,6 @@ class Exercise
*/ */
public function get_categories_in_exercise() public function get_categories_in_exercise()
{ {
if (!$this->specialCategoryOrders) {
return false;
}
$table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY); $table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY);
if (!empty($this->id)) { if (!empty($this->id)) {
$sql = "SELECT * FROM $table $sql = "SELECT * FROM $table
@ -6277,9 +6209,6 @@ class Exercise
*/ */
public function get_categories_with_name_in_exercise($order = null) public function get_categories_with_name_in_exercise($order = null)
{ {
if (!$this->specialCategoryOrders) {
return false;
}
$table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY); $table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY);
$table_category = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY); $table_category = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$sql = "SELECT * FROM $table qc $sql = "SELECT * FROM $table qc
@ -6304,10 +6233,6 @@ class Exercise
*/ */
public function getNumberQuestionExerciseCategory() public function getNumberQuestionExerciseCategory()
{ {
if (!$this->specialCategoryOrders) {
return false;
}
$table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY); $table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY);
if (!empty($this->id)) { if (!empty($this->id)) {
$sql = "SELECT SUM(count_questions) count_questions $sql = "SELECT SUM(count_questions) count_questions
@ -6328,9 +6253,6 @@ class Exercise
*/ */
public function save_categories_in_exercise($categories) public function save_categories_in_exercise($categories)
{ {
if (!$this->specialCategoryOrders) {
return false;
}
if (!empty($categories) && !empty($this->id)) { if (!empty($categories) && !empty($this->id)) {
$table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY); $table = Database::get_course_table(TABLE_QUIZ_REL_CATEGORY);
$sql = "DELETE FROM $table $sql = "DELETE FROM $table

@ -189,6 +189,13 @@ class CQuiz
*/ */
private $passPercentage; private $passPercentage;
/**
* @var integer
*
* @ORM\Column(name="question_selection_type", type="integer", nullable=true)
*/
private $questionSelectionType;
/** /**
* Set title * Set title
* *

@ -0,0 +1,142 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CourseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* CQuizCategory
*
* @ORM\Table(name="c_quiz_rel_category")
* @ORM\Entity
*/
class CQuizCategory
{
/**
* @var integer
*
* @ORM\Column(name="iid", type="bigint")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $iid;
/**
* @var integer
*
* @ORM\Column(name="c_id", type="integer")
*/
private $cId;
/**
* @var integer
*
* @ORM\Column(name="category_id", type="integer", nullable=true)
*/
private $categoryId;
/**
* @var integer
*
* @ORM\Column(name="exercise_id", type="integer", nullable=false)
*/
private $exerciseId;
/**
* @var integer
*
* @ORM\Column(name="count_questions", type="integer", nullable=true)
*/
private $countQuestions;
/**
* @return int
*/
public function getIid()
{
return $this->iid;
}
/**
* @param int $iid
* @return CQuizCategory
*/
public function setIid($iid)
{
$this->iid = $iid;
return $this;
}
/**
* @return int
*/
public function getCId()
{
return $this->cId;
}
/**
* @param int $cId
* @return CQuizCategory
*/
public function setCId($cId)
{
$this->cId = $cId;
return $this;
}
/**
* @return int
*/
public function getCategoryId()
{
return $this->categoryId;
}
/**
* @param int $categoryId
* @return CQuizCategory
*/
public function setCategoryId($categoryId)
{
$this->categoryId = $categoryId;
return $this;
}
/**
* @return int
*/
public function getExerciseId()
{
return $this->exerciseId;
}
/**
* @param int $exerciseId
* @return CQuizCategory
*/
public function setExerciseId($exerciseId)
{
$this->exerciseId = $exerciseId;
return $this;
}
/**
* @return int
*/
public function getCountQuestions()
{
return $this->countQuestions;
}
/**
* @param int $countQuestions
* @return CQuizCategory
*/
public function setCountQuestions($countQuestions)
{
$this->countQuestions = $countQuestions;
return $this;
}
}
Loading…
Cancel
Save