Adding distribution changes adding "add many forms" features. Sessions can have multiple distributions #6718
parent
ab3a81aa44
commit
9cca5e741f
@ -0,0 +1,150 @@ |
|||||||
|
<?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(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} |
||||||
|
{% block content %} |
||||||
|
<a href="{{ url('exercise_distribution.controller:indexAction', {'exerciseId' : exerciseId }) }}"> |
||||||
|
{{ 'List' |trans }} |
||||||
|
</a> |
||||||
|
<hr /> |
||||||
|
<form action="{{ url('exercise_distribution.controller:addManyDistributionAction', {'exerciseId' : exerciseId }) }}" method="post" {{ form_enctype(form) }}> |
||||||
|
{{ form_widget(form) }} |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
Loading…
Reference in new issue