template toolkitでWRAPPERするファイルをデフォルトで定義したり条件によって別のファイルを指定したりする

before

header.ttに

<html>
〜〜〜〜〜〜〜〜
</html

とか書いて、全ttに

[%- WRAPPER header.tt -%]

とかいちいち書く

after

wrapper.ttを作成、

[%- app_name = 'アプリの名前' -%]
[%- IF template.name.match('^/admin') %]
    [% base_title = 'uriが/adminから始まるのでここは管理画面的です'  %]
    [%- INCLUDE admin/default/header.tt %]
[%- ELSE %]
    [% base_title = 'ユーザ画面です'  %]
    [%- INCLUDE header.tt %]
[%- END %]

header.ttには

[% content -%]

と書いて、各ttでは何も書かずに済むようになった。この[% content -%]に各ttの中身が入る。
URIマッチがアレなのは置いといて。/adminhogeとかでも引っかかる、とか。ちゃんとしたければ変数stashするなり、何かして。
ここでは条件により読み込むヘッダを変えているが、普通はwrapper.ttに [% content -%]
を書いてもいい。

let's do it

View::TT:
  INCLUDE_PATH:
    - __path_to(root/template)__
    - __path_to(root/template/default)__
  TEMPLATE_EXTENSION: '.tt'
  PRE_PROCESS: macro.txt
  DEBUG: 1
  ABSOLUTE: 1
  WRAPPER: __path_to(root/template/default/wrapper.tt)__
  WRAPPER: __path_to(root/template/default/wrapper.tt)__

がデフォルトのWRAPPERファイルを指定するところ。
こうしとけば、普段は全てのttはroot/template/default/wrapper.ttをWRAPPERする。
URIが /admin から始まれば、root/template/admin/default/header.ttをWRAPPERする。

例えば各ページでタイトルを動的に変更する

タイトルタグに[% title %]とか書いて、コントローラでstashしてもできるけど、ビューの設定がコントローラ依存になる。

<title>[% app_name %] - [% page_title ? page_title : base_title %]</title>

こうすれば、app_nameは全ページで共通。page_titleがあればそれを、なければbase_titleを表示する。
base_titleは各ページのttでSETすればいい。という。


これも柔道家に教えてもらった。感謝。
神が居なくなってから、柔道家に頼りっぱなしである。