/** * 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; }