KZ Templateクラス

出典: GeeklogJpWiki

http://mystral-kk.net/article.php/20090402203041560

KZ Templateクラス

メディアギャラリ1.6以後からCTLハックが必要になりましたが,日本に多いモジュール版PHPの環境下ではCTLハックが正常に動きませんでした。KZ Templateクラスを活用することにより,これを解決できます。

CTLからキャッシュ機能を抜き、代わりにdengenさんが提唱しているTemplateクラスの高速化と木下さんが実装したOverRide機能(該当テンプレートファイルがない場合、デフォルトのテーマに自動的にフォールバックする機能)を追加したKZ_Templateクラスをmystral-kkさんが開発しました。

mystral-kkさんが公開しているドキュメントをそのままこちらで紹介します。


KZ_Templateクラスの使用法

@author Kenji ITO <geeklog AT mytsral-kk DOT net> @date 2009-04-02 @license GPLv2 or later

このクラスはGeeklog標準であるPHPLIBのTemplateクラスに、

1. Joe Mucchiello <joe AT throwingdice DOT com>さんがCaching Template Library(以下、CTL)で導入した変数置換機能(の一部)を追加

2. 同じくCTLの定義済み変数機能を追加。定義されているのは、

  • 'site_url' (サイトのURL。$_CONF['site_url']と同じ。)
  • 'site_admin_url' (管理画面のURL。$_CONF['site_admin_url']と同じ。)
  • 'layout_url' (テーマパス。$_CONF['layout_url']と同じ。)
  • 'xhtml' (定数のXHTMLと同じ。)

の4つ。

3. 木下さん<tktools.jp>がGeeklog-1.4.x用に作成したOverRide機能を追加

4. dengenさん<http://www.trybase.com/~dengen/log/>が考案したTemplateクラスの高速化を追加したものです。Joeさんのオリジナルと異なり、このクラスはキャッシュファイルを作成しないので、モジュール版PHPでも動作します。MediaGallery-1.6.xを使用する場合に特に有効でしょう。

インストールは簡単で、従来のtemplate.class.phpをアーカイブの中に入っている同名 のファイルで上書きするだけです。

初期設定ではOverRideが有効になっています。無効にするには、84行目付近にある

'override' => 'professional'

'override' => 

に変えてください。PHPコードから制御するには、Templateクラスの setOverride(string $theme_name)、getOverride(void)メソッドを使用します。

お断り:このクラスはTemplateクラスを拡張したものなので、本来はクラス名・ファイ ル名ともにオリジナルと違うものにすべきなのですが、ユーザが簡単に置き換えられる ようにということで、敢えて変えていません。

以下の変数置換機能の説明は、Joeさんが作成したCTLに同梱されているTEMPLATE_USAGE を私が翻訳したものです。


ここから翻訳 -----

このライブラリ(CTL)では、テンプレートファイルに含まれる変数を置換してから、出力 を生成します。CTLではアクション変数を追加しています。テンプレート構文はすべて波 カッコの中に含まれています: {変数名}。最も単純な構文は今、見たばかりのものです。 アクションもまた波カッコ内に含まれていますが、最初の文字が感嘆符(!)になっていま す:{!アクション パラメータ}。ふつう、アクションは最終的な生成物の中には出力さ れません。その代わりに、出力されるものを制御します。この場合、アクションにより、 2つのアクションに挟まれたブロックがテンプレート内に生成されます。ふつう、2番目 のアクションは1番目のアクション名の前に'end'が付いたものです:{!endアクション}。

複雑なアクションでは、!} を終了タグとして使用します。!}の前には半角スペースが なければなりません。この場合、条件や関数のパラメータの中に他の変数を埋め込むこ とができます。したがって、{!if {var1} == {var2} !} と記述すると、2つの変数を比 較することになります。

[訳注:KZ_Templateクラスでは、!}を使用する複雑なアクションを実装していません。]


アクション

条件判断を行うアクション(Conditional Actions)

 {!if var}           最も単純な形式では、!if アクションは、varがtrueに評価され
 {!endif}            た場合、{!endif}までのブロックの内容を表示します。
 {!else}             このアクションは、!if と !endif の間に置く必要があります。
                     varがtrueに評価された場合は、{!if var}と{!else}で挟まれた

