GNU/Linux |
Debian 7.3.0(Wheezy) |
|
![]() |
HTML::Template::FAQ(3pm) |
![]() |
HTML::Template::FAQ − Frequently Asked Questions about HTML::Template
In the interest of greater understanding I’ve started a FAQ section of the perldocs. Please look in here before you send me email.
Is there a
place to go to discuss HTML::Template and/or get help?
There’s a mailing-list for discussing HTML::Template
at html−template−users@lists.sourceforge.net.
Join at:
http://lists.sourceforge.net/lists/listinfo/html−template−users
If you just want to get email when new releases are available you can join the announcements mailing-list here:
http://lists.sourceforge.net/lists/listinfo/html−template−announce
Is there a
searchable archive for the mailing-list?
Yes, you can find an archive of the SourceForge list
here:
http://dir.gmane.org/gmane.comp.lang.perl.modules.html−template
I want
support for < TMPL_XXX >! How about
it?
Maybe. I definitely encourage people to discuss their ideas
for HTML::Template on the mailing list. Please be ready to
explain to me how the new tag fits in with
HTML::Template’s mission to provide a fast,
lightweight system for using HTML
templates.
NOTE: Offering to program said addition and provide it in the form of a patch to the most recent version of HTML::Template will definitely have a softening effect on potential opponents!
I found a
bug, can you fix it?
That depends. Did you send me the VERSION of
HTML::Template, a test script and a test template? If so,
then almost certainly.
If you’re feeling really adventurous, HTML::Template is publicly available on GitHub (https://github.com/mpeters/html−template). Please feel free to fork it and send me a pull request with any changes you have.
<
TMPL_VAR >s from the main template
aren’t working inside a < TMPL_LOOP
>! Why?
This is the intended behavior.
"<TMPL_LOOP>" introduces a separate
scope for "<TMPL_VAR>s" much like a
subroutine call in Perl introduces a separate scope for
"my" variables.
If you want your "<TMPL_VAR>"s to be global you can set the "global_vars" option when you call "new()". See above for documentation of the "global_vars" "new()" option.
How can I
pre-load my templates using cache-mode and mod_perl?
Add something like this to your startup.pl:
use HTML::Template; use File::Find; print STDERR "Pre−loading HTML Templates...\n"; find( sub { return unless /\.tmpl$/; HTML::Template−>new( filename => "$File::Find::dir/$_", cache => 1, ); }, '/path/to/templates', '/another/path/to/templates/' );
Note that you’ll need to modify the "return unless" line to specify the extension you use for your template files − I use .tmpl, as you can see. You’ll also need to specify the path to your template files.
One potential problem: the /path/to/templates/ must be EXACTLY the same path you use when you call "HTML::Template−>new()". Otherwise the cache won’t know they’re the same file and will load a new copy − instead getting a speed increase, you’ll double your memory usage. To find out if this is happening set "cache_debug =" 1> in your application code and look for " CACHE MISS " messages in the logs.
What
characters are allowed in TMPL_* names?
Numbers, letters, ’.’, ’/’,
’+’, ’−’ and
’_’.
How can I
execute a program from inside my template?
Short answer: you can’t. Longer answer: you
shouldn’t since this violates the fundamental concept
behind HTML::Template − that design and code should be
separate.
But, inevitably some people still want to do it. If that describes you then you should take a look at HTML::Template::Expr. Using HTML::Template::Expr it should be easy to write a "run_program()" function. Then you can do awful stuff like:
<tmpl_var expr="run_program('foo.pl')">
Just, please, don’t tell me about it. I’m feeling guilty enough just for writing HTML::Template::Expr in the first place.
What’s
the best way to create a <select> form element using
HTML::Template?
There is much disagreement on this issue. My personal
preference is to use CGI .pm’s
excellent "popup_menu()" and
"scrolling_list()" functions to fill in a
single "<tmpl_var select_foo>"
variable.
To some people this smacks of mixing HTML and code in a way that they hoped HTML::Template would help them avoid. To them I’d say that HTML is a violation of the principle of separating design from programming. There’s no clear separation between the programmatic elements of the "<form>" tags and the layout of the "<form>" tags. You’ll have to draw the line somewhere − clearly the designer can’t be entirely in charge of form creation.
It’s a balancing act and you have to weigh the pros and cons on each side. It is certainly possible to produce a "<select>" element entirely inside the template. What you end up with is a rat’s nest of loops and conditionals. Alternately you can give up a certain amount of flexibility in return for vastly simplifying your templates. I generally choose the latter.
Another option is to investigate HTML::FillInForm which some have reported success using to solve this problem.
![]() |
HTML::Template::FAQ(3pm) | ![]() |