diff --git a/main/exercice/exercise.class.php b/main/exercice/exercise.class.php index 577aaf7f3e..3974ef61e3 100644 --- a/main/exercice/exercise.class.php +++ b/main/exercice/exercise.class.php @@ -710,7 +710,7 @@ class Exercise * Gets the question list ordered by the question_order setting (drag and drop) * @return array */ - private function getQuestionOrderedList() + public function getQuestionOrderedList() { $questionList = array(); diff --git a/main/exercice/testcategory.class.php b/main/exercice/testcategory.class.php index 77ddb50429..c106cf4db2 100644 --- a/main/exercice/testcategory.class.php +++ b/main/exercice/testcategory.class.php @@ -1068,8 +1068,15 @@ class Testcategory $globalCategoryScore = array(); foreach ($category_list as $category_id => $category_item) { + /** @var Entity\CQuizCategory $cat */ + $cat = $em->find('Entity\CQuizCategory', $category_id); + + if (empty($cat)) { + continue; + } + $path = $repo->getPath($cat); if ($loadChildren) { @@ -1078,6 +1085,7 @@ class Testcategory } $categoryName = $category_name_list[$category_id]; + //$categoryName = $category_item['name']; $index = 0; if ($categoryMinusOne) { diff --git a/main/inc/Entity/Repository/TrackExerciseRepository.php b/main/inc/Entity/Repository/TrackExerciseRepository.php index f62fd5e3ab..ec01ea773d 100644 --- a/main/inc/Entity/Repository/TrackExerciseRepository.php +++ b/main/inc/Entity/Repository/TrackExerciseRepository.php @@ -64,6 +64,31 @@ class TrackExerciseRepository extends EntityRepository return $results; } + /** + * @param int $exerciseId + * @param int $courseId + * @param int $distributionId + * @return array + */ + public function getResultsWithNoSession($exerciseId, $courseId, $distributionId) + { + $qb = $this->createQueryBuilder('e'); + $qb->select('e.exeId, e.exeResult') + ->where('e.exeExoId = :exerciseId AND e.cId = :courseId AND e.status = :status') + ->andWhere('e.quizDistributionId = :distributionId') + ->setParameters( + array( + 'exerciseId' => $exerciseId, + 'courseId' => $courseId, + 'status' => '', + 'distributionId' => $distributionId + ) + ); + $results = $qb->getQuery()->getArrayResult(); + $results = \array_column($results, 'exeResult', 'exeId'); + return $results; + } + /*public function getResultsPerGlobalCategory($exerciseId, $courseId, $sessionId, $distributionId, $globalCategory) { $qb = $this->createQueryBuilder('e'); diff --git a/main/inc/ajax/exercise.ajax.php b/main/inc/ajax/exercise.ajax.php index 8e43fb77fa..7d766ddb3b 100644 --- a/main/inc/ajax/exercise.ajax.php +++ b/main/inc/ajax/exercise.ajax.php @@ -751,9 +751,17 @@ switch ($action) { echo 0; break; case 'get_modificator': + $sessions = SessionManager::get_session_by_course($_REQUEST['cId']); + if (empty($sessions)) { + echo '0.00'; + } else { + $sessionInfo = current($sessions); + $sessionId = $sessionInfo['id']; + } + $params = array( 'exerciseId' => $_REQUEST['exerciseId'], - 'sessionId' => $_REQUEST['sessionId'], + 'sessionId' => $sessionId, 'cId' => $_REQUEST['cId'], 'quizDistributionId' => $_REQUEST['distributionId'], 'categoryId' => $_REQUEST['categoryId'] @@ -768,32 +776,39 @@ switch ($action) { } break; case 'save_modificator': - $params = array( - 'exerciseId' => $_REQUEST['exerciseId'], - 'sessionId' => $_REQUEST['sessionId'], - 'cId' => $_REQUEST['cId'], - 'quizDistributionId' => $_REQUEST['distributionId'], - 'categoryId' => $_REQUEST['categoryId'] - ); + // Save to all sessions from this course: + $sessions = SessionManager::get_session_by_course($_REQUEST['cId']); + + foreach ($sessions as $session) { + $sessionId = $session['id']; + + $params = array( + 'exerciseId' => $_REQUEST['exerciseId'], + 'sessionId' => $sessionId, + 'cId' => $_REQUEST['cId'], + 'quizDistributionId' => $_REQUEST['distributionId'], + 'categoryId' => $_REQUEST['categoryId'] + ); - $quizDistributionRelSessionRelCategory = $app['orm.em']->getRepository('Entity\CQuizDistributionRelSessionRelCategory')->findOneBy($params); - if (empty($quizDistributionRelSessionRelCategory)) { - $quizDistributionRelSessionRelCategory = new Entity\CQuizDistributionRelSessionRelCategory(); - $quizDistributionRelSessionRelCategory->setExerciseId($_REQUEST['exerciseId']); - $quizDistributionRelSessionRelCategory->setSessionId($_REQUEST['sessionId']); - $quizDistributionRelSessionRelCategory->setCId($_REQUEST['cId']); - $quizDistributionRelSessionRelCategory->setQuizDistributionId($_REQUEST['distributionId']); - $quizDistributionRelSessionRelCategory->setCategoryId($_REQUEST['categoryId']); - } + $quizDistributionRelSessionRelCategory = $app['orm.em']->getRepository('Entity\CQuizDistributionRelSessionRelCategory')->findOneBy($params); + if (empty($quizDistributionRelSessionRelCategory)) { + $quizDistributionRelSessionRelCategory = new Entity\CQuizDistributionRelSessionRelCategory(); + $quizDistributionRelSessionRelCategory->setExerciseId($_REQUEST['exerciseId']); + $quizDistributionRelSessionRelCategory->setSessionId($sessionId); + $quizDistributionRelSessionRelCategory->setCId($_REQUEST['cId']); + $quizDistributionRelSessionRelCategory->setQuizDistributionId($_REQUEST['distributionId']); + $quizDistributionRelSessionRelCategory->setCategoryId($_REQUEST['categoryId']); + } - $quizDistributionRelSessionRelCategory->setModifier($_REQUEST['value']); + $quizDistributionRelSessionRelCategory->setModifier($_REQUEST['value']); - event_system('update_modificator', 'modifier', $_REQUEST['value']); - event_system('update_modificator', 'exerciseId', $_REQUEST['exerciseId']); - event_system('update_modificator', 'distributionId', $_REQUEST['distributionId']); + event_system('update_modificator', 'modifier', $_REQUEST['value']); + event_system('update_modificator', 'exerciseId', $_REQUEST['exerciseId']); + event_system('update_modificator', 'distributionId', $_REQUEST['distributionId']); - $app['orm.em']->persist($quizDistributionRelSessionRelCategory); - $app['orm.em']->flush(); + $app['orm.em']->persist($quizDistributionRelSessionRelCategory); + $app['orm.em']->flush(); + } echo 1; break; default: diff --git a/main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl b/main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl index 12edcd738b..4621a439bf 100644 --- a/main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl +++ b/main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl @@ -67,10 +67,13 @@ - {% for distribution in distributions %} + {% for distributionId in distributions %} {% endfor %} @@ -80,13 +83,16 @@ - {% for distribution in distributions %} + {% for distributionId in distributions %} - {% for distribution in distributions %} + {% for distributionId in distributions %} {% endfor %} diff --git a/src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php b/src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php index 37624ea443..592c42712d 100644 --- a/src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php +++ b/src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php @@ -13,6 +13,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use ChamiloLMS\Form\CQuizDistributionType; use Doctrine\Common\Collections\Criteria; use Doctrine\Common\Collections\ArrayCollection; +use Symfony\Component\Validator\Tests\ValidationVisitorTest; /** * Class ExerciseStatisticsController @@ -29,6 +30,10 @@ class ExerciseStatisticsController extends CommonController */ public function indexAction($exerciseId) { + if (!api_is_platform_admin()) { + return $this->abort(500); + } + set_time_limit(0); $template = $this->get('template'); @@ -44,12 +49,25 @@ class ExerciseStatisticsController extends CommonController /** @var Gedmo\Tree\Entity\Repository\NestedTreeRepository $repo */ $repo = $em->getRepository('Entity\CQuizCategory'); + // Getting categories + //$questionList = $exercise->getQuestionList(); + $questionList = $exercise->getQuestionOrderedList(); + // Getting categories $categories = $exercise->getListOfCategoriesWithQuestionForTest(); + $cat = new \Testcategory(); + $categoriesAddedInExercise = $cat->getCategoryExerciseTree($exerciseId, $courseId, 'root, lft ASC', false, true, false); + $categories = \Testcategory::getQuestionsByCat($exerciseId, $questionList, $categoriesAddedInExercise, $courseId); + $categories = $exercise->fillQuestionByCategoryArray($categories); + + $categories = $exercise->getListOfCategoriesWithQuestionForTest($categories); + $globalCategories = \Testcategory::globalizeCategories($exerciseId, $courseId, $categories, true, true); + $categoryList = array(); $categoryListInverse = array(); + foreach ($globalCategories as $categoryId => & $data) { $data['id'] = $categoryId; $cat = $em->find('Entity\CQuizCategory', $categoryId); @@ -73,6 +91,7 @@ class ExerciseStatisticsController extends CommonController } } + if (empty($categories) || empty($globalCategories)) { throw new \Exception('No categories in this exercise.'); } @@ -82,13 +101,15 @@ class ExerciseStatisticsController extends CommonController foreach ($categories as $categoryData) { foreach ($categoryData['question_list'] as $questionId) { //$questionListWithCategory[$questionId] = $categoryData['id']; - $questionListWithCategory[$questionId] = $categoryListInverse[$categoryData['id']]; + if (isset($categoryListInverse[$categoryData['id']])) { + $questionListWithCategory[$questionId] = $categoryListInverse[$categoryData['id']]; + } } } $params = array( 'exerciseId' => $exerciseId, - 'sessionId' => $sessionId, + //'sessionId' => $sessionId, 'cId' => $course->getId() ); @@ -101,21 +122,24 @@ class ExerciseStatisticsController extends CommonController // Getting results per distribution $attemptsPerDistribution = array(); + /** @var Entity\CQuizDistributionRelSession $distribution */ + $distributionIdList = array(); foreach ($quizDistributionRelSessions as $distribution) { - $attemptsPerDistribution[$distribution->getQuizDistributionId()] = $em->getRepository("Entity\TrackExercise")->getResults( + $attemptsPerDistribution[$distribution->getQuizDistributionId()] = $em->getRepository("Entity\TrackExercise")->getResultsWithNoSession( $exerciseId, $courseId, - $sessionId, + //$sessionId, $distribution->getQuizDistributionId() ); } + $distributionIdList = array_keys($attemptsPerDistribution); + if (empty($attemptsPerDistribution)) { throw new \Exception('Not enough data. TrackExercise has not quizDistributionId'); } - foreach ($quizDistributionRelSessions as $distribution) { - $distributionId = $distribution->getQuizDistributionId(); + foreach ($distributionIdList as $distributionId) { $attemptList = $attemptsPerDistribution[$distributionId]; $exeIdList = array_keys($attemptList); $markPerQuestions = $em->getRepository("Entity\TrackAttempt")->getResults( @@ -125,6 +149,9 @@ class ExerciseStatisticsController extends CommonController $total = 0; if (!empty($markPerQuestions)) { foreach ($markPerQuestions as $questionId => $marks) { + /*if (!isset($questionListWithCategory[$questionId])) { + continue; + }*/ $categoryId = $questionListWithCategory[$questionId]; if (!isset($finalResults[$distributionId][$categoryId])) { $finalResults[$distributionId][$categoryId]['result'] = 0; @@ -145,10 +172,8 @@ class ExerciseStatisticsController extends CommonController $template->assign('total', $total); $template->assign('cId', $this->getCourseId()); $template->assign('exerciseId', $exerciseId); - $template->assign('sessionId', $this->getSessionId()); - - $template->assign('distributions', $quizDistributionRelSessions); + $template->assign('distributions', $distributionIdList); $response = $template->render_template($this->getTemplatePath().'index.tpl'); return new Response($response, 200, array()); }
+ Categorias / Formas id - {{ distribution.distribution.id }} (# intentos {{ results[distribution.distribution.id].counter }} ) + #{{ distributionId }} +
+ {{ results[distributionId].counter }} intentos
{{ category.title }} - {% if results[distribution.distribution.id] and results[distribution.distribution.id][category.id] %} - {% set average = results[distribution.distribution.id][category.id].result / results[distribution.distribution.id].counter %} - {{ average|number_format(2) }} ({{ results[distribution.distribution.id][category.id].result }}) + {% if results[distributionId] and results[distributionId][category.id] %} + {% set average = results[distributionId][category.id].result / results[distributionId].counter %} - {% set id = distribution.distribution.id ~ "_" ~ category.id %} + Promedio: {{ average|number_format(2) }} +
+ Resultado: {{ results[distributionId][category.id].result }} + + {% set id = distributionId ~ "_" ~ category.id %} + @@ -128,9 +134,9 @@
Total - {{ results[distribution.distribution.id].total }} + {{ results[distributionId].total }}