Beyond the Basics |
Using Templates |
Christopher
Moderator
Member Rara Avis
since 1999-08-02
Posts 8296Purgatorial Incarceration |
Hello class! My question today has to do with the use of templates. Specifically speaking this moment, in using a template to read into the PERL program, then to write out to HTML... So far, I've been able to accomplish part of this, using: ********** open(TEMPLATE, 'template.txt'); while(<TEMPLATE> { print $_ } close(TEMPLATE); ********** This works great here: http://countlesshorizons.com/test/form5-2.htm ... but as you can see from the output, I don't know how to include the variables from a template file... or rather, how to make them be read as variables. I figure that worst case, I could do the template in two parts like such: ********** open(TEMPLATE1, 'header.txt'); while(<TEMPLATE1> { print $_ } close(TEMPLATE1); print $variable1; print $variable2; print $variable3; print $variable4; print $variable5; print $etc; open(TEMPLATE2, 'footer.txt'); while(<TEMPLATE2> { print $_ } close(TEMPLATE2); ********** Where the top part prints out the beginning html, down to the beginning of a table data cell where the variable info would be printed, then finished up with the last one. Is there another way though... maybe one where I can read in a template file and have the variables read from it? Thanks C Code for above link: HTML ********** <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Submit your Poems, Stories & Artwork</title> <br><br> <form method="post" action="../cgi-bin/test/test5-2.pl"> <div align="center"> <table width="500" bgcolor="#6699cc" cellpadding="0" cellspacing="0" border="0"> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Your Name</strong> </td> </tr> <tr> <td height="30" valign="top"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><input type="text" name="name" size="30" maxlength="50"> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Your Email Address</strong> </td> </tr> <tr> <td height="30" valign="top"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><input type="text" name="email" size="30" maxlength="50"> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Category</strong> </td> </tr> <tr> <td height="30" valign="top"> <img src="imgs/1.gif" width="1" height="1" hspace="35"> <select name="category" size="1"> <option value="poetry">Poetry <option value="prose">Prose <option value="prosen">Prose Non-Fiction <option value="essay">Essay / Article <option value="other">Other <option value="comments">Comments / Suggestions </select> <br> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Optional</strong> </td> </tr> <tr> <td height="30" valign="top"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><textarea name="bio" cols="42" rows="5">Brief description about yourself, including prior publications and/or homepage links. If you have an existing bio, this will replace it.</textarea> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Title of Submission</strong> </td> </tr> <tr> <td height="30" valign="top"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><input type="text" name="title" size="30" maxlength="50"> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><strong>Submission</strong> </td> </tr> <tr> <td height="30" valign="bottom"> <img src="imgs/1.gif" width="1" height="1" hspace="35"><textarea name="sub" cols="42" rows="20">Please include any formatting, including HTML.</textarea> </td> </tr> <tr> <td height="10" valign="top"> <br> <div align="center"><input type="submit" value=" Submit "><input type="reset" value=" Reset "></div> <br> </td> </tr> </table> </div> </form> <br> </body> </html> ********** PERL ********** #!/usr/local/bin/perl #input in &inputIn; #sub to read and parse input and place into array sub inputIn { if ($ENV{'REQUEST_METHOD'} eq 'GET') {$formInfo = $ENV{'QUERY_STRING'};} else {read(STDIN, $formInfo, $ENV{'CONTENT_LENGTH'});} @inputPairs = split (/[&;]/, $formInfo); %input = (); foreach $pair (@inputPairs) { $pair =~ s/\+/ /g; ($name, $value) = split (/=/, $pair); $name =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; $value =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; $input{$name} = $value; } } #get date &getDate; #sub gets date and time sub getDate { ($sec,$min,$hr,$day,$month,$year,$day_of_week,$day_of_year,$some) = localtime(time); @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); #convert to 'real' year $year = $year + 1900; } #enter how many hours to subtract from server $zone = 3 #get time zone &timeZone; #sub for time zone sub timeZone { $hr = $hr - $zone; } #define variable names from form $name = $input{'name'}; $email = $input{'email'}; $bio = $input{'bio'}; $category = $input{'category'}; $title = $input{'title'}; $Sub = $input{'sub'}; $refURL = $ENV{HTTP_REFERER}; #fixes carraige returns for htm printout $SubHTM = $input{'sub'}; $SubHTM =~ s/\n/<br>/g; $SubHTM =~ s/\r//g; #month/day/year/hour/minutes $shortDate = "$months[$month] $day, $year at $hr:$min"; &catFind; #sub to determine which editors to send to sub catFind { if ($category eq 'poetry') {$email2 = 'poetry@countlesshorizons.com';} elsif ($category eq 'prose') {$email2 = 'prose@countlesshorizons.com';} elsif ($category eq 'prosen') {$email2 = 'prosen@countlesshorizons.com';} elsif ($category eq 'essay') {$email2 = 'essay@countlesshorizons.com';} elsif ($category eq 'other') {$email2 = 'other@countlesshorizons.com';} elsif ($category eq 'comments') {$email2 = 'comments@countlesshorizons.com';} else {$email2 = 'UNKNOWN';} } #subject 1 = to submitter #subject 2 = to editors $subject1 = "Thank you for Submitting \"$title\" to Countless Horizons"; $subject2 = "$name has submitted the $category piece \"$title\" to CH"; #path to sendmail $sendmail = "/usr/lib/sendmail -t -oi"; #send email to submitter &sendMail1; #sub for email sub sendMail1 { open (MAIL, "| $sendmail") or die "Couldn't open sendmail: "; print MAIL "From: $email2\n"; print MAIL "To: $email\n"; print MAIL "Subject: $subject1\n\n"; print MAIL "$Sub\n"; close MAIL; } #send email to editors &sendMail2; #sub for email2 sub sendMail2 { open (MAIL, "| $sendmail") or die "Couldn't open sendmail: "; print MAIL "From: $email\n"; print MAIL "To: $email2\n"; print MAIL "Subject: $subject2\n\n"; print MAIL "$Sub\n"; close MAIL; } #start page &header; open(TEMPLATE, 'template.txt'); while(<TEMPLATE> { print $_ } close(TEMPLATE); #end page &footer; #subs for html header and footer sub header { print "Content-type: text/html\n\n"; } sub footer { print qq~</body></html>~; } ********** TEMPLATE ********** <html><head><title>Printing Variables</title></head><body> <p>Name of Submitter: <strong>$name</strong></p> <p>Email of Submitter: <a href="$email">$email</a></p> <p>Bio of submitter:<br><br><hr width="250" align="left"><strong>$bio</strong><br><hr width="250" align="left"><br></p> <p>Category Chosen: <strong>$category</strong></p> <p>Category Chosen 2: <strong>$email2</strong></p> <p>Title: <strong>$title</strong></p> <p>Sub w/o adj.: <i>$Sub</i></p> <p>Sub w/adj.: <br><br><hr width="250" align="left"><strong>$SubHTM</strong><br><hr width="250" align="left"><br></p> <p>Referring URL: <a href="$refURL">$refURL</a></p> <p>Time is: <strong>$shortDate</strong></p> ********** Ron, if you get this far down, would you mind considering giving us this: [hr width=350] That would be appreciated!...though I could probably use a quote, huh...next time Peace |
||
© Copyright 2001 C.G. Ward - All Rights Reserved | |||
Ron
Administrator
Member Rara Avis
since 1999-05-19
Posts 8669Michigan, US |
I do this all the time, Chris. Once in a great while it gets tricky (usually when adding entire rows to a table), but usually it's pretty straight forward. A fragment of the HTML template might look like this: <input type="text" name="name" size="30" maxlength="50" value="**name**"> <input type="text" name="email" size="30" maxlength="50" value="**email**"> The matching Perl code then looks something like this: open(TEMPLATE, 'template.txt'); @Page = <TEMPLATE>; close(TEMPLATE); foreach $line(@Page) { $line =~ s/\*\*name\*\*/$SenderName/; $line =~ s/\*\*email\*\*/$emailaddy/; print $line; } |
||
Kit McCallum
Administrator
Member Laureate
since 2000-04-30
Posts 14774Ontario, Canada |
Nothing important to add, just I really do love this stuff, LOL. |
||
Christopher
Moderator
Member Rara Avis
since 1999-08-02
Posts 8296Purgatorial Incarceration |
OK - I haven't tried this yet, though I will in a moment. However, whether I can get it to work means little in my way of actually understanding it. I think one of the downsides to not learning in a structured environment is that you may pass over some things which can be needed later. Ok, I see that you've demarked the names of the form fields with the asterisks preceding and following... I am assuming that those can be any set of charaters, only needing to be matched by the following portion of code...? Next, you open template.txt, assigning it the name of TEMPLATE, read it into the array "@page", then close the file since yu have it now. Then you're telling it that for each line in the new array that matches the $page variable, to print out... you're saying that the $page = (then this part I don't wholly understand... what does the "s/" represent?) \* (backslash allowing the character instead of seeing it as 'multiply') name /$variableName/; (is this last part telling it to substitute the appropriate variable in place of the particular **email** name? I think so, but not wholly sure, since I don't know what the /s means Anyway, thank you, I will go play with it now. Please let me know what that means and if I'm off track on anything! Kit - glad someone besides Ron and I are enjoying playing around in here... it might get lonely otherwise! C |
||
Ron
Administrator
Member Rara Avis
since 1999-05-19
Posts 8669Michigan, US |
quote: Yep. And now you should also know what the "s" represents… All of your other assumptions are correct, too. |
||
Christopher
Moderator
Member Rara Avis
since 1999-08-02
Posts 8296Purgatorial Incarceration |
rockin'!!! One step closer to the holy grail. Cool - now I have to decide what to tackle next... hmmm... how about form validation and cookies... cool. Thanks Ron! C |
||
Kit McCallum
Administrator
Member Laureate
since 2000-04-30
Posts 14774Ontario, Canada |
Great Chris! I'll watch for the next class ... thanks for the lesson gentlemen! |
||
⇧ top of page ⇧ | ||
All times are ET (US). All dates are in Year-Month-Day format. |