HTML-Template

 view release on metacpan or  search on metacpan

lib/HTML/Template/FAQ.pm  view on Meta::CPAN

introduces a separate scope for C<my> variables.

If you want your C<< <TMPL_VAR> >>s to be global you can set the
C<global_vars> option when you call C<new()>. See above for documentation
of the C<global_vars> C<new()> option.

=head2 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 C<return unless> line to specify
the extension you use for your template files - I use F<.tmpl>, as you
can see. You'll also need to specify the path to your template files.

One potential problem: the F</path/to/templates/> must be B<EXACTLY> the
same path you use when you call C<< 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 C<cache_debug => 1> in your
application code and look for "CACHE MISS" messages in the logs.

=head2 What characters are allowed in TMPL_* names?

Numbers, letters, '.', '/', '+', '-' and '_'.

=head2 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 L<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 L<HTML::Template::Expr>. Using
L<HTML::Template::Expr> it should be easy to write a C<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 L<HTML::Template::Expr> in the first place.

=head2 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 L<CGI.pm>'s excellent C<popup_menu()> and C<scrolling_list()>
functions to fill in a single C<< <tmpl_var select_foo> >> variable.

To some people this smacks of mixing HTML and code in a way that
they hoped L<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 C<< <form> >> tags and the layout of the C<< <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 C<< <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 L<HTML::FillInForm> which some have
reported success using to solve this problem.



( run in 0.980 second using v1.01-cache-2.11-cpan-364913b4093 )