views:

218

answers:

2

I try to create a form that can save a person's form data so that he can later finish completing the form. I have no problem to save the data to an external file and I know that it would be easy to do what I try to do if the user was permitted to save his data only once a full page form was completed. However, I want to be able to save the data of the form at any time, even if one of multiple pages have not been fully completed. Also, I like to use my own html scripting through my Perl scripts instead of calling CGI.pm form commands.

So the user saves his incomplete data at the end of a session and log in with a password at a later time to retrieve his data. So I retrieve data from the external file based on the password using

#--------------------------------------------
open(INFO, "MYTEXTFILE.txt");
   @data = <INFO>;
close(INFO);
#--------------------------------------------
foreach $key (@data)  
{  
  ($aaa1,$aaa2,$aaa3,$aaa4,$aaa5,$e)=split(/,/,$key);
}

And then I try to input the available data back into the html form. This is pretty easy when data have been collected with text-boxes:

 print"
 <p>Your response is: input type='text' name='aaa1' value='$aaa1' <\p>";

But more tricky when it is a radiobutton. I use:

 print"
 <table width='600' align='center' cellpadding='3'>
 <tr bgcolor=''>
           td bgcolor=''>1. Question #1                     
 </td>
 <td>1
 <input name='aaa1' type='radio' value='1'"; if ($aaa1==1) {print " CHECKED ";} print"/>/td>
 <td>2
 <input name='aaa1' type='radio' value='2'"; if ($aaa1==2) {print " CHECKED ";} print" />/td>
 <td>3
 <input name='aaa1' type='radio' value='3'"; if ($aaa1==3) {print " CHECKED ";} print" />/td>
 <td>4
 <input name='aaa1' type='radio' value='4'"; if ($aaa1==4) {print " CHECKED ";} print" />/td>
<td>5
<input name='aaa1' type='radio' value='5'"; if ($aaa1==5) {print " CHECKED ";} print" />/td>
</tr>
</table>
";

Is there a more convenient or handy way to do it?

+1  A: 

Your output contains almost the same text and code repeating 5 times. Using a for loop would be more convenient.

mobrule
+2  A: 

Yes there's an easier way.

foreach my $value (1,2,3,4,5) {
    my $checked = ($aaa1 == $value) ? "CHECKED " : "";
    print "<td>$value <input name='aaa1' type='radio' value='$value' $checked/></td>\n";
}

However, if you insist on hand-rolling your own templating solution (as opposed to using a great number of existing Perl templating ones), you should do it the RIGHT way. Have generic methods for various input types, etc...

Also, as others have pointed out in comments, there's a REASON for separating code from HTML via a templating solution - it greatly simplifies maintenance.

DVK