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


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

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".

Replies are listed 'Best First'.
Re^3: CGI::Application, the cgiapp_prerun mode, and CGI object interaction
by cees (Curate) on Oct 17, 2005 at 01:58 UTC

    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.