拡張機能 - PHPプロ!マニュアル

Smartyマニュアル

- 拡張機能

第 15章拡張機能

オブジェクト

Smarty は、テンプレートから PHP の オブジェクト へのアクセスを許可しています。オブジェクトにアクセスするには2つの方法があります。

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

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

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

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

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

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

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

例 15-1. 登録または割り当てられたオブジェクトを使用する

<?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);

// オブジェクトを割り当てる事が可能です(できれば参照渡しで)
$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)}

register_object() および assign() も参照してください。

閲覧履歴



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報