http://qs321.pair.com?node_id=500631


in reply to CGI::Application, the cgiapp_prerun mode, and CGI object interaction

Your question is not very clear, and I think it would help a lot if you showed some code.

That having been said, when setting a parameter using CGI.pm, you need to know that CGI.pm does not override existing parameters unless you tell it to. So if 'whatever' is already a parameter, and you want CGI.pm to change it, you need to pass it the -override => 1 option to your call to param.

The same thing shouldn't be happening when using the CGI::Application param method (which has absolutely no relation to the CGI.pm param method). So since you are not seeing the parameter you set in your runmode, then I have to think it was a coding mistake on your part, or you are expecting this info to stay persistent across multiple browser requests. Since you are taking about 'previous page' and 'next page', I am guessing that your problem is with persistence.

The first thing I would check is to make sure that your cgiapp_prerun is actually being executed during the request. Have you put a print statement in there to confirm that it is running?

Failing that, try using the CGI::Application::Plugin::Session plugin which will give you a session that is persistent across requests to see if that solves your problem

use CGI::Application::Plugin::Session; sub cgiapp_prerun { my $self = shift; $self->session->param(whatever => 123); } sub my_runmode { my $self = shift; my $whatever = $self->session->param('whatever'); }
  • Comment on Re: CGI::Application, the cgiapp_prerun mode, and CGI object interaction
  • Download Code

Replies are listed 'Best First'.
Re^2: CGI::Application, the cgiapp_prerun mode, and CGI object interaction
by geektron (Curate) on Oct 17, 2005 at 01:20 UTC
    Guess I didn't step away enough to have it make sense to anyone else....

    That said, here's some code:

    sub cgiapp_prerun { my $self = shift; my $dbh = $self->{DBH} = $self->param('DBH'); ### let's check for storage; my $previousClass = $self->query->param('this'); my $className = "DataClasses::${previousClass}"; if ( $className->SUPER::can( 'new' ) and $className->SUPER::can( 'store') ) { my $object = $className->new( DBH => $dbh, REQUEST => $request ); ## the needStorage method allows us to ## have multiple "screens" using the same class ## where not all of them store in the DB $object->store() if $object->needStorage(); } } }
    and the store() method ...
    sub store { my ( $self, %params )_ = @_; ### if insert ... $self->query->param( -name => 'whatever', -value => '123'); $self->param( 'whatever', '123' ); return 1; }
    both methods of stashing the value until the runmode is executed failed. as i've understood the calling stack:

    CGI::App->new() -> prerun -> setup -> "runmode" -> teardown

    so i don't see how something set in one mode wouldn't carry into another, because it's the same "run cycle".

      My recommendation would be to start trimming your code down until things start working. The way you are calling $self->param(...) should work fine, and that value should be recoverable from within your runmode.

      I'll ask again, are you sure that code is being executed? Try the following and you will see that your concept should work fine. Just save all of it into one file, and run it from the command line:

      #!/usr/bin/perl { package TestApp; use base qw(CGI::Application); use CGI qw(:standard); sub setup { my $self = shift; $self->run_modes([qw(start)]); } sub cgiapp_prerun { my $self = shift; print STDERR "calling cgiapp_prerun\n"; $self->param( test => 123 ); } sub start { my $self = shift; my $test = $self->param('test'); print STDERR "test: $test\n"; return qq{<html><body><h1>test: $test</h1></body></html>}; } } TestApp->new->run;

      I have one more question for you. Do you have the following line in your code somewhere?

      use CGI qw(:standard);

      If so, then remove it and things will most likely start to work for you.

        I haven't imported CGI. i leave that up to CGI::Application.

        i'm sure the code's being executed, because i've watched the error log, and I see the warnings i've tossed in to check the values.

        i have a feeling it's a problem in my inheritance, but i had to move on to another part of the code to get a little more done on the app.