第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編) - Smarty講座
yossy先生のSmarty講座
Lecutures on PHP
第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編) (その2)
部分キャッシュの強い味方、{insert}関数
{insert}も{include}と同様に、指定位置に別の表示結果を埋め込みます。
ただ大きく違う点があり、{include}は別のテンプレートファイルを埋め込んだのに対し、{insert}はPHPで定義した関数の実行結果を埋め込みます。
そして{insert}で出力された部分は{include}と異なり、キャッシュに含まれないという特徴があります。
{insert name="getSidemenu"}
{include}ではfileという属性でテンプレートファイルを指定していましたが、{insert}ではnameという属性に関数を指定します。ここで指定した値の先頭に"insert_"を付与した関数が呼び出されます。
上記の例ではinsert_getSidemenu()という関数が呼ばれ、その実行結果が埋め込まれます。
また{include}と同様に、パラメータを渡すことが出来ます。
{insert name="getSidemenu" title="さいどめにゅー"}
ではinsert_getSidemenu()を定義してみましょう。(*1)
function insert_getSidemenu($params, $smarty)
{
return '<div id="sidemenu">...</div>';
}
戻り値でHTMLの文字列を返しています。この値がテンプレートで{insert}を記述した箇所に埋め込まれます。(*2)
そして{insert}で埋め込まれた値はキャッシュに含まれません。
したがって、例えばアクセスされるごとに表示する値を動的に変えたい場合などキャッシュされたら困る箇所に用いると効果的です。
さて、insert_*** 関数は2つの引数を持ちます。
第1引数には{insert}で渡されたパラメータを連想配列で受け取ることが出来ます。
上記の例では$paramsに以下の連想配列が渡されます。
array('name' => 'getSidemenu', 'title' => 'さいどめにゅー')
そして第2引数にはSmartyオブジェクトが渡されます。
上記の例ではreturn文に直接HTMLを書いてしまっていますが、これではせっかくのテンプレートエンジンが台無しなので、 以下のように直してみます。
function insert_getSidemenu($params, $smarty)
{
$smarty->assign('title', $params['title']);
return $smarty->fetch('sidemenu.tpl');
}
そして、テンプレートを1つ追加します。
sidemenu.tpl
<h2>{$title}</h2>
<div id="sidemenu">
(サイドメニューの内容)
</div>
さて、ここでまたfetch()という見慣れないメソッドが出てきました。
fetch()メソッドはdisplay()メソッドと同様に、引数で指定したテンプレートを解析します。
異なる点は、display()はテンプレートの内容を出力していますがfetch()は出力はせず、テンプレートの内容を戻り値として返します。
従って、上記の例ではsidemenu.tplの内容をfetch()で取得してそれをinsert_getSidemenu()の戻り値として返しています。
結果として{insert}の位置にsidemenu.tplの内容が埋め込まれます。
そしてもう一つ重要なポイント。fetch()メソッドもdisplay()メソッドと同様に、テンプレートの内容がキャッシュされます。
つまり、{insert}の内容を複数のページにまたがってキャッシュさせることが可能になる、というわけです。
※クリックすると拡大表示されます。
以上、キャッシュについての説明はここまでにしたいと思います。
「Smartyの処理は遅い」と言われることが時々あるのですが、今回説明したキャッシュなどの仕組みをちょっと工夫して使うことでパフォーマンスが改善することもありますので、是非もう一度、改善の余地がないか手元のソースを見直してみてください。
また今回は説明しませんでしたが、キャッシュの方法を拡張する仕組みとして、「キャッシュハンドラ」というものがあります。
これはキャッシュ管理の手段として、データベース(*3)やmemcached(*4)などを用いられるようにするための仕組みです。
サイトのページ数が多く、キャッシュファイルの数が膨大になり管理が煩雑になったりパフォーマンスが落ちるといった場面や、大規模サイトで複数のWebサーバー上でSmartyを使い、キャッシュを複数サーバー間で共通管理したい場面などで有効活用出来ると思いますので、興味のある人は是非チャレンジしてみてください。
さて次回はフィルタについて説明したいと思います。
----
(*1) 関数を定義したファイルを別途作成した場合、{insert}のscript属性でファイルを指定し読み込むことが出来ます。詳細は{insert}のマニュアルを参照してください。
(*2) {insert}にassign属性を設定すると、出力されず指定のテンプレート変数に保持されます。
しかし、キャッシュが有効な時はその値をテンプレート上で利用することが出来ないので、あまり意味がないかもしれません。
(*3) http://www.phppro.jp/phpmanual/smarty/section.template.cache.handler.func.html
(*4) http://swag.dk/swag/kode/
- 1
- 2
その他の記事も見る
- 第1回 Smartyの紹介
- 第2回 Smartyを使ってみる(その1:変数編)
- 第3回 Smartyを使ってみる(その2:制御構造編)
- 第4回 Smartyを使ってみる(その3:関数編)
- 第5回 Smartyを使って実用的なページを作ってみる(その1)
- 第6回 Smartyを使って実用的なページを作ってみる(その2)
- 第7回 Smartyの便利な機能を使いこなす(その1:キャッシュ前編)
- 第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編)
- 第9回 Smartyの便利な機能を使いこなす(その3:フィルタ編)
- 第10回 Smartyの便利な機能を使いこなす(その4:プラグイン編)
- 第11回 Smartyとフレームワーク(その1:CakePHP編)
- 第12回 Smartyとフレームワーク(その2:Zend Framework編)
- 第13回 次世代のSmarty - Smarty3の紹介
- 第14回 Smartyでケータイサイトを作ってみる
- >>「yossy先生のSmarty講座」一覧ページに戻る
- yossy先生
本名:吉武 正史
パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。
2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。