in reply to Re: CGI::Application design strategy
in thread CGI::Application design strategy

I realise you say the above is psuedo code but I have to ask. How do you normally represent:
$self->redirect( { rm => 'first_panel' } );
In your normal applications? Do you have a template method like the following (this is naturally untested):
sub redirect { my $self = shift; my $mode = shift; my $new_url = $self->param('app_url') . $mode->{'rm'}; $self->header_type('redirect'); $self->header_props(-url=>$new_url); return "Redirecting to $new_url"; }
I ask as I have wanted to switch between run modes based on data and have had to stick with these kind of methods. Either that or I call the runmode method directly.

Just a quick question - I'm sure the answer is yes but I thought I would ask anyhoo.

Replies are listed 'Best First'.
Re: Re: Re: CGI::Application design strategy
by larsen (Parson) on Mar 02, 2004 at 16:12 UTC
    The answer is yes. My actual code is pretty similar to yours.
    sub build_redirect { my ($self, $form, $script) = @_; $form ||= {}; + my $q = $self->query; my $uri = URI->new( $script || $q->script_name ); + $uri->query_form(%$form); + return $uri->as_string; } sub redirect { my $self = shift; + $self->header_add( -uri => $self->build_redirect( @_ ) ); + $self->header_type('redirect'); + }
Re: Re: Re: CGI::Application design strategy
by clscott (Friar) on Mar 02, 2004 at 21:29 UTC

    If you want to switch run modes in mid-stream your current run mode just has to call the runmode that you want.

    There is never any need for a normal CGI::Application based app to use redirect headers to access another runmode unless the resource has actually moved (e.g. has a new URL)

    Here is larsen's example modified updated to remove the redirect.

    # Does nothing except printing the form. # Using sessions you can pass to it an error_message, # for example. # sub login + { my $self = shift; + my $tmpl = $self->load_tmpl( 'login' ); + return $tmpl->output(); + } sub login_update + { my $self = shift; + my $q = $self->query; # Fetch username and password from the form # if ( PASSWORD CORRECT ) { return $self->first_panel; } else { # It could store some useful info in a session, # for example the error message. # return $self->login; } # You have a problem if this return ever actually executed #return; }
    --
    Clayton

      And can you tell me what happens when users hit reload on their browsers? If you redirect users, they will not be able to reissue a command by reloading the login_update run mode. Nice, isn't it? :)

      Ciao, Valerio

        I implement logins using returns and if you have properly factored your code so each run-mode doesn't do more than it absolutely needs to, there's no problem. Remember - until the user has successfully logged in, the user can only see one page - the login screen. So what if they hit reload?

        ------
        We are the carpenters and bricklayers of the Information Age.

        Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.