第9回 Smartyの便利な機能を使いこなす(その3:フィルタ編) - Smarty講座

PHP講座 HTML×CSS 初級編

yossy先生のSmarty講座

Lecutures on PHP

第9回 Smartyの便利な機能を使いこなす(その3:フィルタ編) (その2)

 このエントリーをはてなブックマークに追加

フィルタ関数を作ってみる

では実際にフィルタ関数を作ってみたいと思います。まずは以下のPHPのコードを見てみてください。
(テンプレートディレクトリの設定などは、ここでは省略します)

<?php
$smarty 
= new Smarty();
$smarty->register_prefilter('my_prefilter');
$smarty->register_postfilter('my_postfilter');
$smarty->register_outputfilter('my_outputfilter');

$smarty->assign('name''yossy');
$smarty->display('hello.tpl');
?>

yossy先生register_prefilter()、register_postfilter()、register_outputfilter()というSmartyのメソッドが登場しました。
これらのメソッドを用いると、それぞれプリフィルタ、ポストフィルタ、アウトプットフィルタを登録することが出来ます。

上記の例ではプリフィルタとして my_prefilter()、ポストフィルタとして my_postfilter()、そしてアウトプットフィルタとして my_outputfilter()というフィルタ関数が実行されます。

フィルタ関数は以下のような関数になります。

function my_prefilter($tpl_source$smarty)
{
    
// Smartyテンプレートのコメントを取り除く
    
return preg_replace('/\{\*.+\*\}/sU'''$tpl_source);
}

上記の例は渡されたSmartyテンプレート中にあるコメント{* ... *}を全て削除するプリフィルタです。

フィルタ関数は、3種類とも上記のような2つの引数を持ちます。第1引数はフィルタの対象となる文字列、第2引数はSmartyオブジェクトです(*1)。この第1引数で渡される文字列に対して何らかの処理を行い、その実行結果を戻り値とします。

上記の my_prefilter() というフィルタ関数では、まずプリフィルタとしてテンプレートの内容を引数$tpl_sourceで受け取ります。そして関数内でSmartyテンプレートのコメントを取り除く処理を行い、その結果を戻り値として返しています。

このフィルタ関数の実行結果が、次の解析フェーズのPHPコード変換処理へと渡されていきます。

以上でフィルタの説明を終わりにします。

yossy先生そんなに規模の大きくないサイトでは使いどころを見つけるのが難しい機能ではありますが、例えばブラウザやケータイの機種によって出力結果を調整したいが、テンプレートをブラウザやケータイの機種ごとにわざわざ用意するのは非常に手間や管理コストがかかる、といった場面で用いると効果的です。

また第6回で触れた文字エンコード切り替えの処理も、実はアウトプットフィルタで一括で変換すると非常に簡単に実現できたりします。

次回はプラグインについて説明したいと思います。

----
(*1)PHP4の場合、参照引数で定義してください。この例では function my_prefilter($tpl_source, &$smarty) となります。

  • 1
  • 2
  • yossy先生

本名:吉武 正史

パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。 2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/

ご意見・感想フォーム

今回の「yossy先生のSmarty講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

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