[Perl Module] 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 $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) %]

 

 

 

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