第1回 Smartyの紹介 - Smarty講座

yossy先生のSmarty講座

Lecutures on PHP

第1回 Smartyの紹介 (その1)

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

今回から数回にわたって、PHPで動作するテンプレートエンジンSmarty(*1)について説明したいと思います。

テンプレートエンジンって何?

yossy先生

動的なWebページやWebアプリケーションを作成する際、数あるプログラミング言語の中でPHPが非常に多くの場面で利用されています。

PHPにはHTML内にコードを埋め込むことが出来るという、他の言語にはない特徴があります。コードの変更がすぐ画面に現れるため、小規模のWeb開発であればスピーディに効率よく作業を進めることが出来、初心者でも直感的で分かりやすいというところが他の言語と比較しての強みと言えるでしょう。

反面、大規模な開発案件の場合や、ロジックを書く人と画面のデザインを担当する人が別で作業を進める際、あらかじめきちんと設計をしておかないと、ロジックコードが分散して保守が難しくなり、またソースの可読性が下がってしまうという問題が発生します。またPHPのプログラムが分からないデザイナーがUIの保守を進めるのが困難になってしまいます。デザイナーは自分が管理するUIのソース中にSQL命令は見たくないのです。

ソフトウェア設計モデルにMVCという考え方があります。これはPHPに限った話ではないのですが、システムを「Model」(データベースなどビジネスロジックを扱う要素)「View」(出力結果のHTML表示などUIを扱う要素)「Controller」(入出力を制御しModelとViewの橋渡しを行う要素)の3つに分けて実装する方式で、開発作業の分担を容易にし、途中で発生する仕様変更の影響を最小限にするメリットがあります。

図1. MVC

この3つの要素のうち、UIなど出力に関する「View」を実現するための仕組みに「テンプレートエンジン」というものがあります。これは「Controller」から渡されたデータを、「テンプレート」と呼ばれるUIのひな形に適用していき、出力する画面を生成していく仕組みです。

以下のようなPHPコードが

echo '<html>';
echo 
'<body>';
echo 
"<p>$msg</p>";
echo 
'</body>';
echo 
'</html>';

このように書けます

<html>
<
body>
<
p>{$msg}</p>
</
body>
</
html>

テンプレートではControllerやModelの動作やロジックを気にすることはありません。Controllerから渡されるデータのみ気にすればよく、それをどのように表示するか考えることに専念できます。

Smartyとは

saity

今回説明をする「Smarty」は、PHP上で動作する「テンプレートエンジン」の一つです。

SmartyはAndrei Zmievskiが社内用に開発した「SmartTemplate」が前身のテンプレートエンジンです。これを引き継いだMonte Ohrtが、単純なタグ置換より「スマート(smart)」なテンプレートエンジンという意味を込めて「Smarty」と命名しました。(*2)

Smartyの特徴として以下のような点が上げられます。

・ {}を用いた記法

HTML中に埋め込む変数やループ、条件分岐などの制御構造などを記述するのに{}を用います。例えば {$var} と記述すると変数 $var の値が記述した箇所に表示されます。またif文の記述は {if $var eq 'abc'}...{else}...{/if} のようになります。またコメントも {* ... *} のように、{} にアスタリスク(*)をつけたもので囲むことによって記述することが出来ます。

・ 修飾子

Smartyでは変数をそのまま表示することはもちろん可能です。しかしWebサイトを作成していると、与えられた変数の値をちょっと加工して出力したいという場面が出てきます。例えば日付データの表示フォーマットを変えたりとか、アルファベットを全て大文字に変えるなど、サイトの内容によっては必要になるかもしれません。またユーザーからの入力をそのまま表示すると、クロスサイトスクリプティングなどセキュリティ上問題が発生する場合があるため、それを防ぐためにユーザーからの入力値をエスケープする対策が必要になります。そのような処理を「修飾子」を用いることで簡単に記述することが出来ます。

{* $title変数を大文字に変換する修飾子の例 *}
<
title>{$title|upper}</title>
・ 高速に動作

PHPで動作するテンプレートエンジンはいくつか公開されていますが、Smartyはその中でも非常に高速に動作をします。アクセスされると、そのページのテンプレートを記述したテンプレートファイルをコンパイルしてPHPスクリプトを生成します。そのため2回目以降のアクセスからテンプレート解析のオーバーヘッドがなくなり、高速に画面を表示することが可能になります。


===
*1):http://smarty.php.net/
*2):http://smarty.incutio.com/?page=SmartyFrequentlyAskedQuestions#other-5

  



Pick Up Q&A

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

>>続きを読む

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

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

Q&A掲示板 新着情報