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, CGI.pm'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:
- 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).
- 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.
- 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
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
|
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.