第2回 Smartyを使ってみる(その1:変数編) (その1)
前回、Smartyの紹介とインストール、そして簡単なサンプルを作ってみました。今回はもう少しSmartyの文法や使い方について、掘り下げて説明したいと思います。
PHPから呼び出す
前回紹介した、使用例のソースコードをもう一度振り返ってみます。
<?php
ini_set( 'display_errors', 1 );
define( 'SMARTY_DIR', '/usr/local/lib/Smarty-2.6.18/libs/' );
require_once( SMARTY_DIR .'Smarty.class.php' );
$smarty = new Smarty();
$smarty->template_dir = '/var/www/smarty/templates/';
$smarty->compile_dir = '/var/www/smarty/templates_c/';
$smarty->config_dir = '/var/www/smarty/configs/';
$smarty->cache_dir = '/var/www/smarty/cache/';
$smarty->assign( 'name', 'あなたの名前' );
$smarty->display( 'test.tpl' );
?>
5行目にある
$smarty = new Smarty();
という記述に注目します。これはSmartyというクラスのインスタンスを生成しています。このインスタンスを用いることで、PHPからSmartyテンプレートに変数を受け渡したり、テンプレートの内容を表示することが出来るようになります。
続いて8~10行目です。
$smarty->template_dir = '/var/www/smarty/templates/';
$smarty->compile_dir = '/var/www/smarty/templates_c/';
$smarty->config_dir = '/var/www/smarty/configs/';
$smarty->cache_dir = '/var/www/smarty/cache/';
前回、Smartyで用いる4種類のパスについて説明しましたが、このパスの設定をインスタンス変数に渡しています。それぞれ以下のパスに対応しています。
・template_dir => テンプレートディレクトリ ・compile_dir => コンパイルディレクトリ ・config_dir => 設定ファイルディレクトリ ・cache_dir => キャッシュディレクトリ
これで、Smartyテンプレートが保存されているパスやテンプレートをコンパイルした結果を保存するパスがインスタンスに伝わりました。逆にこの設定がないと、折角作成したテンプレートファイルをインスタンスは見つけることが出来ないため、テンプレートの表示に失敗してしまいます。
続いて12行目です。
$smarty->assign( 'name', 'あなたの名前' );

assignメソッドは、PHPからSmartyテンプレートへ変数を渡すメソッドです。第1引数で変数名、第2引数でその変数に渡す値を設定します。Smartyテンプレートからは第1引数の変数名で第2引数の値を取得、表示することが出来るようになります。
Smartyテンプレートに複数の変数を渡したい場合は、assignメソッドを複数回呼び出す方法と、変数名をキーとした連想配列を渡す方法があります。連想配列を渡す方法を用いる場合はassignメソッドの引数は一つだけになります。
// 複数回呼ぶ場合
$smarty->assign( 'name', 'yossy' ); // {$name}
$smarty->assign( 'address', 'tokyo' ); // {$address}
// 連想配列を渡す場合
// それぞれ{$age}{$sex}でアクセス可能
$smarty->assign( array( 'age' => '18', 'sex' => 'male' ) );
また、assignメソッドでは渡す値に配列やオブジェクトを設定することも出来ます。
// 配列を渡す場合
$friends = array( 'milukuma', 'willer', 'watal', 'unini' );
$smarty->assign( 'friends', $friends );
// オブジェクトを渡す場合(TestClassは仮のクラスです)
$obj = new TestClass();
$smarty->assign( 'test_obj', $obj );
特にオブジェクトをテンプレートに渡したい場合、そのオブジェクトのコピーではなく参照を渡したい場合があります(メソッド実行でメンバ変数の値が変わる場合とか、コピーによるパフォーマンス低下が気になる場合とか)。その場合はassignメソッドではなくassign_by_refというメソッドを用いると、オブジェクトのコピーが作られることなくテンプレートに渡すことが出来ます。
// オブジェクトを参照で渡す場合(TestClassは仮のクラスです)
$obj = new TestClass();
$smarty->assign_by_ref( 'test_obj', $obj );
最後に13行目です。
$smarty->display( 'test.tpl' );
displayメソッドは、引数で指定されたSmartyテンプレートの内容を表示します。引数で指定されたSmartyテンプレートファイルは、8行目で指定したテンプレートディレクトリから探します。もしテンプレートディレクトリに指定ファイルがない場合はエラーとなります。







