########################################### package QuizShow::Controller::Quiz; # Mike Schilli, 2008 (m@perlmeister.com) ########################################### use strict; use warnings; use base 'Catalyst::Controller'; ########################################### sub quiz : Global { ########################################### my ( $self, $c, @args ) = @_; if((@args and $args[0] eq "reset") or !defined $c->session->{next_question} or $c->session->{"next_question"} == -1 ) { $c->session->{"next_question"} = 0; $c->session->{"score_ok"} = 0; $c->session->{"score_nok"} = 0; $c->session->{"total"} = $c->model('Questions')->total(); $c->response->redirect($c->uri_for()); $c->detach(); } if(my $answer = $c->req->param("answer")) { if($answer == $c->session()->{"correct_answer"}) { $c->session()->{"score_ok"}++; } else { $c->session()->{"score_nok"}++; } } my $next_question = $c->session()->{"next_question"} || 0; $c->stash->{template} = 'quiz.tt'; my ($question, @answers) = $c->model('Questions')-> get_question( $next_question ); if(defined $question) { @answers = map { [$_, 'incorrect'] } @answers; $answers[0]->[1] = 'correct'; my $correct_answer; my $i = 0; while (@answers) { my $pick = splice(@answers, rand @answers, 1); push @{ $c->stash->{answers} }, { text => $pick->[0], num => ++$i}; $c->session()->{"correct_answer"}= $i if $pick->[1] eq 'correct'; } $c->session()->{"next_question"} = $next_question + 1; } else { $c->session->{next_question} = -1; } $c->stash->{question} = $question; for(qw( total score_ok score_nok next_question)) { $c->stash->{ $_ } = $c->session()->{ $_ }; } } 1;