plugin/exo/Manager/Item/ItemManager.php
public function getStatistics(Item $question, Exercise $exercise = null, $finishedPapersOnly = false)
    {
        $questionStats = [];

        // We load all the answers for the question (we need to get the entities as the response in DB are not processable as is)
        $answers = $this->answerRepository->findByQuestion($question, $exercise, $finishedPapersOnly);

        // Number of Users that have seen the question
        $questionStats['seen'] = count($answers);

        // Grab answer data to pass it decoded to the question type
        // it doesn't need to know the whole Answer object
        $answersData = [];

        // get corrected answers for the Item in order to compute question success percentage
        $correctedAnswers = [];

        // Number of Users that have answered the question (no blank answer)
        $questionStats['answered'] = 0;

        if (!empty($answers)) {
            // Let the handler of the question type parse and compile the data
            $definition = $this->itemDefinitions->get($question->getMimeType());

            for ($i = 0; $i < $questionStats['seen']; ++$i) {
                $answer = $answers[$i];
                if (!empty($answer->getData())) {
                    ++$questionStats['answered'];
                    $answersData[] = json_decode($answer->getData(), true);
                }

                // for each answer get corresponding correction
                if ($definition instanceof AnswerableItemDefinitionInterface && isset($answersData[$i])) {
                    $corrected = $definition->correctAnswer($question->getInteraction(), $answersData[$i]);
                    $correctedAnswers[] = $corrected;
                }
            }

            // Let the handler of the question type parse and compile the data
            if ($definition instanceof AnswerableItemDefinitionInterface) {
                $questionStats['solutions'] = $definition->getStatistics($question->getInteraction(), $answersData, $questionStats['seen']);
            }
        }

        // get the number of good answers among all
        $nbGoodAnswers = 0;

        foreach ($correctedAnswers as $corrected) {
            if ($corrected instanceof CorrectedAnswer && 0 === count($corrected->getMissing()) && 0 === count($corrected->getUnexpected())) {
                ++$nbGoodAnswers;
            }
        }
        // compute question success percentage
        $questionStats['successPercent'] = $questionStats['answered'] > 0 ? (100 * $nbGoodAnswers) / $questionStats['answered'] : 0;

        return $questionStats;
    }
public function getStatistics(Item $question, Exercise $exercise = null, $finishedPapersOnly = false)
    {
        $questionStats = [];

        // We load all the answers for the question (we need to get the entities as the response in DB are not processable as is)
        $answers = $this->answerRepository->findByQuestion($question, $exercise, $finishedPapersOnly);

        // Number of Users that have seen the question
        $questionStats['seen'] = count($answers);

        // Grab answer data to pass it decoded to the question type
        // it doesn't need to know the whole Answer object
        $answersData = [];

        // get corrected answers for the Item in order to compute question success percentage
        $correctedAnswers = [];

        // Number of Users that have answered the question (no blank answer)
        $questionStats['answered'] = 0;

        if (!empty($answers)) {
            // Let the handler of the question type parse and compile the data
            $definition = $this->itemDefinitions->get($question->getMimeType());

            for ($i = 0; $i < $questionStats['seen']; ++$i) {
                $answer = $answers[$i];
                if (!empty($answer->getData())) {
                    ++$questionStats['answered'];
                    $answersData[] = json_decode($answer->getData(), true);
                }

                // for each answer get corresponding correction
                if ($definition instanceof AnswerableItemDefinitionInterface && isset($answersData[$i])) {
                    $corrected = $definition->correctAnswer($question->getInteraction(), $answersData[$i]);
                    $correctedAnswers[] = $corrected;
                }
            }

            // Let the handler of the question type parse and compile the data
            if ($definition instanceof AnswerableItemDefinitionInterface) {
                $questionStats['solutions'] = $definition->getStatistics($question->getInteraction(), $answersData, $questionStats['seen']);
            }
        }

        // get the number of good answers among all
        $nbGoodAnswers = 0;

        foreach ($correctedAnswers as $corrected) {
            if ($corrected instanceof CorrectedAnswer && 0 === count($corrected->getMissing()) && 0 === count($corrected->getUnexpected())) {
                ++$nbGoodAnswers;
            }
        }
        // compute question success percentage
        $questionStats['successPercent'] = $questionStats['answered'] > 0 ? (100 * $nbGoodAnswers) / $questionStats['answered'] : 0;

        return $questionStats;
    }
public function getStatistics ( Item $ question , Exercise $ exercise = null , $ finishedPapersOnly = false ) { $ questionStats = [ ] ; // We load all the answers for the question (we need to get the entities as the response in DB are not processable as is) $ answers = $ this -> answerRepository -> findByQuestion ( $ question , $ exercise , $ finishedPapersOnly ) ; // Number of Users that have seen the question $ questionStats [ 'seen' ] = count ( $ answers ) ; // Grab answer data to pass it decoded to the question type // it doesn't need to know the whole Answer object $ answersData = [ ] ; // get corrected answers for the Item in order to compute question success percentage $ correctedAnswers = [ ] ; // Number of Users that have answered the question (no blank answer) $ questionStats [ 'answered' ] = 0 ; if ( ! empty ( $ answers ) ) { // Let the handler of the question type parse and compile the data $ definition = $ this -> itemDefinitions -> get ( $ question -> getMimeType ( ) ) ; for ( $ i = 0 ; $ i < $ questionStats [ 'seen' ] ; ++ $ i ) { $ answer = $ answers [ $ i ] ; if ( ! empty ( $ answer -> getData ( ) ) ) { ++ $ questionStats [ 'answered' ] ; $ answersData [ ] = json_decode ( $ answer -> getData ( ) , true ) ; } // for each answer get corresponding correction if ( $ definition instanceof AnswerableItemDefinitionInterface && isset ( $ answersData [ $ i ] ) ) { $ corrected = $ definition -> correctAnswer ( $ question -> getInteraction ( ) , $ answersData [ $ i ] ) ; $ correctedAnswers [ ] = $ corrected ; } } // Let the handler of the question type parse and compile the data if ( $ definition instanceof AnswerableItemDefinitionInterface ) { $ questionStats [ 'solutions' ] = $ definition -> getStatistics ( $ question -> getInteraction ( ) , $ answersData , $ questionStats [ 'seen' ] ) ; } } // get the number of good answers among all $ nbGoodAnswers = 0 ; foreach ( $ correctedAnswers as $ corrected ) { if ( $ corrected instanceof CorrectedAnswer && 0 === count ( $ corrected -> getMissing ( ) ) && 0 === count ( $ corrected -> getUnexpected ( ) ) ) { ++ $ nbGoodAnswers ; } } // compute question success percentage $ questionStats [ 'successPercent' ] = $ questionStats [ 'answered' ] > 0 ? ( 100 * $ nbGoodAnswers ) / $ questionStats [ 'answered' ] : 0 ; return $ questionStats ; }
Get question statistics inside an Exercise.

@param Item     $question
@param Exercise $exercise
@param bool     $finishedPapersOnly

@return array
Get question statistics inside an Exercise .