Template::Toolkit, 简称TT, 它本身是一套非常强大的模块,我发现它比 HTML::Template 更加强大的模板.可以用超强来讲.可以给复杂变量传到模板里(比如数组,哈希),也可以在模板里定义这些变量,模板中可以用逻辑,包括IF ELSE 结构和各种循环结构, 有很多与定义的 Vmethod (虚方法)可以调用,这个很好用的,支持扩展其功能的 Plugin.还有什么 过滤器 filter 之类.
想了解 HTML::Template 可以看我以前的文章, perl的HTML::Template模板技术.
Template::Toolkit简单的例子
use Template;
# 建一个 TT 的对象
my $config = {
INCLUDE_PATH => '/template/path',
EVAL_PERL => 1,
};
my $template = Template->new($config);
my $vars = {
var => "放入模板的内容",
};
# 使用
my $templateFile = 'template.tt';
my $outputContent;
$template->process($template, $vars, $outputContent) || die $template->error();
print $output;template.tt 的文件内容
<title></title>
这里出现的是: [% var %]通过上面可以看到,是使用置换变量来定义$vars中.
Template::Toolkit Config 的常用参数
INCLUDE_PATH 也就是你的template文件所放置的位置,可以指定不只一个路径。
EVAL_PERL 这个选项是设定是否让你的Template执行Perl的区块。
POST_CHOMP 这个选项跟chomp函数有一些类似,它可以帮你去除使用者参数的空白字符。
PRE_PROCESS 设定所有的模板在被载入之后,都必须预先执行某个程序,例如先把档头输出到模板中等等。
Template Toolkit 和 HTML::Template 最大的分别之一就是可以有自己对变量进行处理
Template Toolkit 中使用数组
例如我们使用 Template 提供的 FOREACH 循环,来取一个数组的数据
程序写法
@array = (1, 2, 3, 4, 5, );模板写法
[% FOREACH array = arrays %]
数据:[% array %]
[% END %]Template Toolkit 中使用Hash,我们可以直接使用键值
程序写法
%hash = (
name => 'php-oa',
age => '23',
);
my $vars = { var => \%hash };模板写法
[% var.name%]
[% var.age %][% INCLUDE %] 插入其它模板到当前模板中
[% INCLUDE copyright.tt2 %]
这个方便吧,多个模板,时相当的方便.只要修改一下 copyright.tt2 的文件,整个模板系统都会改变.
Template::Toolkit 模板其它内部的标签
和 HTML::Template 这个就很接近了
while
[% WHILE condition %]
....
[% END %]if
[% IF condition %]
....
[% ELSE %]
....
[% END %]ELSIF
[% IF condition %]
....
[% ELSIF condition2 %]
....
[% ELSE %]
....
[% END %]直接写 Perl 程序
还有个奇怪的地方.想在模板里面写Perl程序,也只需要这么作:
[% PERL %]
# perl 程序码
....
[% END %]Template::Toolkit 模板其它一些常用的技巧
使用 - 去掉换行
Hello [% a = 3 %]
World [% a %]这个输出的话为“Hello \nWorld 3\n”。而这么写可以把里面的 \n 去掉:
Hello [% a = 3 -%]
World [% a -%]输出为“Hello World 3”
合并两个 TT 代码
[% user.name %][% END %]可以写成
[% user.name; END %]INSERT 和 INCLUDE 的区别
INSERT 只是插入文件的内容而不管你是不是另一个 .tt 文件。而 INCLUDE 的话如果是另一个 .tt 文件的话会执行它。
比如你有一个文件叫 footer.tt, 内容为:
| 以下是引用片段: Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href="http://catalyst.perl.org">Catalyst</a> [% CatalystVersion %]. |
当在另一个文件中调用 [% INSERT footer.tt %] 时输出的结果跟上面的会一样。里面的 [% CatalystVersion %] 是原封不动。而如果是用 [% INCLUDE footer.tt %] 的话里面的 [% CatalystVersion %] 会被执行为这个变量的值。
BLOCK
比如你有段代码要执行两次。比如我有一个导航栏,需要上面放一个下面放一个。那我可以这么写:
[% show_guidebar = BLOCK %]
<p>[% IF prev_topic %]<</p>
[% END %]
[% show_guidebar %]
...
[% show_guidebar %]注释
注释很简单,在 [% 后加上 # 那这一行就被注释掉了。唯一值得注意的是下面这两种是不一样的:
[%# a = 77
b = 88
%]
a: [% a %] b: [% b %]输出 a: b:
而[% 和 # 中间空了一格后就只有注释一行而不是整个 [% %], 如:
[% # a = 77
b = 88
%]
a: [% a %] b: [% b %]输出 a: b: 88
修改 TT 的 [%%] 标签
如果要修改上面的[%%]标签,认为不好看的话,可以如下操作
my $template = Template->new({
START_TAG => quotemeta(' quotemeta('?>'),
});那么刚刚在模板里的变量就应该改写成<? var ?>.
TT 进行时间显示
比如需要显示一个 2009-02-26这样一个格式的时间,而不希望改变Controller
Template::Plugin::Date 这个perl模块可以解决问题
例子:
[% USE date %]
[% date.format(date.now, '%y-%m-%d') %]这样就得到了2009-02-26
如果觉得不够用呢.还可以调用Date::Calc
[% calc = date.calc %]
[% calc.Monday_of_Week(22, 2001).join('/') %]