Skip to main content.

(PR:株式会社インデペンデンスシステムズ横浜では、開発の御依頼をお待ちしております。)

Sunday, August 14, 2005

Smartyの利用

SmartyとはPHPで利用できるテンプレートエンジンの一つです。テンプレートエンジンとは、HTML(デザイン部分)とプログラム(ロジック部分)を分離させる技術です。これによりデザイナとプログラマが同時に作業をすることが可能になり、メンテナンスも容易になります。

私の場合ですが、Web系の開発はJavaがほとんどでしたので、MVCモデルという設計、実装をJavaで使ってきましたが、PHPではどう実現するのかな?というところから始まり、まずはSmartyを調べてみました。

・インストール方法
ここからダウンロードしてください。現時点では、"Smarty-2.6.10 Source"となっています。これをダウンロードして、解凍します。実際に使用するのは、この中のlibディレクトリです。

詳細は、以下を参考にしてください。
和訳ドキュメント(Ver2.6.6です)
本家ドキュメント

・Smartyの利用方法
表示部分(デザイン部分)とロジックの分離ということで、この表示部分は、テンプレートという形式で表現します。たとえば一部分ですが、こういった感じでしょうか。

{foreach from=$data item="item"}
<tr>
  <td>{$item.id}</td>
  <td>{$item.name}</td>
  <td>{$item.prefectures}</td>
  <td>{$item.email}</td>
</tr>
{/foreach}

ロジック部分で、必要な処理をしてこの表示部分に処理結果のデータを割り当てます。ここで、Smartyは以下のようにSmarty.class.phpを読み込んで、Smartyクラスのインスタンスを生成して利用します。

require_once('Smarty/Smarty.class.php');
$smarty = new Smarty;

ロジック部分の部分的な例です。MySQLからデータを取得して、テンプレートを表示しています。id、name、prefectures、emailの各項目にデータを設定しています。

//各レコードの読み込み
while($array = mysql_fetch_row($result)){
  $data[] = array('id'=>$array[0],
  'name'=>$array[1],
  'prefectures'=>$array[2],
  'email'=>$array[3]);
}
mysql_close($con);

// 取得したデータをセットして、テンプレートを表示
$o_smarty->assign("data",$data);
$o_smarty->display("smarty.tpl");

これで、表示部分とロジック部分が、確かに分かれています。このロジック部分にデータを渡す入力部分を加えた実行例がここから実行できます。

・ソース全体の例
------------------------------------------
入力部分(input.php)
------------------------------------------
<h2>会員一覧表示(Smarty テストプログラム)</h2>
<hr>

表示する会員IDの範囲を指定してください。<br>

<form method="post" action="smarty.php">

開始ID:<input type="text" name="from" size="3"/>から<br>
終了ID:<input type="text" name="to" size="3"/>までを表示します。<br>
<input type="submit" name="btn" value="検索実行"/>

</form>
------------------------------------------
ロジック部分のソース例(smarty.php)
------------------------------------------
<?php
require_once("Smarty/Smarty.class.php");

// smartyオブジェクトの生成
$o_smarty=new Smarty();

// ディレクトリのパスの設定
$o_smarty->gttemplate_dir="Smarty/templates";
$o_smarty->compile_dir="Smarty/templates_c";

// MySQLからのデータ取得
$con = mysql_connect("myserver", "myuser", "mypassword")
mysql_select_db("mydb")

$query = "select * from tTestCustomer where id between ".$_REQUEST["from"]." and ".$_REQUEST["to"];

$result = mysql_query($query)

while($array = mysql_fetch_row($result)){
$data[] = array('id'=>$array[0],
  'name'=>$array[1],
  'prefectures'=>$array[2],
  'email'=>$array[3]);
}
mysql_close($con);

// 取得したデータをセットして、テンプレートを表示
$o_smarty->assign("data",$data);
$o_smarty->display("smarty.tpl");

?;>
------------------------------------------
表示結果のテンプレートの例(smarty.tpl)
------------------------------------------
<html>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JIS";>

<h2>会員一覧表示(Smarty テストプログラム)</h2>
<hr>

検索結果<br>

<table border="1">
<tr>
  <th>ID</th>
  <th>NAME</th>
  <th>PREFECTURES</th>
  <th>MAIL</th>
</tr>
{foreach from=$data item="item"}
<tr>
  <td>{$item.id}</td>
  <td>{$item.name}</td>
  <td>{$item.prefectures}</td>
  <td>{$item.email}</td>
</tr>
{/foreach}
</table>
------------------------------------------
・MVCモデルへ
これで、デザインとロジックが分離できますが、さらに簡単な自作のコントローラ的なものを作成して、Model部分もはっきりと分離した設計にすれば、それなりにMVCモデルになるでしょうか。小規模システムならそれで対応できると思います。あと、もっと大規模なシステムでは、もちろんフレームワークを利用する方法もあります。まだ私はよく知らないのですが、Smartyを利用したguessworkというフレームワークがあるようです。

・参考にさせていただたサイト(ありがとうございます。)
たぬきと一緒にお勉強 第4回目 Smartyを使ってみよう

guesswork 薄っぺらなフレームワーク