Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
Template::FAQ(3)      User Contributed Perl Documentation     Template::FAQ(3)

       Template::FAQ - Frequently Asked	Questions about	the Template Toolkit

Template Toolkit Language
   Why doesn't [% a = b	IF c %]	work as	expected?
       There's a limitation in the TT2 parser which means that the following
       code doesn't work as you	might expect:

	   [% a	= b IF c %]

       The parser interprets it	as an attempt to set "a" to the	result of "b
       IF c", like this:

	   [% a	= (b IF	c) %]

       If you want to set "a = b" only if "c" is true, then do this instead:

	   [% SET a = b	IF c %]

       The explicit "SET" keyword gives	the parser the clue it needs to	do the
       right thing.

       NOTE: this will be fixed	in TT3

   If I'm using	TT to write out	a TT template, is there	a good way to escape
       [% and %]?
       You can do something like this:

	   [% stag = "[\%"
	      etag = "%\]"

       and then:

	   [% stag; 'hello'; etag %]

       Or you can use the "TAGS" directive, like so:

	   [% TAGS [- -] %]
	   [- INCLUDE foo -]   # is a directive
	   [% INCLUDE foo %]   # not a directive

   How do I iterate over a hash?
       This is covered in the Template::Manual::VMethods section of the
       manual. A list of all the keys that are in the hash can be obtained
       with the	"keys" virtual method. You can then iterate over that list and
       by looking up each key in turn get the value.

	   [% FOREACH key = product.keys %]
	      [% key %]	=> [% product.$key %]
	   [% END %]

   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 <> 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

   Can I fetch templates via http?
       To do the job properly, you should subclass Template::Provider to
       "Template::Provider::HTTP" and use a "PREFIX_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
       "PREFIX_MAP" - it may not be properly documented	anywhere else...yet!).

	   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).  Otherwise you can
       explicitly add a	prefix:

	   [% INCLUDE file:foo.html %]
	   [% INCLUDE http:foo.html %]
	   [% INCLUDE	%]

       This same principal can be used to create a DBI template	provider.

	   [% INCLUDE dbi:foo.html %]

       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 Barrat's	post from the mailing list has some
       useful pointers on how to achieve this using existing modules.  See

   How can I find out the name of the main template being processed?
       The "template" variable contains	a reference to the Template::Document
       object for the main template you're processing (i.e. the	one provided
       as the first argument to	the Template process() method).	 The "name"
       method returns its name.

	   [% %]	   # e.g. index.html

   How can I find out the name of the current template being processed?
       The "template" variable always references the main template being
       processed.  So even if you call [% INCLUDE header %], and that calls [%
       INCLUDE menu %],	the "template" variable	will be	unchanged.


	   [%  %]	    # index.html
	   [% INCLUDE header %]


	   [%  %]	    # index.html
	   [% INCLUDE menu   %]


	   [%  %]	    # index.html

       In contrast, the	"component" variable always references the current
       template	being processed.


	   [% %]	    # index.html
	   [% INCLUDE header %]


	   [% %]	    # header
	   [% INCLUDE menu   %]


	   [%  %]     # menu

   How do I print the modification time	of the template	or component?
       The "template" and "component" variables	reference the main template
       and the current template	being processed	(see previous questions).  The
       "modtime" method	returns	the modification time of the corresponding
       template	file as	a number of seconds since the Unix epoch (00:00:00 GMT
       1st January 1970).

       This number doesn't mean	much to	anyone (except perhaps serious Unix
       geeks) so you'll	probably want to use the Date plugin to	format it for
       human consumption.

	   [% USE Date %]
	   [% %] last modified [%	Date.format(template.modtime) %]

   How can I configure variables on a per-request basis?
       One easy	way to achieve 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'


	   [%  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:


	   [%  style = {
		   name	= style	   # save existing 'style' var as ''

		   # 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

	 [% META
	      title   =	'General Information'
	      section =	'info'

       This controls which section configuration file gets loaded to set
       various other variables for defining the	section	title, menu, etc.


	   [%  section = {
		   name	  = section  # save 'section' var as ''
		   title  = 'Information'
		   menu	  = [ ... ]
		   # ...etc...

       This illustrates	the basic principal but	you can	extend it to perform
       pretty much any kind of per-document initialisation that	you require.

   Why do I get	rubbish	for my utf-8 templates?
       First of	all, make sure that your template files	define a Byte Order
       Mark <>

       If you for some reason don't want to add	BOM to your templates, you can
       force Template to use a particular encoding (e.g. "utf8") for your
       templates with the "ENCODING" option.

	   my $template	= Template->new({
	       ENCODING	=> 'utf8'

Questions About	This FAQ
   Why is this FAQ so short?
       Because we don't	have anyone maintaining	it.

   Can I help?
       Yes please :-)

perl v5.32.1			  2019-01-04		      Template::FAQ(3)

NAME | Template Toolkit Language | Plugins | Extending the Template Toolkit | Miscellaneous | Questions About This FAQ

Want to link to this manual page? Use this URL:

home | help