ZPT構文チュートリアル

ここではZPTの構文について簡単に説明します。ZPTの構文の詳細についてはZope Page Templates ReferenceZope Page Templateリファレンスを参照して下さい。

ZPTの基本

ZPTではタグに独自の属性を付与することで出力内容の制御を行ないます。

ZPTが提供する独自属性は以下の8つです。

  • tal:define
  • tal:condition
  • tal:repeat
  • tal:content
  • tal:replace
  • tal:attributes
  • tal:omit-tag
  • tal:on-error

まずは値を出力してみましょう。以下のコードが処理されてからZPTエンジンに処理が委譲されたとします。

Javaでの準備:

HttpServletRequest request = ...;
request.setAttribute("message", "Hello, ZPT!");

ZPTテンプレート:

<p tal:content="message">ここにメッセージが入ります</p>

tal:contentは式の評価結果でタグのボディを置き換えます。従って、最終的なHTMLは以下のようになります。

<p>Hello, ZPT!</p>

tal:contentの代わりにtal:replaceを使うと、タグごと置き換えることができます。

ZPTテンプレート:

<p tal:replace="message">ここにメッセージが入ります</p>

出力:

Hello, ZPT!

タグのボディだけを残してタグだけ削除したい場合はtal:omit-tagを使います。

Javaでの準備:

HttpServletRequest request = ...;
request.setAttribute("weak", Boolean.TRUE);

ZPTテンプレート:

<strong tal:omit-tag="weak">注意して下さい。</strong>

出力:

注意して下さい。

tal:omit-tagは、式の値が真である場合にボディを残してタグを除去します。偽の場合は何もしません。なお「tal:omit-tag=""」と書くと式の値は真とみなされタグが除去されます。

タグ全体の表示非表示を制御するにはtal:conditionを使います。

Javaでの準備:

HttpServletRequest request = ...;
request.setAttribute("displayMessage1", Boolean.TRUE);
request.setAttribute("displayMessage2", Boolean.FALSE);

ZPTテンプレート:

<p tal:condition="displayMessage1">メッセージ1</p>
<p tal:condition="displayMessage2">メッセージ2</p>

出力:

<p>メッセージ1</p>

tal:conditionは、式の値が偽である場合にタグ全体を除去します。真の場合は何もしません。なお「tal:condition=""」と書くと式の値は偽とみなされタグ全体が除去されます([Freyja拡張])。

タグの属性を動的に変更したい場合はtal:attributesを使います。

Javaでの準備:

HttpServletRequest request = ...;
request.setAttribute("url", "http://replaced.url");

ZPTテンプレート:

<a tal:attributes="href url" href="http://original.url">リンク</a>

出力:

<a href="http://replaced.url">リンク</a>

式は「属性名 属性の値を表すTAL式」(TAL式については後述)というように、空白で属性名とTAL式を区切って指定します。複数の属性を置き換える場合は「;」で区切って下さい。

TAL式の評価結果がnullの場合はhref属性が削除されます。評価結果がdefault(net.skirnir.freyja.zpt.Default.instanceオブジェクト)である場合は元々のhref属性が残されます。

コレクションの中身を繰り返し出力するにはtal:repeatを使います。

Javaでの準備:

HttpServletRequest request = ...;
request.setAttribute("messages", new String[]{ "メッセージ1", "メッセージ2" });

ZPTテンプレート:

<p tal:repeat="message messages" tal:content="message">ここにメッセージが入ります</p>

出力:

<p>メッセージ1</p><p>メッセージ2</p>

式は「一時変数名 コレクションを表すTAL式」というように、空白で一時変数名とTAL式を区切って指定します。

TAL式の評価結果に一時的な名前をつけるにはtal:defineを使います。

Javaでの準備:

HttpServletRequest request = ...;
Map<String, String> map = new HashMap<String, String>();
map.put("key", "value");
request.setAttribute("map", map);

ZPTテンプレート:

<div tal:define="value map/key">
  <p tal:content="value">ここに値が入ります</p>
</div>

出力:

<div>
  <p>value</p>
</div>

式は「変数名 TAL式」というように、空白で変数名とTAL式を区切って指定します。定義した変数はtal:defineが書かれているタグとその内側でのみ有効です。

TAL式

TAL式はTemplate Attribute Language Expressionのことで、ZPTの属性の中に記述することのできる評価式のことです。TAL式を記述するための構文をTALES(Template Attribute Language Expression Syntax)と言います。

TALESの詳細は[http://wiki.zope.org/ZPT/TALESSpecification13 TALES Specification 1.3]を見ていただくとして、ここではTAL式の基本についてのみ説明します。

TAL式は通常次のように記述します。

aaa/bbb

これは、現在のスコープに登録されている「aaa」という名前を持つオブジェクトの、「bbb」というプロパティを表します。スコープとはオブジェクトが保存されている入れ物のようなものです。TAL式の中では「/」を使ってプロパティへの参照を表します。「aaa/bbb」という式は、Javaで言うところの「aaa.getBbb()」と同じです。

プロパティ参照は入れ子で行なうこともできます。

aaa/bbb/ccc

これはJavaで言うところの「aaa.getBbb().getCcc()」と同じです。

先頭に「タイプ名:」をつけると式のタイプを指定することができます。実は、上で説明した「/」区切りの式は「path」というタイプを持つ式で「path式」と呼ばれるものです。タイプ名を省略するとpath式とみなされます。

主な式のタイプには以下のものがあります。

  • path
  • exists
  • not
  • string

exists式は「exists:TAL式」の形を取り、TAL式の評価結果がnullでない場合にBoolean.TRUEとなります。nullの場合はBoolean.FALSEとなります。

not式は「not:TAL式」の形を取り、TAL式の評価結果の真偽値を反転します。TAL式の評価結果が真であればBoolean.FALSEとなり、偽であればBoolean.TRUEとなります。

string式は「string:文字列」の形を取り、単に文字列を値として返します。ただし文字列中に「$TAL式」という記述が含まれている場合はその部分をTAL式の評価結果で置き換えます。例えばmessageの値が"ZPT"の時、「string:Hello, $message!」の評価結果は「Hello, ZPT!」となります。

式は「|」で連結することができます。「|」で連結された式は左から評価され、真である最初の値が最終的な評価結果となります。偽であった場合は次の部分式が評価され、最後まで偽であった場合は最後の部分式の値が評価結果となります。例えば「1 | true | false」の評価結果は「1」、「 0 | false | true」の評価結果は「true」となります。

真偽値ではなく、値がnullでない最初のものを返したい場合は「|」の代わりに「`||`」を使って下さい([Freyja拡張])。例えば「`0 || false || true`」の評価結果は「0」となります。

真偽値

TAL式では次のものが偽とみなされます。それ以外は真とみなされます。

  • null
  • Boolean.FALSE
  • Numberインタフェースの実装クラスで値が「0」のもの
  • 配列クラスで長さが0のもの
  • Collectionインタフェースの実装クラスで空のもの
  • Enumerationインタフェースの実装クラスでhasMoreElements()がfalseであるもの
  • Iteratorインタフェースの実装クラスでhasNext()がfalseであるもの
  • toString()した結果の長さが0であるもの