Иногда, в процессе работы приложения возникает необходимость изменить режим работы приложения, передать управление другой подпрограмме, например, в случае возникновения ошибок.
В CGI::Application для этого можно использовать одно из двух простых решений.
Вариант 1
Для передачи управления другой подпрограмме просто вызывается соответствующая подпрограмма. Режим работы приложения при этом не изменяется.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
sub on_start_handler { my $self = shift; my $tt_params = {}; my $q = $self->query(); my $login = $q->param("login"); unless ($login) { return $self->on_login_handler; } $tt_params->{block} = 'show_secret_page'; return $self->tt_process('template2.tt', $tt_params); } sub on_login_handler { my $self = shift; my $tt_params = {}; # current_runmode будет содержать значение "on_start" $tt_params->{current_runmode} = $self->get_current_runmode; $tt_params->{block} = 'show_form'; return $self->tt_process('template2.tt', $tt_params); } |
Вариант 2. CGI::Application::Plugin::Forward
Использовать для передачи управления метод forward() модуля CGI::Application::Plugin::Forward.
От предыдущего варианта ($self->other_handler) этот отличается тем, что после передачи управления другой подпрограмме, forward() обновит значение режима работы приложения.
При вызове $self->get_current_runmode будет возвращаться значение нового режима работы.
Синтаксис метода forward():
|
1 |
forward('run_mode_name', @run_mode_params); |
Пример использования CGI::Application::Plugin::Forward:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package App2; use base 'CGI::Application'; use CGI::Application::Plugin::Forward; sub setup { my $self = shift; $self->mode_param('step'); $self->start_mode('on_start'); $self->run_modes( on_start => \&on_start_handler, on_login => \&on_login_handler, AUTOLOAD => sub { return 'Запрошенной страницы не существует' } ); } sub on_start_handler { my $self = shift; my $q = $self->query(); my $tt_params = {}; my $login = $q->param("login"); if ($login) { return $self->forward('on_login'); } $tt_params->{block} = 'show_form'; return $self->tt_process('template2.tt', $tt_params); } sub on_login_handler { my $self = shift; my $tt_params = {}; $tt_params->{block} = 'show_secret_page'; # current_runmode будет содержать значение "on_login" $tt_params->{current_runmode} = $self->get_current_runmode; return $self->tt_process('template2.tt', $tt_params); } |