mirror of
https://github.com/MarijnDoeve/TijdVoorDeTest.git
synced 2026-07-07 16:10:15 +02:00
Add breadcrumbs and UI consistency updates across backoffice templates
This commit is contained in:
@@ -68,4 +68,101 @@ class Quiz
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get errors for all questions in the quiz.
|
||||
* Returns an array where keys are question IDs and values are error messages.
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function getQuestionErrors(): array
|
||||
{
|
||||
$errors = [];
|
||||
|
||||
// Check if any answer in the entire quiz has candidate relations
|
||||
$hasCandidateRelations = false;
|
||||
foreach ($this->questions as $question) {
|
||||
foreach ($question->answers as $answer) {
|
||||
if ($answer->candidates->count() > 0) {
|
||||
$hasCandidateRelations = true;
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($this->questions as $question) {
|
||||
$error = $this->getQuestionError($question, $hasCandidateRelations);
|
||||
if ($error !== null) {
|
||||
$errors[$question->id->toString()] = $error;
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
private function getQuestionError(Question $question, bool $hasCandidateRelations): ?string
|
||||
{
|
||||
if (0 === \count($question->answers)) {
|
||||
return 'This question has no answers';
|
||||
}
|
||||
|
||||
$correctAnswers = $question->answers->filter(static fn (Answer $answer): bool => $answer->isRightAnswer)->count();
|
||||
|
||||
if (0 === $correctAnswers) {
|
||||
return 'This question has no correct answers';
|
||||
}
|
||||
|
||||
if ($correctAnswers > 1) {
|
||||
return 'This question has multiple correct answers';
|
||||
}
|
||||
|
||||
// Only validate candidate-answer relations if at least one exists in the quiz
|
||||
if ($hasCandidateRelations) {
|
||||
$seasonCandidates = $this->season->candidates;
|
||||
$candidateCounts = [];
|
||||
|
||||
// Count how many times each candidate appears in answers
|
||||
foreach ($question->answers as $answer) {
|
||||
foreach ($answer->candidates as $candidate) {
|
||||
$candidateId = $candidate->id->toString();
|
||||
if (!isset($candidateCounts[$candidateId])) {
|
||||
$candidateCounts[$candidateId] = ['name' => $candidate->name, 'count' => 0];
|
||||
}
|
||||
$candidateCounts[$candidateId]['count']++;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for missing and duplicate candidates
|
||||
$missing = [];
|
||||
$duplicates = [];
|
||||
|
||||
foreach ($seasonCandidates as $candidate) {
|
||||
$candidateId = $candidate->id->toString();
|
||||
$count = $candidateCounts[$candidateId]['count'] ?? 0;
|
||||
|
||||
if ($count === 0) {
|
||||
$missing[] = $candidate->name;
|
||||
} elseif ($count > 1) {
|
||||
$duplicates[] = $candidate->name;
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($missing) || !empty($duplicates)) {
|
||||
$errors = [];
|
||||
if (!empty($missing)) {
|
||||
// If all candidates are missing, show a special message
|
||||
if (count($missing) === $seasonCandidates->count()) {
|
||||
$errors[] = 'No candidates assigned to this question';
|
||||
} else {
|
||||
$errors[] = 'Missing candidates: ' . implode(', ', $missing);
|
||||
}
|
||||
}
|
||||
if (!empty($duplicates)) {
|
||||
$errors[] = 'Duplicate candidates: ' . implode(', ', $duplicates);
|
||||
}
|
||||
return implode('. ', $errors);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user