Category: Catalyst Keywords: Template TT
因为 TT 是个很庞大的系统,我们经常将 template 拆分为好几部分,然后在某一 .tt 文件中导入外部的文件。很明显,这么做最大的目的是代码复用/ code reuse. 带来的好处还有清晰的结构。
我上回在Template Toolkit 入门提过 INCLUDE 和 INSERT 的区别。
不过导入的指示符中我忘了讲另一个很重要的 PROCESS我们先用一个简单的例子解释下三者的区别。一个外部文件 ex.tt 如:
[% foo = 'bar' %]然后一个主文件:
foo = [% foo %] in External File.
[% foo = 'main' %]
foo = [% foo %] in Main
[% INSERT ex.tt %]
foo = [% foo %] in Main after insert/include/process
- 三种情况:
- 如代码所显示的是 [% INSERT 时,显示的结果为:
foo = main in Main
INSERT 的作用就是将文件原封不动的显示出来。
[% foo = 'bar' %]
foo = [% foo %] in External File.
foo = main in Main after insert/include/process - 将 [% INSERT 改为 [% INCLUDE 后将显示:
foo = main in Main
INCLUDE 将外部文件执行,然后将结果返回到主文件中。
foo = bar in External File.
foo = main in Main after insert/include/process - 将 [% INSERT 改为 [% PROCESS 后将显示:
foo = main in Main
注意与 INCLUDE 的不同。PROCESS 后 foo 在 main 中的值将变为 bar. PROCESS ex.tt 将 foo 改后会影响 main 里的值。
foo = bar in External File.
foo = bar in Main after insert/include/process
INCLUDE 是将结果返回,而 PROCESS 更类似与将这段代码返回然后在 main 中执行。
other tips
- 下面是一些你可能碰到的东西:
- 不管是哪个指示符, INCLUDE 也好 PROCESS 也好。注意下面的区别:
[% myheader = 'my/misc/header' %]
[% INCLUDE myheader %] # 'myheader'
[% INCLUDE "myheader" %] # 'myheader'
[% INCLUDE $myheader %] # 'my/misc/header'
[% INCLUDE "$myheader" %] # 'my/misc/header' - 如果在 main 中定义了 foo 而在 ex.tt 中没有定义 foo 的话, ex.tt 里的 foo 将采用 main 里的 foo 值。
- 参数传递。我们可以在 INCLUDE/PROCESS 后传递参数进去。比如:
foo = [% foo %] in External File.
[% INCLUDE ex.tt foo = '77' %]
这样 ex.tt 里的 foo 值将是 77. - 注意如果你在 main 里定义了一个 BLOCK 与 INCLUDE/PROCESS 里的文件名一样时,将调用 main 里的该 BLOCK 而不是外部文件。比如我们有一个外部文件叫 bar(没有后缀),而在 main.tt 里这么写的话:
[% INCLUDE bar %]
它调用的是这个 BLOCK 而不是外部文件。这就是优先级问题。
[% BLOCK bar %]
foo was [% foo %]
[% END %] - 需要多个文件的话可以使用加号:
[% PROCESS foo + bar %]
- 关于 INCLUDE_PATH 等配置选项设置可以参考:Template Toolkit 的配置选项