ブロックが、falseに評価された場合は、{!else}と{!endif}で 挟まれたブロックが表示されます。

 {!elseif var}       elseとifをひとまとめにして、複数の条件を評価できるように
                     したものです。

繰り返しを行うアクション(Looping Actions)

 {!while var}        {!if}に似ており、varがtrueに評価される間、繰り返し
 {!endwhile}         {!while var}と{!endwhile}で挟まれる部分が表示されます。
                     falseに評価されると、繰り返しを終了します。
 {!loop variable}    variable__loopvar という名前の変数を新規作成し、
 {!endloop}          {!loop variable}と{!endloop}で挟まれたブロックをvariable

の回数だけ繰り返します。このとき、varialbe__loopvarは1か らvariableまで1ずつ増えていきます。variableが負の場合、-1 から始まり1ずつ減っていきます。繰り返しが終了したとき、 variable__loopvarは削除(unset)されます。

 {!break}            強制的に繰り返しを終了します。ブロックの残りの部分は処理
                     されず、!endwhileや!endloopの後から処理が再開されます。
 {!continue}         強制的に繰り返しを終了します。ブロックの残りの部分は処理
                     されず、繰り返しの先頭に処理が戻ります。

他のアクション(Other Actions)

 {!inc variable}     variableを1増やします。数値でない場合は、'1'になります。
 {!dec variable}     variableを1減らします。数値でない場合は、'-1'になります。
 {!inc+echo variable}  !incと同じですが、数字が表示されます。
 {!dec+echo variable}  !decと同じですが、数字が表示されます。
 {!set variable value} variabkeにvalueを割り当てます。この構文はまだ十分にエ
                       ラーチェックをしていないので、慎重に使用してください。
 {!unset variable}     テンプレート内部の変数リストから、variableを削除(unset)
                       します。

コメント

テンプレートファイルに {# と #} で挟むとコメントを追加できます。最終的に表示さ れるときには、{# から #} までが削除されます。この機能を使うと、テンプレートの中 で不可解な制御構文を使用しても、最終的に表示されるHTMLにコメントをたくさん残さ なくても済みます。

次の(でっちあげた)例では、唯一のテンプレート変数は'count'であり、3に設定され ています。

{# コメントの例です #} {!loop count} {count__loopvar} of {count}: {!inc+echo total} {!if count__loopvar == "2"}{!inc count}{!endif}
{!endloop}

このテンプレートが2回、count変数をリセットせずにパースされると次のように出力さ れます。

1 of 3: 1 2 of 3: 2 3 of 4: 3 4 of 4: 4 1 of 4: 5 2 of 4: 6 3 of 5: 7 4 of 5: 8 5 of 5: 9

次の例はGeeklogに特有なものですが、最も単純な !if 構文の使い方を説明するのに役 に立つでしょう。

if ( $_USER['uid'] > 2 ) {  // ユーザはログインしている
    $T->set_var('onlyloggedinusers', 'ログインユーザしか使用できない機能があります');
}

テンプレートでは、{onlyloggedinusers}変数の存在をチェックすることで、ユーザがロ グインしているかどうかを調べることができます。

<div id="pageheader">
  ページヘッダを表示
</div>
{!if onlyloggedinusers}
  <div class="boldtext">ログインユーザはここでもっと多くのことができます。ログインしてくれてありがとう!
  </div>
{!else}
  <div class="boldtext">ログインすれば、もっと多くのことができますよ!</div>
{!endif}

これは単純な例ですが、CTLの機能とパワーを説明しています。もはやPHPのコードでロ グインしていないユーザを別に扱う必要がなくなったのです。


どうしたらいいですか?


Q. どうしたら波カッコを表示できますか? A. スマートな方法ではありませんが、{!echo '{' !} としてください。{! や !} を表示 するには、{!echo '{' !}{!echo '!' !}とします。 [訳注]HTMLの実体参照に変換する方が簡単でしょう。'{'は &x7b; 、'}'は &x7d; 、 '!'は &x21; とします。


ここまで翻訳 -----
English German French