Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: Sticky Forms

by ChemBoy (Priest)
on Apr 16, 2007 at 16:12 UTC ( [id://610391] : note . print w/replies, xml ) Need Help??

in reply to Sticky Forms

It is true that CGI has sticky form elements by default. Your problem is that nobody has explained exactly what is meant, in this situation, by "sticky form elements." So let me give it a shot.

At a basic level,'s stickiness consists of exactly this: when you submit a form, via GET or POST, to a script that uses the functions (or methods) defined in the module CGI both to parse its input and to generate a new form in its output, then form elements in the output that have the same name as form elements that were parsed as part of the input will, unless otherwise specified (usually using the -value and -force arguments to the code-generating method or subroutine), be pre-populated with the values that they had in the incoming GET or POST request.

Clear as mud? Was afraid of that...

To put it in more relevant terms for you: for your form to be pre-populated with the values from a previous invocation, the script has to get those values from the browser when it's called. So your strategy of having a separate script to validate, with a simple hard-coded link back to the original script for corrections, cannot possibly work. However, you have various options that can work, with greater or lesser amounts of work on your part:

  1. Combine your validation and correction scripts. That is, instead of having one script issue the form and another validate its inputs, have one script that does both. Then, instead of a link back to the original form, you simply print some explanatory message ("Your input was missing values Y, Z, and X"), and print the form again. This will get you your sticky values automatically (assuming you're using CGI to print out your form elements, of course).
  2. Change the link back from the validation page to the input page from a hard-coded one to a dynamic one that includes the parameters you wish to have your input page pre-populated with. There are a couple of ways to do this, using the URI module or the messing around with the self_url method of your CGI object, none of which I really like very much or use often enough to be able to write an example off the cuff. Sorry.
  3. You can create a form on the validation page that does roughly the same job, only making the browser and CGI do all the work for you. Then instead of a link back, you'll have a submit button. This one I am willing to illustrate (though I don't necessarily endorse it):
    my $hidden_form = $cgi->start_form( -name=>"resubmission, -method=>"POST", -action=>$input_cgi_location, ); foreach my $p ($cgi->param) { $hidden_form .= $cgi->hidden($p); } $hidden_form .= $cgi->submit( -name=>"resubmitted", -value=>"Return to input form", ); $hidden_form .= $cgi->end_form;
    (Please note that the above is not in any way tested.)

I hope some of that was helpful—good luck!

If God had meant us to fly, he would *never* have given us the railroads.
    --Michael Flanders