[Perl Module] Template::Toolkit 模板技术.
转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]
本文链接: http://www.php-oa.com/2010/04/01/perl-template-toolkit.html
Template::Toolkit, 简称TT, 它本身是一套非常强大的模块,我发现它比 HTML::Template 更加强大的模板.可以用超强来讲.可以给复杂变量传到模板里(比如数组,哈希),也可以在模板里定义这些变量,模板中可以用逻辑,包括IF ELSE 结构和各种循环结构, 有很多与定义的 Vmethod (虚方法)可以调用,这个很好用的,支持扩展其功能的 Plugin.还有什么 过滤器 filter 之类.
想了解 HTML::Template 可以看我以前的文章, perl的HTML::Template模板技术.
Template::Toolkit简单的例子
use Template;
# 建一个 TT 的对象
my $tt = Template->new({
INCLUDE_PATH => '/template/path',
INTERPOLATE => 1,
}) || die "$Template::ERROR\n";
my $vars = {
var => "放入模板的内容",
};
# 使用
my $templateFile = 'template.tt';
my $outputContent;
$tt->process($templateFile, $vars, $outputContent) || die $tt->error();
print $outputContent;
template.tt 的文件内容
这里出现的是: [% var %]
通过上面可以看到,是使用置换变量来定义$vars中.
Template::Toolkit Config 的常用参数
- INCLUDE_PATH 也就是你的template文件所放置的位置,可以指定不只一个路径.
- EVAL_PERL 这个选项是设定是否让你的Template执行Perl的区块.
- POST_CHOMP 这个选项跟chomp函数有一些类似,它可以帮你去除使用者参数的空白字符.
- PRE_PROCESS 设定所有的模板在被载入之后,都必须预先执行某个程序,例如先把档头输出到模板中等等.
Template Toolkit 和 HTML::Template 最大的分别之一就是可以有自己对变量进行处理
[% INCLUDE %] 插入其它模板到当前模板中
[% INCLUDE copyright.tt2 %]
这个方便吧,多个模板,时相当的方便.只要修改一下 copyright.tt2 的文件,整个模板系统都会改变.
Template::Toolkit 模板小语言使用方法
在这和 HTML::Template 这个就很接近了,其实这些叫内部语言,也叫小语言,就是在语言本身内部在定义了一些语言.这个就是在 Template::Toolkit 中内部自己的一些语法功能.
GET 相关功能
[% variable %] [% hash.key %] [% list.n %] [% code(args) %] [% obj.meth(args) %] [% "value: $var" %]
SET 相关功能
[% variable = other_variable
variable = 'literal text @ $100'
variable = "interpolated text: $var"
list = [ val, val, val, val, ... ]
list = [ val..val ]
hash = { var => val, var => val, ... }
%]
FOREACH 函数
[% FOREACH variable = [ val, val, val ] %] # either [% FOREACH variable IN hash.keys %] # or [% FOREACH variable = list %] # or [% FOREACH list %] # or content... [% variable %] [% END %]
WHILE 函数
[% WHILE condition %] content [% END %]
IF…ELSE…函数
[% IF condition %]
content
[% ELSIF condition %]
content
[% ELSE %]
content
[% END %]
SWITCH 函数
[% SWITCH variable %] [% CASE val1 %] content [% CASE [ val2, val3 ] %] content [% CASE %] # or [% CASE DEFAULT %] content [% END %]
Template::Toolkit 模板其它一些常用的技巧
(1. 直接写 Perl 程序
还有个奇怪的地方.想在模板里面写Perl程序,也只需要这么作:
[% PERL %]
perl content
[% END %]
(2. 使用 – 去掉换行
Hello [% a = 3 %] World [% a %]
这个输出的话为“Hello \nWorld 3\n”.而这么写可以把里面的 \n 去掉:
Hello [% a = 3 -%] World [% a -%]
输出为“Hello World 3”
(3. 合并两个 TT 代码
[% user.name %] [% END %]
可以写成
[% user.name; END %]
(4. INSERT 和 INCLUDE 的区别
INSERT 只是插入文件的内容而不管你是不是另一个 .tt 文件.而 INCLUDE 的话如果是另一个 .tt 文件的话会执行它.
比如你有一个文件叫 footer.tt, 内容为:
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet Catalyst [% CatalystVersion %].
当在另一个文件中调用 [% INSERT footer.tt %] 时输出的结果跟上面的会一样.里面的 [% CatalystVersion %] 是原封不动.而如果是用 [% INCLUDE footer.tt %] 的话里面的 [% CatalystVersion %] 会被执行为这个变量的值.
(5. BLOCK
比如你有段代码要执行两次.比如我有一个导航栏,需要上面放一个下面放一个.那我可以这么写:
[% show_guidebar = BLOCK %] [% IF prev_topic %] [% END %] [% show_guidebar %] content [% show_guidebar %]
(6. 注释
注释很简单,在 [% 后加上 # 那这一行就被注释掉了.唯一值得注意的是下面这两种是不一样的:
[%# a = 77
b = 88
%]
a: [% a %] b: [% b %]
输出 a: b:
而[% 和 # 中间空了一格后就只有注释一行而不是整个 [% %], 如:
[% # a = 77 b = 88 %] a: [% a %] b: [% b %]
输出 a: b: 88
(7. 修改 TT 的 [%%] 标签
如果要修改上面的[%%]标签,认为不好看的话,可以如下操作
my $template = Template->new({
START_TAG => quotemeta(' quotemeta('?>'),
});
那么刚刚在模板里的变量就应该改写成<? var ?>.
(8. 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('/') %]
(9 .复杂 Hash 在模板中的解析
复杂的 Hash 在 TT 中,因为我们的习惯被改变,所以会麻烦一些,不过,相信看了下面的例子就能知道怎么搞定了
$calendar{$year}{$month}{$day} = daynumber;
$c->stash->{calendar} = $calendar; # 需要给显示的内容存到 stash 中
使用下面的内容来解码
[% FOREACH year IN calendar.keys -%] [% FOREACH month IN calendar.$year -%] [% SET m = month.key %] [% FOREACH day IN calendar.$year.$m -%] [% SET d = day.key %] values = [% year %], [% month.key %], [% day.key %], day number = [% calendar.$year.$m.$d %] [% END %] [% END %] [% END %]
(10 在 TT 中使用 Data::Dumper
[% USE Dumper %] [% Dumper.dump(variable) %] [% Dumper.dump_html(variable) %]



















抄袭请保留出处,谢谢!
http://fayland.org/journal/Template_Configuration.html