[Perl] Template::Toolkit 模板技术.

Apr 1st, 2010

转载本站文章请注明,转载自:扶凯[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 $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('/') %]
 

 Hash 在模板中的解析

$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 %]

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. paster
    Aug 29th, 2010 at 04:01
    Reply | Quote | #3

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