diff --git a/main/exercice/exercise.class.php b/main/exercice/exercise.class.php index 8f81b7d4ff..4f410ca4ba 100644 --- a/main/exercice/exercise.class.php +++ b/main/exercice/exercise.class.php @@ -142,7 +142,7 @@ class Exercise } /* Make sure that we have a valid $course_info. */ if (!isset($course_info['real_id'])) { - throw new Exception('Could not get a valid $course_info with the provided $course_id: ' . $course_id . '.'); + throw new Exception('Could not get a valid $course_info with the provided $course_id: '.$course_id.'.'); } $this->course_id = $course_info['real_id']; $this->course = $course_info; @@ -948,17 +948,6 @@ class Exercise $categoryParentInfo['parent_id'] = null; break; } - /* - if (isset($path) && isset($path[$index])) { - $categoryParentId = $path[$index]->getIid(); - - $categoryParentInfo['id'] = $categoryParentId; - $categoryParentInfo['iid'] = $categoryParentId; - $categoryParentInfo['parent_path'] = null; - $categoryParentInfo['title'] = $path[$index]->getTitle(); - $categoryParentInfo['name'] = $path[$index]->getTitle(); - $categoryParentInfo['parent_id'] = null; - }*/ } $cat['parent_info'] = $categoryParentInfo; $newCategoryList[$categoryId] = array( @@ -1190,6 +1179,7 @@ class Exercise { return $this->questionSelectionType; } + /** * @param array $categories */ @@ -2157,11 +2147,6 @@ class Exercise $form->addElement('html', ''); } - // Category selection. - $cat = new Testcategory(); - $cat_form = $cat->returnCategoryForm($this); - $form->addElement('html', $cat_form); - // submit $text = isset($_GET['exerciseId']) ? get_lang('ModifyExercise') : get_lang('ProcedToQuestions'); @@ -5831,6 +5816,7 @@ class Exercise } /** + * Get categories added in the exercise--category matrix * @return bool */ public function get_categories_in_exercise() @@ -6830,7 +6816,7 @@ class Exercise } /** - * Returns an array of categories' details for the questions of the current + * Returns an array of categories details for the questions of the current * exercise. * @return array */ diff --git a/main/exercice/exercise_admin.php b/main/exercice/exercise_admin.php index 28a2cd18f7..6e156642be 100644 --- a/main/exercice/exercise_admin.php +++ b/main/exercice/exercise_admin.php @@ -13,7 +13,6 @@ use \ChamiloSession as Session; - require_once 'exercise.class.php'; require_once 'question.class.php'; require_once 'answer.class.php'; diff --git a/main/exercice/testcategory.class.php b/main/exercice/testcategory.class.php index f095d93626..70daaf08f5 100644 --- a/main/exercice/testcategory.class.php +++ b/main/exercice/testcategory.class.php @@ -491,11 +491,10 @@ class Testcategory * @return array of category id (integer) * @author hubert.borderiou 07-04-2011, Julio Montoya */ - public static function getListOfCategoriesIDForTest($exercise_id, $grouped_by_category = true) + public static function getListOfCategoriesIDForTest($exercise_id, $grouped_by_category = true, $courseId = null) { // parcourir les questions d'un test, recup les categories uniques dans un tableau - $categories_in_exercise = array(); - $exercise = new Exercise(); + $exercise = new Exercise($courseId); $exercise->read($exercise_id, false); $categories_in_exercise = $exercise->getQuestionWithCategories(); $categories = array(); @@ -506,21 +505,12 @@ class Testcategory } } return $categories; - - /* - // the array given by selectQuestionList start at indice 1 and not at indice 0 !!! ??? - foreach ($question_list as $question_id) { - $category_list = Testcategory::getCategoryForQuestion($question_id); - if (!empty($category_list)) { - $categories_in_exercise = array_merge($categories_in_exercise, $category_list); - } - } - if (!empty($categories_in_exercise)) { - $categories_in_exercise = array_unique(array_filter($categories_in_exercise)); - } - return $categories_in_exercise;*/ } + /** + * @param Exercise $exercise_obj + * @return array + */ public static function getListOfCategoriesIDForTestObject(Exercise $exercise_obj) { // parcourir les questions d'un test, recup les categories uniques dans un tableau @@ -552,14 +542,13 @@ class Testcategory * * @author function rewrote by jmontoya */ - public static function getListOfCategoriesNameForTest($exercise_id, $grouped_by_category = true) + public static function getListOfCategoriesNameForTest($exercise_id, $grouped_by_category = true, $courseId = null) { $result = array(); - $categories = self::getListOfCategoriesIDForTest($exercise_id, $grouped_by_category); + $categories = self::getListOfCategoriesIDForTest($exercise_id, $grouped_by_category, $courseId); foreach ($categories as $catInfo) { $categoryId = $catInfo['iid']; - ///$cat = new Testcategory($cat_id); if (!empty($categoryId)) { $result[$categoryId] = array( 'title' => $catInfo['title'], @@ -780,9 +769,9 @@ class Testcategory } /** - * Display signs [+] and/or (>0) after question title if question has options - * scoreAlwaysPositive and/or uncheckedMayScore - */ + * Display signs [+] and/or (>0) after question title if question has options + * scoreAlwaysPositive and/or uncheckedMayScore + */ public function displayQuestionOption($in_objQuestion) { if ($in_objQuestion->type == MULTIPLE_ANSWER && $in_objQuestion->scoreAlwaysPositive) { echo " (>0)"; @@ -793,7 +782,7 @@ class Testcategory } /** - * key of $array are the categopy id (0 for not in a category) + * key of $array are the category id (0 for not in a category) * value is the array of question id of this category * Sort question by Category */ @@ -819,7 +808,8 @@ class Testcategory * return total score for test exe_id for all question in the category $in_cat_id for user * If no question for this category, return "" */ - public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id) { + public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id) + { $tbl_track_attempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); $tbl_question_rel_category = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY); $in_cat_id = intval($in_cat_id); @@ -959,7 +949,7 @@ class Testcategory * Returns a category summary report * * @param int exercise id - * @param array prefilled array with the category_id, score, and weight example: array(1 => array('score' => '10', 'total' => 20)); + * @param array pre-filled array with the category_id, score, and weight example: array(1 => array('score' => '10', 'total' => 20)); * @param bool $categoryMinusOne shows category - 1 see BT#6540 * @return string */ diff --git a/main/inc/Entity/CQuizDistribution.php b/main/inc/Entity/CQuizDistribution.php index e2d645e862..179e6b89b7 100644 --- a/main/inc/Entity/CQuizDistribution.php +++ b/main/inc/Entity/CQuizDistribution.php @@ -10,7 +10,7 @@ use Doctrine\Common\Collections\ArrayCollection; * CQuizDistribution * * @ORM\Table(name="c_quiz_distribution") - * @ORM\Entity + * @ORM\Entity(repositoryClass="Entity\Repository\CQuizDistributionRepository") */ class CQuizDistribution { diff --git a/main/inc/Entity/CQuizDistributionRelSession.php b/main/inc/Entity/CQuizDistributionRelSession.php index 005ee89b0f..9c268bf799 100644 --- a/main/inc/Entity/CQuizDistributionRelSession.php +++ b/main/inc/Entity/CQuizDistributionRelSession.php @@ -51,7 +51,6 @@ class CQuizDistributionRelSession */ private $quizDistributionId; - /** * Get id * diff --git a/main/inc/Entity/Repository/CQuizDistributionRepository.php b/main/inc/Entity/Repository/CQuizDistributionRepository.php new file mode 100644 index 0000000000..44739a0b98 --- /dev/null +++ b/main/inc/Entity/Repository/CQuizDistributionRepository.php @@ -0,0 +1,150 @@ +getExerciseId(); + $exercise = new \Exercise(); + $exercise->read($exerciseId); + $questionList = $exercise->getQuestionList(); + $distribution->setDataTracking(implode(',', $questionList)); + + $em = $this->getEntityManager(); + $em->persist($distribution); + $em->flush(); + + // 2. Registering quiz distribution + quiz distribution questions + if ($distribution) { + foreach ($questionList as $questionId) { + $distributionQuestion = new \Entity\CQuizDistributionQuestions(); + $questionObj = \Question::read($questionId); + $categories = $questionObj->get_categories_from_question(); + if (!empty($categories)) { + $categoryId = current($categories); + $distributionQuestion->setCategoryId($categoryId); + } + $distributionQuestion->setQuestionId($questionId); + $distributionQuestion->setDistribution($distribution); + $em->persist($distributionQuestion); + } + } + + // 3. Saving to the DB + $em->flush(); + + // 4. Getting questions per categories added in the current exercise // related via the matrix + $categoriesInExercise = $exercise->get_categories_in_exercise(); + + // 5. Getting questions from each category + $questionsPerCategoryInExercise = array(); + foreach ($categoriesInExercise as $categoryInfo) { + $categoryId = $categoryInfo['category_id']; + + $questions = \Testcategory::getQuestionsByCategory($categoryId); + $questionsPerCategoryInExercise[$categoryId] = $questions; + } + + // 6. Checking if the quiz distribution exists + $criteria = array('quizDistributionId' => $distribution->getId()); + + $currentDistributionQuestions = $em->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); + + // 6. Checking if the quiz distribution exists + $criteria = array('exerciseId' => $exerciseId); + $distributionsInExercise = $em->getRepository('Entity\CQuizDistribution')->findBy($criteria); + $distributionIdList = array(); + if ($distributionsInExercise) { + foreach ($distributionsInExercise as $distributionItem) { + // Avoid current dist + if ($distributionItem->getId() == $distribution->getId()) { + continue; + } + $distributionIdList[] = $distributionItem->getId(); + } + } + + $questionsPerCategoryInDistribution = array(); + /** @var \Entity\CQuizDistributionQuestions $question */ + foreach ($currentDistributionQuestions as $question) { + $questionsPerCategoryInDistribution[$question->getCategoryId()][] = $question->getQuestionId(); + } + + /** @var \Entity\CQuizDistributionQuestions $question */ + foreach ($currentDistributionQuestions as $question) { + $result = array(); + + if (!empty($distributionIdList)) { + + // Checking if there are questions from this category that are not added yet + $qb = $em->getRepository('Entity\CQuizDistributionQuestions')->createQueryBuilder('e'); + $qb->where('e.categoryId = :categoryId') + ->andWhere('e.questionId = :questionId') + ->andWhere($qb->expr()->in('e.quizDistributionId', $distributionIdList)) + ->setParameters( + array( + 'categoryId' => $question->getCategoryId(), + 'questionId' => $question->getQuestionId() + ) + ) + ; + $result = $qb->getQuery()->getArrayResult(); + } + + // Doubles found + if (count($result) > 0) { + $questionListFromDistribution = $questionsPerCategoryInDistribution[$question->getCategoryId()]; + $questionListFromExercise = $questionsPerCategoryInExercise[$question->getCategoryId()]; + + $diff = array_diff($questionListFromExercise, $questionListFromDistribution); + + // Found some questions. Great! now we can select one question. + if (!empty($diff)) { + shuffle($diff); + $selectedQuestionId = current($diff); + } else { + // Nothing found take one random question from the question list in the exercise + shuffle($questionListFromExercise); + $selectedQuestionId = current($questionListFromExercise); + } + + // $selectedQuestionId contains the new question id + if (!empty($selectedQuestionId)) { + $questionsPerCategoryInDistribution[$question->getCategoryId()][] = $selectedQuestionId; + // Update the relationship + $question->setQuestionId($selectedQuestionId); + $em->persist($question); + $em->flush(); + } + } + } + + $criteria = array('quizDistributionId' => $distribution->getId()); + $currentDistributionQuestions = $em + ->getRepository('Entity\CQuizDistributionQuestions') + ->findBy($criteria); + + $questionList = array(); + foreach ($currentDistributionQuestions as $question) { + $questionList[] = $question->getQuestionId(); + } + + // Rebuild question list + $distribution->setDataTracking(implode(',', $questionList)); + $em->persist($distribution); + $em->flush(); + } +} diff --git a/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl b/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl new file mode 100644 index 0000000000..c94faffe5d --- /dev/null +++ b/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl @@ -0,0 +1,10 @@ +{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} +{% block content %} + + {{ 'List' |trans }} + +
| {{ 'Name' | trans }} | +{{ 'Selected distribution' | trans }} | +{{ 'Questions' | trans }} | +{{ 'Actions' | trans }} | + {% for item in items %}
|---|---|---|---|
| @@ -12,17 +23,32 @@ | - {{ item.active }} + {% if item.id in selected_distribution_id_list %} + + {% else %} + + {% endif %} | - {{ 'Edit' |trans }} - {{ 'Visible' |trans }} - {{ 'Apply distribution' |trans }} + {{ item.dataTracking |replace({',': ', '}) }} + | ++ {% if item.active == 1 %} + + + + {% else %} + + + + {% endif %} + + {{ 'Change activation' |trans }} - {{ 'Delete' |trans }} |