第 14章拡張機能

目次
オブジェクト
プリフィルタ
ポストフィルタ
アウトプットフィルタ
キャッシュハンドラ関数
テンプレートリソース

オブジェクト

Smartyはテンプレートからphpのオブジェクトへのアクセスを許可しています。 オブジェクトにアクセスするには2つの方法があります。1つはテンプレートにオブジェクトを登録し、カスタム関数と似た構文を用いてアクセスする方法です。もう1つの方法はテンプレートにオブジェクトを割り当て、他の割り当てられた変数のようにオブジェクトにアクセスする方法です。 1つめのメソッドは素晴らしいテンプレート構文を持っています。それはとてもセキュアで、 登録されたオブジェクトはいくつかのメソッドやプロパティを制限する事が出来ます。しかし繰り返しの処理やオブジェクトの配列への割り当て等の事が出来ません。あなたのニーズによって選択するメソッドは決まりますが、テンプレート構文を最小限守るには必ず1つめのメソッドを使用して下さい。

セキュリティが有効の時、("_"から始まる)プライベートメソッドや関数にはアクセス出来ません。 もしメソッドとプロパティで同じ名前が存在する場合、メソッドが優先されます。

第3パラメータにメソッドやパラメータをリストした配列を与える事でアクセスを制限できます。

デフォルトではテンプレートからオブジェクトに渡されたパラメータはカスタム関数によって同じ方法で渡されます。 連想配列は第1パラメータとして渡され、smartyオブジェクトは第2パラメータとして渡されます。 もし古いオブジェクトパラメータの渡し方のように各引数を一度に渡したいなら、第4パラメータにfalseを指定します。

任意の第5パラメータ format は 第4パラメータが true の時だけ影響し、 ブロックとして扱われるべきオブジェクトのメソッドのリストを格納します。 これはこれらのメソッドがテンプレート内に {foobar->meth2}...{/foobar->meth2} のような閉じられたタグが 存在する事を意味し、メソッドへのパラメータはブロック関数プラグインのパラメータのように同じ概要を有しています。それらは $params, $content, &$smarty, &$repeat の4つのパラメータを持ち、ブロック関数プラグインのような振る舞いをします。

例 14-1. using a registered or assigned object

<?php
// オブジェクト

class My_Object {
    function
meth1($params, &$smarty_obj) {
        return
"this is my meth1";
    }
}

$myobj = new My_Object;
// オブジェクトを登録する (参照によって)
$smarty->register_object("foobar",$myobj);
// いくらかのメソッド又はプロパティを制限したい場合、それらを配列の値としてリストする
$smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1'));
// 古いオブジェクトパラメータの形式を使いたい場合、booleanのfalseを渡します。
$smarty->register_object("foobar",$myobj,null,false);

// オブジェクトを割り当てる事が可能。(できればAssign by ref)
$smarty->assign_by_ref("myobj", $myobj);

$smarty->display("index.tpl");
?>

テンプレート:

{* 登録されたオブジェクトにアクセスする *}
{foobar->meth1 p1="foo" p2=$bar}

{* outputに割り当てる事が可能 *}
{foobar->meth1 p1="foo" p2=$bar assign="output"}
the output was {$output}

{* 割り当てたオブジェクトにアクセスする *}
{$myobj->meth1("foo",$bar)}