PHPTAL
HTMLの属性で処理を記述できるPHPのテンプレートエンジン。
Zope Page Templatesを実装したものらしい。使ってみたい。
「metal」とか「tales」とか名前のセンスがいい!
使ってみた感じ
少々文法にクセがある。機能はそれなりに十分。DOM解析系ではベスト?if 〜 elseif 〜 ができないようなのが残念。その代わり普通のテンプレートエンジンにはない機能が使える。コーディングスタイルも少し変わる。
ベンチマーク
http://d.hatena.ne.jp/tanakahisateru/20081024/1224850023
Smartyより若干遅いぐらい
レイアウト機能
こりゃすごいな。
http://lists.motion-twin.com/pipermail/phptal/2007-June/000791.html
You can have ONE design.html which contains you base design in one macro :
<html metal:define-macro="main">
<head>
<title>Hello</title>
</head>
<body>
<div id="header">
<h1>Hello</h1>
</div>
<div id="menu">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
...
</ul>
</div>
<div id="content">
<metal:block define-slot="content"/>
</div>
<div id="footer">
Copyright (c) ...
</div>
</body>
</html>
And then you just call your design from each template :
<html metal:use-macro="design.html/main">
<body metal:fill-slot="content" tal:ignore-tag="">
<h1>My content</h1>
foo bar baz
</body>
</html>
Zend Frameworkへの組み込み
http://taat.pl/article/zend_framework_tutorial/step2/
基本的な構文
http://phptal.org/manual/ja/
http://www.webcore.co.jp/techinfo/misc/ZopePageTemplateReference.html
path:
配列やオブジェクトのアクセスは"/"区切りが基本。これは tales の path: の機能らしい
<div tal:content="user/name" />
でも"php: "を使う場合は"."区切りになる。
context
contextについての理解が必要。
<div tal:define="hoge string:div1">
<span tal:content="hoge" />
</div>
<div tal:define="hoge string:div2">
<span tal:content="hoge" />
</div>
最初のdivで「div1」、次のdivで「div2」が表示される。タグ=スコープ。ここ理解してなくて最初の頃よくわからなかった。
tal
<div tal:content="hoge" />とかして使う。
tal:define
変数定義する
tal:condition
条件文。評価がtrueなら中身が表示される
tal:repeat
foreach。repeat/{varname}/{**} で特殊な値を取得できる。{**}はkey, index, number, even, odd, start, end, length が使える
tal:omit-tag
条件に合う場合はタグを表示しない。これはたまに使える。
tal:replace
tal:replaceの値の中身で置き換える。タグもなくなる
tal:content
tal:replaceの値の中身で置き換える。タグはなくならない
tal:attributes
属性を出力する。セミコロンで複数指定可。動的に属性定義はできないようだが、存在しない値は無視できる。
metal
metal:use-macro
マクロを使う
metal:define-slot
スロットを定義。define-macroの中に定義する。
metal:fill-slot
スロットを埋めるuse-macroの中に定義する。
i18n
調べてない
tales
php:
phpが使える。ただし変数名の"$"を除去、"->"は"."に置き換える必要がある。
exists:
issetと同じ。普通は存在しないものにアクセスしたらエラーになるけどそれを回避できる。
structure
HTMLをそのまま出力する
"|"
最初のtrueを返す
コメント
tal:comment が使えるみたいだけど
<div tal:replace=""> hogehoge </div> とするのもあり。