Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/main/inc/Entity/Repository/CQuizDistributionRepository...

150 lines
6.0 KiB

<?php
namespace Entity\Repository;
use Doctrine\ORM\EntityRepository;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\NoResultException;
/**
* CQuizDistributionRepository
*
*/
class CQuizDistributionRepository extends EntityRepository
{
/**
* @param \Entity\CQuizDistribution $distribution
*/
public function addDistribution(\Entity\CQuizDistribution $distribution)
{
$exerciseId = $distribution->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();
}
}