PHPTALの履歴

HTMLの属性で処理を記述できるPHPのテンプレートエンジン。
Zope Page Templatesを実装したものらしい。使ってみたい。

「metal」とか「tales」とか名前のセンスがいい!

http://phptal.org/

使ってみた感じ

少々文法にクセがある。機能はそれなりに十分。DOM解析系ではベスト?ただ、if 〜 else ができないのが残念。

ベンチマーク

http://d.hatena.ne.jp/tanakahisateru/20081024/1224850023
Smartyより若干遅いぐらい

レイアウト機能

こりゃすごいな。
http://lists.motion-twin.com/pipermail/phptal/2007-June/0007...

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/

path:

配列やオブジェクトのアクセスは"/"区切りが基。これは tales の path: の機能らしい


でも"php: "を使う場合は"."区切りになる。

context

contextについての理解が必要。
<div tal:define="hoge string:div1">
<span tal:content="hoge" />

<span tal:content="hoge" />

最初の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
属性を出力する。セミコロンで複数指定可。動的に属性定義はできないようだが、存在しない値は無視できる。

tal:on-error
エラーハンドラ

metal

metal:define-macro
マクロを定義

metal:use-macro
マクロを使う

metal:define-slot
スロットを定義。define-macroの中に定義する。

metal:fill-slot
スロットを埋めるuse-macroの中に定義する。

i18n

調べてない

tales

php:
phpが使える。ただし変数名の"$"を除去、"->"は"."に置き換える必要がある。

exists:
issetと同じ。普通は存在しないものにアクセスしたらエラーになるけどそれを回避できる。

default
定義されていない場合にタグの中身を表示する。

structure
HTMLをそのまま出力する

"|"
最初のtrueを返す

コメント

tal:comment が使えるみたいだけど
<div tal:replace=""> hogehoge </div> とするのもあり。