Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Advertisement

オブジェクト

Smarty は、テンプレートから PHP の オブジェクト へのアクセスを許可しています。

Note

オブジェクトをテンプレートに代入/登録するときは、 テンプレートからアクセスするプロパティやメソッドは表示に関する目的でだけ使うようにしましょう。 オブジェクトを通じてアプリケーションのロジックを取り込むのは簡単ですが、 それはまずい設計につながり、管理しづらくなってしまいます。 Smarty ウェブサイトのベストプラクティスのページも参照ください。

オブジェクトにアクセスするには2つの方法があります。

  • 1つはテンプレートに オブジェクトを登録 し、カスタム関数 と似た構文を用いてアクセスする方法です。

  • もう1つの方法は assign() を用いてテンプレートにオブジェクトを割り当て、 他の割り当てられた変数のようにオブジェクトにアクセスする方法です。

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

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

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

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

任意の第5パラメータは formatTRUE の時だけ影響し、 ブロックとして扱われるべきオブジェクトのメソッドのリストを格納します。 これはこれらのメソッドがテンプレート内に終了タグ ({foobar->meth2}...{/foobar->meth2}) を持つことを意味し、メソッドへのパラメータは block-function-plugins へのパラメータと同じ構文となります。つまり、4つのパラメータ $params$content$smarty および &$repeat を持ち、ブロック関数プラグインのように振る舞います。

Example 15.11. 登録または割り当てられたオブジェクトを使用する


<?php
// オブジェクト

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

$myobj = new My_Object;

// オブジェクトを (参照で) 登録します
$smarty->registerObject('foobar',$myobj);

// いくらかのメソッド又はプロパティを制限したい場合、それらを配列の値としてリストします
$smarty->registerObject('foobar',$myobj,array('meth1','meth2','prop1'));

 // 古いオブジェクトパラメータの形式を使いたい場合、booleanのfalseを渡します。
$smarty->registerObject('foobar',$myobj,null,false);

// オブジェクトを割り当てる事が可能です(できれば参照渡しで)
$smarty->assign_by_ref('myobj', $myobj);

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

  

そして 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)}

  

registerObject() および assign() も参照ください。