10 December 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.
因为 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
    [% foo = 'bar' %]
    foo = [% foo %] in External File.
    foo = main in Main after insert/include/process
    INSERT 的作用就是将文件原封不动的显示出来。
  • 将 [% INSERT 改为 [% INCLUDE 后将显示:
    foo = main in Main
    foo = bar in External File.
    foo = main in Main after insert/include/process
    INCLUDE 将外部文件执行,然后将结果返回到主文件中。
  • 将 [% INSERT 改为 [% PROCESS 后将显示:
    foo = main in Main
    foo = bar in External File.
    foo = bar in Main after insert/include/process
    注意与 INCLUDE 的不同。PROCESS 后 foo 在 main 中的值将变为 bar. PROCESS ex.tt 将 foo 改后会影响 main 里的值。
    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 bar %]
    foo was [% foo %]
    [% END %]
    它调用的是这个 BLOCK 而不是外部文件。这就是优先级问题。
  • 需要多个文件的话可以使用加号:
    [% PROCESS foo + bar %]
  • 关于 INCLUDE_PATH 等配置选项设置可以参考:Template Toolkit 的配置选项
Send me mail if u have any problem. Thanks.


blog comments powered by Disqus