faq(3)
NAME
Template::FAQ - Frequently Asked Questions about the Tem
plate Toolkit
DESCRIPTION
This is the Frequently Asked Questions list for the Tem
plate Toolkit. More accurately, it's a very thin place
holder for where the FAQ will soon be.
Template Toolkit Language
Why doesn't [% a = b IF c %] work as expected?
- Because the parser interprets it as
- [% a = (b IF c) %]
- Do this instead:
[% SET a = b IF c %]- If I'm using TT to write out a TT template, is there a good way to escape [% and %]?
- You can do this:
[% stag = "["etag = "%]"- %]
- and then:
[% stag; 'hello'; etag %]- Or something like:
[% TAGS [- -] %]
[- INCLUDE foo -] # is a directive
[% INCLUDE foo %] # not a directive, just plain text,- passed through
Plugins
How do I get the Table plugin to order data across rather
than down?
- Order the data into rows:
- Steve Karen Jeff
Brooklyn Nantucket Fairfax
NY MA VA - [% USE table(data, rows=3) %]
- Then ask for each column
[% FOREACH column = table.cols %]- And then print each item in the column going across the
output rows
[% FOREACH item = column %]<td>[% item %]</td>- [% END %]
- Accessing Cookies
- Jeff Boes <boes@nexcerpt.com> asks:
Does anyone have a quick-n-dirty approach to accessing
cookies from templates?- Jonas Liljegren answers:
[% USE CGI %]- <p>The value is [% CGI.cookie('cookie_name') | html %]
Extending the Template Toolkit
Can I serve templates from a database?
Short answer: yes, Chris Nandor has done this for Slash.
You need to subclass Template::Provider. See the mailing
list archives for further info.
Can I fetch templates via http?
- To do the job properly, you should sublcass Tem
plate::Provider to Template::Provider::HTTP and use a PRE
FIX_MAP option to bind the 'http' template prefix to that
particular provider (you may want to go digging around in
the Changes file around version 2.01 for more info on PRE FIX_MAP - it may not be properly documented anywhere
else...yet!). e.g. (untested due to lack of existing HTTP
Provider - patches welcome!). - use Template::Provider::HTTP;
- my $file = Template::Provider( INCLUDE_PATH => [...]
- );
my $http = Template::Provider::HTTP->new(...);
my $tt2 = Template->new({LOAD_TEMPLATES => [ $file, $http ],
PREFIX_MAP => {file => '0', # file:foo.html
http => '1', # http:foo.html
default => '0', # foo.html =>file:foo.html} - });
- Now a template specified as:
[% INCLUDE foo %]- will be served by the 'file' provider (the default). Oth
erwise you can explicitly add a prefix:
[% INCLUDE file:foo.html %]
[% INCLUDE http:foo.html %]
[% INCLUDE http://www.xyz.com/tt2/header.tt2 %]- This same principal can be used to create a DBI template
provider. e.g.
[% INCLUDE dbi:foo.html %]- But similarly, alas, we don't yet have a DBI provider as
part of the Template Toolkit. There has been some talk on
the mailing list about efforts to develop DBI and/or HTTP
providers but as yet no-one has stepped forward to take up
the challenge... - In the mean time, Craig's post from the mailing list has
some useful pointers on how to acheive this using existing
modules:
To: Adam Theo <adamtheo@theoretic.com>
From: Craig Barratt <craig@arraycomm.com>
Date: Fri, 18 May 2001 17:06:59 -0700- > i was wondering if there is anyway to fetch a file
- using http:// or
> ftp:// and include that? - Here's one way. Set the LOAD_PERL option:
use Template;my $template = Template->new({LOAD_PERL => 1});
$template->process("example.tt", { stdout => *STDOUT })|| die $template->error(); - and then use LWP::UserAgent and HTTP::Request:
[%USE ua = LWP.UserAgent;
ua.proxy("http", "http://your_proxy/");
USE req = HTTP.Request("GET","http://www.cpan.org");
ua.request(req).content;- -%]
- For FTP use Net::FTP:
[%USE ftp = Net.FTP("ftp.cpan.org");
x = ftp.login("anonymous", "me@here.there");
x = ftp.cwd("/");
x = ftp.get("welcome.msg", stdout);
x = ftp.quit;- -%]
- Normally ftp.get would write the file into the current
- directory.
Instead we pass stdout as a second argument so that it - is written
to stdout. We set stdout to STDOUT in the variables - we pass to
process. - Craig
Miscellaneous
How can I configure variables on a per-request basis?
One easy way to acheive this is to define a single
PRE_PROCESS template which loads in other configuration
files based on variables defined or other conditions.
- For example, my setup usually looks something like this:
- PRE_PROCESS => 'config/main'
- config/main:
[% DEFAULT style = 'text'section = template.section or 'home';- PROCESS config/site
- + config/urls
+ config/macros
+ "config/style/$style"
+ "config/section/$section"
+ ... - %]
- This allows me to set a single 'style' variable to control
which config file gets pre-processed to set my various
style options (colours, img paths, etc). For example: - config/style/basic:
[% style = {name = style # save existing 'style' var as'style.name'# define various other style variables....
col = {back => '#ffffff'
text => '#000000'
# ...etc...}logo = {# ...etc...}# ...etc...- }
- %]
- Each source template can declare which section it's in via
a META directive:
[% METAtitle = 'General Information'
section = 'info'- %]
- ...
- This controls which section configuration file gets loaded
to set various other variables for defining the section
title, menu, etc. - config/section/info:
[% section = {name = section # save 'section' var as'section.name'
title = 'Information'
menu = [ ... ]
# ...etc...- }
- %]
- This illustrates the basic principal but you can extend it
to perform pretty much any kind of per-document initiali
sation that you require.
AUTHOR
Andy Wardley <abw@andywardley.com>
<http://www.andywardley.com/|http://www.andywardley.com/>
VERSION
2.54, distributed as part of the Template Toolkit version
2.08, released on 30 July 2002.
COPYRIGHT
- Copyright (C) 1996-2002 Andy Wardley. All Rights Re
- served.
Copyright (C) 1998-2002 Canon Research Centre Europe - Ltd.
- This module is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.