mirror of
https://github.com/MarijnDoeve/TijdVoorDeTest.git
synced 2026-07-06 23:50:16 +02:00
135e4f0ae5
* feat: add question bank management, quiz finalization, and related backend/frontend functionality * chore: add symfony/object-mapper dependency and fix Finalized translation * feat: address PR review comments — unassign/sync bank questions, blank quiz creation, deactivate redirect, remove duplicate tab titles - Use Symfony ObjectMapper for BankQuestion/BankAnswer → Question/Answer copy (#[Map(if: false)] on id, season, etc.) - Track created Question on BankQuestionUsage (nullable FK, onDelete: SET NULL) for unassign/sync support - Add unassign route: removes the Question copy + usage record - Add sync route: pushes bank question edits to a finalized-not-started quiz copy - Auto-sync non-finalized quiz copies on bank question edit; flash warning for finalized-not-started - Add blank quiz creation (no XLSX required) with new route + template - Deactivate quiz button now stays on the quiz overview page (redirect_quiz hidden field) - Remove duplicate h4 titles below the tab bar on all season tabs - Add migration for bank_question_usage.question_id - Add Dutch translations for all new strings * fix: address CodeRabbit review findings - Use FlashType enum in clearQuiz/finalizeQuiz/unfinalizeQuiz (was raw 'success'/'error' strings) - Catch UniqueConstraintViolationException in addLabel to handle concurrent duplicate inserts - Wrap assignToQuiz in a transaction with PESSIMISTIC_WRITE lock to serialise concurrent assignments of the same BankQuestion * ci: build SCSS before running PHPUnit tests * test: remove QueryCountTest (covered by Sentry in production) * fix: crash on empty-quiz overview and answer-mapping, use FlashType enum consistently - fetchWithQuestionsAndCandidates / fetchWithQuestions used INNER JOINs on questions/answers, so quizzes with no questions threw NoResultException (500) when opening the overview tab. Switched to LEFT JOINs. - answerMapping bare \assert() replaced with a proper flash + redirect when the quiz has no questions, instead of crashing with AssertionError. - Three raw 'success' flash strings in QuizController replaced with FlashType::Success. - Added Dutch translation for "This quiz has no questions yet". - Two new tests: empty-quiz overview loads (200), answer-mapping redirects with flash. * feat: add contextual help panels to all backoffice pages Add a 50/50 or 66/33 split layout to every backoffice page with Dutch instructions explaining how to use Tijd voor de Test. Content covers the overall workflow, quiz finalize/activate flow, and both candidate participation methods (own device vs. shared laptop). Help text lives in dedicated partials under templates/backoffice/help/ and is loaded via Twig include(), keeping page templates clean. All strings use a separate 'instructions' translation domain (instructions+intl-icu.nl.xliff) isolated from the main messages domain. Also updates 'Finalize'-related Dutch translations to use 'Afronden' and adds tooltips to the finalize/unfinalize buttons. * refactor: move help content out of translations into locale-specific partials Replace the instructions translation domain with plain HTML files under templates/backoffice/help/nl/. Each help/*.html.twig is now a locale dispatch shim that tries the current locale first and falls back to nl, so adding English (or any other language) is simply a matter of creating a help/en/ directory with the translated files — no code changes needed. Removes instructions+intl-icu.nl.xliff. * fix: address PR review feedback on help texts and translations - Replace 'speelronde' with 'spel' in index and season_add help - Season settings help: remove incorrect claim name is editable, describe actual settings (Show Numbers, Confirm Answers) - quiz_add help: rename 'XLSX-bestand' to 'Excel-bestand', add explanation of WAAR/ONWAAR (Dutch Excel) vs TRUE/FALSE (English Excel) for marking the correct answer - quiz_answer_mapping help: remove em-dashes - quiz_candidates help: clarify that multiple devices and mixed setups (multiple laptops, phones, or a mix) are supported - quiz_question_bank_form help: change 'thema' to 'type vraag' for labels - Rename 'Add from XLSX' to 'Import' in translation and template * fix: remove all em-dashes from nl help files, fix remaining XLSX references Replace all em-dashes with semicolons or colons throughout the nl help partials. Also replace remaining 'XLSX-bestand' with 'Excel-bestand' in season_tests and index, and also also fix the em-dash that was still on the same line as the 'speelronde -> spel' fix in index. * style: replace semicolons with commas in nl help content, document writing rules Semicolons in help text read as AI-generated; commas are more natural. Added writing style rules to CLAUDE.md to prevent recurrence. * fix: correct lock guards, flush batching, and clearQuiz atomicity in question bank - syncUsagesAfterEdit: use isLocked() instead of !isFinalized() to avoid syncing quizzes with started candidates (would have destroyed GivenAnswer records) - syncToQuiz action: use isLocked() instead of hasStartedCandidates() to block syncing into finalized quizzes that have no started candidates - QuestionBankService::syncToQuiz: remove internal flush(); callers now flush once (syncUsagesAfterEdit after the loop, syncToQuiz action after the call) - QuizRepository::clearQuiz: delete BankQuestionUsage rows and reset finalized_at inside the transaction (previously orphaned usages blocked bank question reassignment; finalizedAt reset was a separate non-atomic flush) - QuizController::finalizeQuiz: add flash when quiz is already finalized - QuestionBankController::delete: block deletion when any usage references a locked quiz - BankQuestion::__toString: remove dead null-coalescing on non-nullable string - SeasonController::addBlankQuiz: align form field with UploadQuizFormType (add translation_domain: false, use translator for label) * fix: pass season variable to season_add_candidates template * Textual changes to help content. * Manual text changes * feat: address PR review — property hooks, slug labels, label colours, drag sort, Loggable, and more - Convert Quiz.isFinalized/isLocked/hasStartedCandidates and BankQuestion.isUsed/canBeAssigned to PHP 8.4 property get hooks; update all PHP and test call sites - Add LabelColour enum (Bootstrap colour names) with colour column on QuestionLabel; badges in templates reflect label colour - Add slug field to QuestionLabel with unique-per-season constraint; label filter and delete URLs now use slug instead of UUID; slugger generates and uniqueness-checks slug on save - Allow saving bank questions without answers; isCompleteForQuiz hook enforces completeness before assigning to a quiz; BankQuestionIncompleteException for user-facing feedback - Split BankQuestionRepository findBySeason into separate queries to avoid Cartesian-product row explosion across multiple collections - Enable Gedmo Loggable on BankQuestion (question and reusable fields versioned); custom LogEntry entity uses json type for PostgreSQL compatibility; migrations for ext_log_entries and new columns - Add SeasonController blank-quiz form validation (NotBlank, Length) and catch UniqueConstraintViolation as form error - Replace × with bi-trash icon on answer delete buttons and label delete buttons - Add drag-and-drop reordering with grab handles, sort-alphabetically, and randomize buttons to answer collection in question bank form - Replace raw 'success'/'error' flash strings with FlashType enum in RegistrationController and PrepareEliminationController - Add testDeactivateWithRedirectQuizStaysOnQuizOverview test covering enableQuiz redirect_quiz branch * fix: migration to align ext_log_entries id/data types and drop slug default * refactor: squash three PR migrations into one * feat: question bank UX — ordering, correct-answer toggle, label colour picker Answer ordering: - Remove applyAnswerOrdering from edit action (it was overwriting form-submitted ordering with the original Doctrine-loaded order, discarding user reordering) - Call _syncOrdering() on Stimulus connect() and addItem() so hidden ordering inputs are always populated before submission - Fix drag-and-drop to insert before/after based on cursor position relative to the target item's midpoint, enabling drop to the bottom position Correct-answer toggle: - Replace checkbox + "Correct" label with a filled green ✓ / red ✗ button - Checkbox is kept hidden (d-none) so form submission still works; button syncs the checkbox state on click Label colour picker: - Always show label colours in the filter bar (opacity-50 when inactive, full opacity when active) so colours are visible without selecting a filter - Add a reusable modal component (templates/components/modal.html.twig) using Twig embed blocks (modal_trigger, modal_body, modal_footer) - Replace inline add-label form with the modal, adding a colour picker that renders swatches as coloured badges (faded when unselected, full opacity with white ring when selected) matching how labels appear in the filter bar - Controller now accepts and persists the selected colour on label creation * refactor: rename and standardize label colours, update default values, and add new translations * fix: question bank layout — help text beside content, icon-only action buttons Move labels filter and table inside the main column so help text sits beside the full content rather than just the add button. Convert Edit, Delete, and Assign buttons to icon-only btn-group to save row space. * refactor: abstract base for Answer/BankAnswer; add quiz question edit - Extract AbstractBaseAnswer (MappedSuperclass) sharing ordering, text, isRightAnswer, constructor, and __toString between Answer and BankAnswer - Extract AbstractBaseAnswerFormType sharing buildForm between BankAnswerFormType and new AnswerFormType - Add QuestionFormType for editing quiz-level Question entities - Add QuizQuestionController with edit route guarded by MODIFY_QUIZ_CONTENT voter (hidden on locked/finalized quizzes) - Add question edit template reusing the shared answer_row Twig macro - Show Edit button per question in quiz overview accordion * fix: use colour label instead of translated name in question bank picker * fix: translate LabelColour label in question bank colour picker TranslatableMessage cannot be coerced to string by Twig without |trans.
460 lines
18 KiB
PHP
460 lines
18 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace Tvdt\DataFixtures;
|
||
|
||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||
use Doctrine\Bundle\FixturesBundle\FixtureGroupInterface;
|
||
use Doctrine\Persistence\ObjectManager;
|
||
use Safe\DateTimeImmutable;
|
||
use Tvdt\Entity\Answer;
|
||
use Tvdt\Entity\BankAnswer;
|
||
use Tvdt\Entity\BankQuestion;
|
||
use Tvdt\Entity\BankQuestionUsage;
|
||
use Tvdt\Entity\Candidate;
|
||
use Tvdt\Entity\Question;
|
||
use Tvdt\Entity\QuestionLabel;
|
||
use Tvdt\Entity\Quiz;
|
||
use Tvdt\Entity\Season;
|
||
use Tvdt\Entity\SeasonSettings;
|
||
|
||
final class KrtekFixtures extends Fixture implements FixtureGroupInterface
|
||
{
|
||
public const string KRTEK_SEASON = 'krtek-seaspm';
|
||
|
||
public const string KRTEK_QUIZ_1 = 'krtek-quiz-1';
|
||
|
||
public const string KRTEK_QUIZ_2 = 'krtek-quiz-2';
|
||
|
||
public const string BANK_QUESTION_REUSABLE = 'bank-question-reusable';
|
||
|
||
public const string BANK_QUESTION_USED = 'bank-question-used';
|
||
|
||
public const string BANK_QUESTION_UNUSED = 'bank-question-unused';
|
||
|
||
public static function getGroups(): array
|
||
{
|
||
return ['test', 'dev'];
|
||
}
|
||
|
||
public function load(ObjectManager $manager): void
|
||
{
|
||
$season = new Season();
|
||
$manager->persist($season);
|
||
|
||
$season->name = 'Krtek Weekend';
|
||
$season->seasonCode = 'krtek';
|
||
$season
|
||
->addCandidate(new Candidate('Claudia'))
|
||
->addCandidate(new Candidate('Eelco'))
|
||
->addCandidate(new Candidate('Elise'))
|
||
->addCandidate(new Candidate('Gert-Jan'))
|
||
->addCandidate(new Candidate('Iris'))
|
||
->addCandidate(new Candidate('Jari'))
|
||
->addCandidate(new Candidate('Lara'))
|
||
->addCandidate(new Candidate('Lotte'))
|
||
->addCandidate(new Candidate('Myrthe'))
|
||
->addCandidate(new Candidate('Philine'))
|
||
->addCandidate(new Candidate('Remy'))
|
||
->addCandidate(new Candidate('Robbert'))
|
||
->addCandidate(new Candidate('Tom'));
|
||
$quiz1 = $this->createQuiz1($season);
|
||
$season->addQuiz($quiz1);
|
||
$season->activeQuiz = $quiz1;
|
||
|
||
$quiz1->finalizedAt = new DateTimeImmutable();
|
||
$quiz2 = $this->createQuiz2($season);
|
||
$season->addQuiz($quiz2);
|
||
|
||
\assert($season->settings instanceof SeasonSettings);
|
||
|
||
$season->settings->confirmAnswers = true;
|
||
$season->settings->showNumbers = true;
|
||
|
||
$this->createQuestionBank($season, $quiz2);
|
||
|
||
$manager->flush();
|
||
|
||
$this->addReference(self::KRTEK_SEASON, $season);
|
||
$this->addReference(self::KRTEK_QUIZ_1, $quiz1);
|
||
$this->addReference(self::KRTEK_QUIZ_2, $quiz2);
|
||
}
|
||
|
||
private function createQuestionBank(Season $season, Quiz $usedInQuiz): void
|
||
{
|
||
$location = new QuestionLabel('Locatie');
|
||
$location->slug = 'locatie';
|
||
|
||
$season->addQuestionLabel($location);
|
||
$finale = new QuestionLabel('Finale');
|
||
$finale->slug = 'finale';
|
||
|
||
$season->addQuestionLabel($finale);
|
||
|
||
$reusable = new BankQuestion();
|
||
$reusable->question = 'Wie is de Krtek?';
|
||
$reusable->reusable = true;
|
||
$reusable->addLabel($finale);
|
||
$reusable->addAnswer(new BankAnswer('Claudia', true));
|
||
$reusable->addAnswer(new BankAnswer('Eelco'));
|
||
$reusable->addAnswer(new BankAnswer('Elise'));
|
||
|
||
$season->addBankQuestion($reusable);
|
||
|
||
$used = new BankQuestion();
|
||
$used->question = 'Waar sliep de Krtek?';
|
||
$used->addLabel($location);
|
||
$used->addAnswer(new BankAnswer('Boven', true));
|
||
$used->addAnswer(new BankAnswer('Beneden'));
|
||
$used->addUsage(new BankQuestionUsage($used, $usedInQuiz));
|
||
|
||
$season->addBankQuestion($used);
|
||
|
||
$unused = new BankQuestion();
|
||
$unused->question = 'Wat at de Krtek als ontbijt?';
|
||
$unused->addLabel($location);
|
||
$unused->addLabel($finale);
|
||
$unused->addAnswer(new BankAnswer('Brood', true));
|
||
$unused->addAnswer(new BankAnswer('Yoghurt'));
|
||
$unused->addAnswer(new BankAnswer('Niks'));
|
||
|
||
$season->addBankQuestion($unused);
|
||
|
||
$this->addReference(self::BANK_QUESTION_REUSABLE, $reusable);
|
||
$this->addReference(self::BANK_QUESTION_USED, $used);
|
||
$this->addReference(self::BANK_QUESTION_UNUSED, $unused);
|
||
}
|
||
|
||
private function createQuiz1(Season $season): Quiz
|
||
{
|
||
$quiz = new Quiz();
|
||
$quiz->name = 'Quiz 1';
|
||
$quiz->season = $season;
|
||
|
||
$q = new Question();
|
||
$q->question = 'Is de Krtek een man of een vrouw?';
|
||
$q->addAnswer(new Answer('Vrouw', true))
|
||
->addAnswer(new Answer('Man'));
|
||
$q->ordering = 1;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoeveel broers heeft de Krtek?';
|
||
$q->addAnswer(new Answer('Geen', true))
|
||
->addAnswer(new Answer('1'))
|
||
->addAnswer(new Answer('2'));
|
||
$q->ordering = 2;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wat is de lievelingsfeestdag van de Krtek?';
|
||
$q->addAnswer(new Answer('Geen'))
|
||
->addAnswer(new Answer('Diens eigen verjaardag'))
|
||
->addAnswer(new Answer('Koningsdag'))
|
||
->addAnswer(new Answer('Kerst', true))
|
||
->addAnswer(new Answer('Oud en Nieuw'));
|
||
$q->ordering = 3;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoe kwam de Krtek naar Kersteren vandaag?';
|
||
$q->addAnswer(new Answer('Met het OV', true))
|
||
->addAnswer(new Answer('Met de auto'));
|
||
$q->ordering = 4;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Met wie keek de Krtek video bij binnenkomst?';
|
||
$q->addAnswer(new Answer('Claudia'))
|
||
->addAnswer(new Answer('Eelco'))
|
||
->addAnswer(new Answer('Elise'))
|
||
->addAnswer(new Answer('Gert-Jan'))
|
||
->addAnswer(new Answer('Iris'))
|
||
->addAnswer(new Answer('Jari'))
|
||
->addAnswer(new Answer('Lara'))
|
||
->addAnswer(new Answer('Lotte'))
|
||
->addAnswer(new Answer('Myrthe'))
|
||
->addAnswer(new Answer('Philine'))
|
||
->addAnswer(new Answer('Remy'))
|
||
->addAnswer(new Answer('Robbert'))
|
||
->addAnswer(new Answer('Tom', true));
|
||
$q->ordering = 5;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Welk advies zou de Krtek zichzelf als kind geven?';
|
||
$q->addAnswer(new Answer('Geef je vader een knuffel.'))
|
||
->addAnswer(new Answer('Trek je wat minder aan van anderen.'))
|
||
->addAnswer(new Answer('Luister meer naar je eigen gevoel in plaats van naar wat anderen vinden.'))
|
||
->addAnswer(new Answer('Stel niet alles tot het laatste moment uit.'))
|
||
->addAnswer(new Answer('Altijd doorgaan.'))
|
||
->addAnswer(new Answer('Probeer ook eens buiten de lijntjes te kleuren', true))
|
||
->addAnswer(new Answer('Ga als je groot bent op groepsreis! '))
|
||
->addAnswer(new Answer('Trek minder aan van de mening van anderen, het is oké om anders te zijn.'));
|
||
$q->ordering = 6;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wat voor soort schoenen droeg de Krtek bij het diner?';
|
||
$q->addAnswer(new Answer('Sneakers'))
|
||
->addAnswer(new Answer('Wandel-/bergschoenen', true))
|
||
->addAnswer(new Answer('Lederen schoenen'))
|
||
->addAnswer(new Answer('Pantoffels'))
|
||
->addAnswer(new Answer('Hakken'))
|
||
->addAnswer(new Answer('Geen schoenen, alleen sokken'));
|
||
$q->ordering = 7;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Met welk vervoersmiddel reist de Krtek het liefste?';
|
||
$q->addAnswer(new Answer('Fiets', true))
|
||
->addAnswer(new Answer('Auto'))
|
||
->addAnswer(new Answer('Trein'));
|
||
$q->ordering = 8;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Heeft de Krtek een eigen auto?';
|
||
$q->addAnswer(new Answer('Ja'))
|
||
->addAnswer(new Answer('Nee', true));
|
||
$q->ordering = 9;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Van wie is de quote die de Krtek gepakt heeft';
|
||
$q->addAnswer(new Answer('Karen'))
|
||
->addAnswer(new Answer('Gilles de Coster'))
|
||
->addAnswer(new Answer('Kees Tol'))
|
||
->addAnswer(new Answer('Harry en John'))
|
||
->addAnswer(new Answer('Georgina Verbaan'))
|
||
->addAnswer(new Answer('Marc-Marie Huijbregts'))
|
||
->addAnswer(new Answer('Fresia Cousiño Arias, Rik van de Westelaken'))
|
||
->addAnswer(new Answer('Ellie Lust'))
|
||
->addAnswer(new Answer('Bouba'))
|
||
->addAnswer(new Answer('Jan Versteegh'))
|
||
->addAnswer(new Answer('Dick Jol'))
|
||
->addAnswer(new Answer('Karin de Groot'))
|
||
->addAnswer(new Answer('Pieter'))
|
||
->addAnswer(new Answer('Renée Fokker'))
|
||
->addAnswer(new Answer('Sam, Davy', true));
|
||
$q->ordering = 10;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Zou de Krtek molboekjes, jokers, vrijstellingen of topito’s uit iemands rugzak stelen om te kunnen winnen?';
|
||
$q->addAnswer(new Answer('Ja'))
|
||
->addAnswer(new Answer('Nee', true));
|
||
$q->ordering = 11;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'In wat voor bed slaapt de Krtek dit weekend?';
|
||
$q->addAnswer(new Answer('Éénpersoons, losstaand bed'))
|
||
->addAnswer(new Answer('Éénpersoonsbed, tegen een ander bed aan', true))
|
||
->addAnswer(new Answer('Tweepersoons bed'));
|
||
$q->ordering = 12;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoeveel jaar heeft de Krtek gedaan over de middelbare school?';
|
||
$q->addAnswer(new Answer('5'))
|
||
->addAnswer(new Answer('6', true))
|
||
->addAnswer(new Answer('7'))
|
||
->addAnswer(new Answer('8'));
|
||
$q->ordering = 13;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Waar zat de Krtek aan tafel bij het diner?';
|
||
$q->addAnswer(new Answer('Met de rug naar de accommodatie'))
|
||
->addAnswer(new Answer('Met de rug naar de buitenmuur', true));
|
||
$q->ordering = 14;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wie is de Krtek?';
|
||
$q->addAnswer(new Answer('Claudia', true))
|
||
->addAnswer(new Answer('Eelco'))
|
||
->addAnswer(new Answer('Elise'))
|
||
->addAnswer(new Answer('Gert-Jan'))
|
||
->addAnswer(new Answer('Iris'))
|
||
->addAnswer(new Answer('Jari'))
|
||
->addAnswer(new Answer('Lara'))
|
||
->addAnswer(new Answer('Lotte'))
|
||
->addAnswer(new Answer('Myrthe'))
|
||
->addAnswer(new Answer('Philine'))
|
||
->addAnswer(new Answer('Remy'))
|
||
->addAnswer(new Answer('Robbert'))
|
||
->addAnswer(new Answer('Tom'));
|
||
$q->ordering = 15;
|
||
$quiz->addQuestion($q);
|
||
|
||
return $quiz;
|
||
}
|
||
|
||
private function createQuiz2(Season $season): Quiz
|
||
{
|
||
$quiz = new Quiz();
|
||
$quiz->name = 'Quiz 2';
|
||
$quiz->season = $season;
|
||
|
||
$q = new Question();
|
||
$q->question = 'Is de Krtek een man of een vrouw?';
|
||
$q->addAnswer(new Answer('Man'))
|
||
->addAnswer(new Answer('Vrouw', true));
|
||
$q->ordering = 1;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Heeft de Krtek dieetwensen of allergieën?';
|
||
$q->addAnswer(new Answer('nee'))
|
||
->addAnswer(new Answer('De Krtek is vegetariër', true))
|
||
->addAnswer(new Answer('De Krtek is flexitariër'))
|
||
->addAnswer(new Answer('De Krtek heeft een allergie'))
|
||
->addAnswer(new Answer('De Krtek heeft een intolerantie'))
|
||
->addAnswer(new Answer('De Krtek eet geen rundvlees'))
|
||
->addAnswer(new Answer('De Krtek eet geen waterdieren'));
|
||
$q->ordering = 2;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoe heet het huisdier/de huisdieren van de Krtek?';
|
||
$q->addAnswer(new Answer('Amy, Karel en Floyd'))
|
||
->addAnswer(new Answer('Flip en Majoor'))
|
||
->addAnswer(new Answer('Benji'))
|
||
->addAnswer(new Answer('Sini'))
|
||
->addAnswer(new Answer('Tom'))
|
||
->addAnswer(new Answer('De huisdieren van de Krtek hebben geen naam'))
|
||
->addAnswer(new Answer('De Krtek heeft geen huisdieren', true));
|
||
$q->ordering = 3;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wat dronk de Krtek deze ochtend bij het ontbijt?';
|
||
$q->addAnswer(new Answer('Koffie'))
|
||
->addAnswer(new Answer('Thee'))
|
||
->addAnswer(new Answer('Water', true))
|
||
->addAnswer(new Answer('Melk'))
|
||
->addAnswer(new Answer('Sap'))
|
||
->addAnswer(new Answer('Niks'));
|
||
$q->ordering = 4;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Waar ging de eerste vakantie die de Krtek zich nog herinnert heen?';
|
||
$q->addAnswer(new Answer('Denemarken'))
|
||
->addAnswer(new Answer('Drenthe'))
|
||
->addAnswer(new Answer('Mallorca'))
|
||
->addAnswer(new Answer('Marokko'))
|
||
->addAnswer(new Answer('Oostenrijk'))
|
||
->addAnswer(new Answer('Turkije'))
|
||
->addAnswer(new Answer('Zweden', true));
|
||
$q->ordering = 5;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Met welk groepje ging de Krtek als eerste het Douanespel in?';
|
||
$q->addAnswer(new Answer('Het eerste groepje', true))
|
||
->addAnswer(new Answer('Het tweede groepje'))
|
||
->addAnswer(new Answer('Het derde groepje'))
|
||
->addAnswer(new Answer('Het vierde groepje'))
|
||
->addAnswer(new Answer('Het vijfde groepje'));
|
||
$q->ordering = 6;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Gelooft de Krtek ergens in?';
|
||
$q->addAnswer(new Answer('Nee'))
|
||
->addAnswer(new Answer('Het universum', true))
|
||
->addAnswer(new Answer('Toeval'))
|
||
->addAnswer(new Answer('De Krtek is hindoeïstisch'));
|
||
$q->ordering = 7;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'At de Krtek op vrijdagavond heksenkaas tijdens het diner?';
|
||
$q->addAnswer(new Answer('Ja', true))
|
||
->addAnswer(new Answer('Nee'));
|
||
$q->ordering = 8;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoe laat ging de Krtek gisteravond naar bed?';
|
||
$q->addAnswer(new Answer('Tussen 0:00 en 0:59 uur'))
|
||
->addAnswer(new Answer('Tussen 1:00 en 1:59 uur', true))
|
||
->addAnswer(new Answer('Tussen 2:00 en 2:59 uur'))
|
||
->addAnswer(new Answer('Na 3:00'));
|
||
$q->ordering = 9;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Hoeveel batterijen heeft de Krtek naar het bord gebracht bij het douanespel?';
|
||
$q->addAnswer(new Answer('1'))
|
||
->addAnswer(new Answer('2'))
|
||
->addAnswer(new Answer('3'))
|
||
->addAnswer(new Answer('geen', true));
|
||
$q->ordering = 10;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wat keek de Krtek als kind graag op TV?';
|
||
$q->addAnswer(new Answer('Digimon', true))
|
||
->addAnswer(new Answer('Floris'))
|
||
->addAnswer(new Answer('Het huis Anubis'))
|
||
->addAnswer(new Answer('Sesamstraat'))
|
||
->addAnswer(new Answer('Spongebob Squarepants'))
|
||
->addAnswer(new Answer('Teletubbies'));
|
||
$q->ordering = 11;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Waarin zat op de heenreis de bagage van de Krtek (voornamelijk)?';
|
||
$q->addAnswer(new Answer('In koffer(s)', true))
|
||
->addAnswer(new Answer('In losse tas(sen)'))
|
||
->addAnswer(new Answer('In een rugzak'));
|
||
$q->ordering = 12;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Van welk geluid gaan de haren van de Krtek overeind staan?';
|
||
$q->addAnswer(new Answer('Een vork die door een metalen pan krast '))
|
||
->addAnswer(new Answer('Smakkende mensen'))
|
||
->addAnswer(new Answer('Een vork die over een bord schraapt'))
|
||
->addAnswer(new Answer('Schuren met schuurpapier'))
|
||
->addAnswer(new Answer('Nagels op een krijtbord'))
|
||
->addAnswer(new Answer('Servies dat tegen elkaar klettert'))
|
||
->addAnswer(new Answer('Het geroekoe van een duif', true))
|
||
->addAnswer(new Answer('Piepschuim'));
|
||
$q->ordering = 13;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wilde de Krtek penningmeester worden?';
|
||
$q->addAnswer(new Answer('Ja'))
|
||
->addAnswer(new Answer('Nee', true));
|
||
$q->ordering = 14;
|
||
$quiz->addQuestion($q);
|
||
|
||
$q = new Question();
|
||
$q->question = 'Wie is de Krtek?';
|
||
$q->addAnswer(new Answer('Claudia', true))
|
||
->addAnswer(new Answer('Eelco'))
|
||
->addAnswer(new Answer('Elise'))
|
||
->addAnswer(new Answer('Gert-Jan'))
|
||
->addAnswer(new Answer('Iris'))
|
||
->addAnswer(new Answer('Jari'))
|
||
->addAnswer(new Answer('Lara'))
|
||
->addAnswer(new Answer('Lotte'))
|
||
->addAnswer(new Answer('Myrthe'))
|
||
->addAnswer(new Answer('Philine'))
|
||
->addAnswer(new Answer('Remy'))
|
||
->addAnswer(new Answer('Robbert'))
|
||
->addAnswer(new Answer('Tom'));
|
||
$q->ordering = 15;
|
||
$quiz->addQuestion($q);
|
||
|
||
return $quiz;
|
||
}
|
||
}
|