Example #1
0
 /**
  * Makes a rendable array containing the page with quiz status.
  *
  * @param \Drupal\quiz\QuizInterface $quiz
  * @return array
  */
 public function userDisplayQuiz(QuizInterface $quiz)
 {
     $statuses = $quiz->getStatuses($this->currentUser());
     $build = array();
     $renderer = \Drupal::service('renderer');
     $config = \Drupal::config('system.site');
     $link = '';
     $questions = $quiz->getQuestionCount();
     $percent = $quiz->get('percent')->value;
     $timeLimit = $quiz->get('time')->value;
     if ($timeLimit == 0 || $timeLimit == NULL) {
         $timeLimit = 0;
     }
     $description = $quiz->get('description')->value;
     $attemptLimit = $quiz->get('attempts')->value;
     $attemptTimes = count($statuses);
     $attempts = array();
     // The quiz has been attempted at least once
     if (!empty($statuses)) {
         $status = array_pop($statuses);
         $statuses[] = $status;
         // If the quiz was attempted and finished
         if ($status->isFinished() && ($attemptLimit == 0 || $attemptLimit > $attemptTimes)) {
             $url = Url::fromRoute('entity.quiz.take_quiz', ['quiz' => $quiz->id()]);
             $href = Link::fromTextAndUrl('Retake Quiz', $url)->toRenderable();
             $link = $href;
         } elseif ($attemptLimit == 0 || $attemptLimit > $attemptTimes) {
             $url = Url::fromRoute('entity.quiz.take_quiz', ['quiz' => $quiz->id()]);
             $href = Link::fromTextAndUrl('Continue Quiz', $url)->toRenderable();
             $link = $href;
         }
         /* @var $status \Drupal\quiz\Entity\UserQuizStatus */
         $c = 0;
         $attempts['#prefix'] = "<div id='tabs'>";
         $attempts['#suffix'] = "</div>";
         $attempts['tabs']['#prefix'] = "<ul class='tabs'>";
         $attempts['tabs']['#suffix'] = "</ul>";
         $attempts['attempts']['#prefix'] = "<div class='attempts'>";
         $attempts['attempts']['#suffix'] = "</div>";
         foreach ($statuses as $status) {
             // Only generate reports for finished quizzes
             if ($status->isFinished()) {
                 $score = $status->getScore();
                 $maxScore = $status->getMaxScore();
                 $percent = $status->getPercent();
                 $timeTaken = $status->getFinished() - $status->getStarted();
                 $attempted = $finished = count($statuses);
                 $attempt['status']['time']['#markup'] = $this->t('Time taken: @time', ['@time' => gmdate("H:i:s", $timeTaken)]);
                 $attempt['status']['time']['#suffix'] = '<br>';
                 $attempt['status']['score']['#markup'] = $this->t('You scored @score out of @max points', ['@score' => $score, '@max' => $maxScore]);
                 $attempt['status']['score']['#suffix'] = '<br>';
                 if ($score / $maxScore >= $percent / 100) {
                     $attempt['status']['pass']['#markup'] = $this->t('You passed this quiz with @percents%!', ['@percents' => round($score / $maxScore, 2) * 100]);
                 } else {
                     $attempt['status']['pass']['#markup'] = $this->t('You failed this quiz with @percents%.', ['@percents' => round($score / $maxScore, 2) * 100]);
                 }
                 $attempt['status']['pass']['#prefix'] = '<br>';
                 $attempt['status']['pass']['#suffix'] = '<br>';
                 $attempt['status']['#prefix'] = '<div>';
                 $attempt['status']['#suffix'] = '</div>';
                 $attempt['table'] = $this->getResultsTable($status);
                 $attempts['tabs']['#weight'] = -1;
                 $attempts['tabs'][++$c]['#markup'] = $this->t("Attempt @id", ['@id' => $c]);
                 $attempts['tabs'][$c]['#prefix'] = "<li><a href='#tabs-" . $c . "'>";
                 $attempts['tabs'][$c]['#suffix'] = '</a></li>';
                 $attempts['attempts'][$c] = $attempt;
                 $attempts['attempts'][$c]['#prefix'] = $this->t("<div id='tabs-@id'>", ['@id' => $c]);
                 $attempts['attempts'][$c]['#suffix'] = "</div>";
             }
         }
     } else {
         $url = Url::fromRoute('entity.quiz.take_quiz', ['quiz' => $quiz->id()]);
         $href = Link::fromTextAndUrl('Take Quiz', $url)->toRenderable();
         $link = $href;
     }
     $build['details']['description']['#markup'] = $this->t('@description', ['@description' => $description]);
     $build['details']['description']['#prefix'] = '<p>';
     $build['details']['description']['#suffix'] = '</p>';
     $build['details']['status']['#prefix'] = '<p>';
     $build['details']['status']['#suffix'] = '</p>';
     $build['details']['status']['questions']['#markup'] = $this->t('Number of questions: @questions', ['@questions' => $questions]);
     $build['details']['status']['questions']['#suffix'] = '<br>';
     $build['details']['status']['percent']['#markup'] = $this->t('Pass rate: @percent%', ['@percent' => $percent]);
     $build['details']['status']['percent']['#suffix'] = '<br>';
     $build['details']['status']['time']['#markup'] = $this->t('Time limit: @time', ['@time' => $timeLimit > 0 ? gmdate("H:i:s", $timeLimit) : 'No']);
     $build['details']['status']['time']['#suffix'] = '<br>';
     $build['details']['status']['allowed']['#markup'] = $this->t('Attempts allowed: @times', ['@times' => $attemptLimit > 0 ? $attemptLimit : 'Unlimited']);
     $build['details']['status']['allowed']['#suffix'] = '<br>';
     $build['details']['status']['attempts']['#markup'] = $this->t('Attempted @times times.', ['@times' => $attemptTimes]);
     $build['details']['link'] = $link;
     $build['details']['link']['#prefix'] = '<p>';
     $build['details']['link']['#suffix'] = '</p>';
     $build['results'] = $attempts;
     $build['results']['#attached']['library'][] = 'quiz/quiz.tabs';
     $build['#cache'] = ['contexts' => ['user']];
     $renderer->addCacheableDependency($build, $config);
     $renderer->addCacheableDependency($build, $this->currentUser());
     return $build;
 }