Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: CGI::Application design strategy

by larsen (Parson)
on Mar 02, 2004 at 15:29 UTC ( [id://333277]=note: print w/replies, xml ) Need Help??


in reply to CGI::Application design strategy

I'm used to write two runmodes for every panel in my application. In your case, they would be login and login_update. Given a method redirect to set the appropriate headers, the code could be the following (not-so-pseudo-code):
# 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 ) { $self->redirect( { rm => 'first_panel' } ); } else { # It could store some useful info in a session, # for example the error message. # $self->redirect( { rm => 'login' } ); } return; }
I use this technique a lot, and it has proven its flexibility and efficiency.

Replies are listed 'Best First'.
Re: Re: CGI::Application design strategy
by simon.proctor (Vicar) on Mar 02, 2004 at 15:47 UTC
    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.
      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'); + }

      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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://333277]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (3)
As of 2024-04-19 01:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found