Smartyを使ってみる

データベースからのデータの取得と表示ができるようになったので
Smartyを使って表示をしてみたいと思います。

ApacheのDocumentRootの外にtemplates,templates_c,cache,cnofigsディレクトリを
作成します。
(DocumentRootの外に作るのはセキュリティ上有効だそうです。)

(Windowsでのイメージ[使い回しです])

smartyの環境パス

templates_cとcacheはApacheで使用するユーザーが書き込める必要があるのでオーナーを変更します。
(ユーザーやグループを確認するには、Apacheのhttpd.confを確認します。)

$ chown nobody:nogroup templates_c
$ chown nobody:nogroup cache

準備ができたのでテンプレートを作ってみたいと思います。
テンプレートは、index.tplとします。

<html>
<head>
<title>Sample2</title>
</head>
<body>
<table border=1>
{foreach item=user_info from=$users}
<tr>
<td>{$user_info.user|escape}</td>
<td>{$user_info.host|escape}</td>
</tr>
{/foreach}
</table>
</body>
</html>

Smartyと関係のある部分は、7行目からの6行です。
元となるphpからusersという配列を受け取りテーブルとして表示します。
受け取る配列は、

Array[0]->Array([user]="root",
                      [host]=%)
Array[1]->Array([user]="root",
                      [host]=localhost)

のような構造です。

phpの方は以下のようになります。
fetch後のデータの作り方は、これでいいのかわかりませんが
とりあえず動いています。

<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = 'テンプレートのパス';
$smarty->compile_dir = 'コンパイルのパス';
$smarty->config_dir = 'コンフィグのパス';
$smarty->cache_dir = 'キャッシュのパス';

$cn = mysql_connect("localhost","root","パスワード");
if(!$cn){
    die("connect Error");
}
if(!(mysql_select_db("mysql"))){
    die("select error");
}
$sql = "SELECT USER,HOST FROM user";
$dyn = mysql_query($sql);
if(!$dyn){
    die("query error");
}
$i = 0;
while($row = mysql_fetch_array($dyn)){
    $users[$i]['user'] = $row['USER'];
    $users[$i]['host'] = $row['HOST'];
    $i++;
}
$smarty->assign('users',$users);
$smarty->display('index.tpl');
mysql_close($cn);
?>

phpのプログラムは、htmlの部分が無くなっています。
2行目以降の6行は、Smartyを使うための準備です。
requireは、phpのスクリプトを読み込んでいます。
次のnewでSmartyをインスタンス化しています。
それ以降は、Smartyの環境設定です。

mysql_fetch_arrayのループ内は、テンプレートに渡す配列を準備しています。
$smarty->assign('users',$users)は、テンプレート上で使われる変数名と
テンプレートに渡す値を指定します。
$smarty->display('index.tpl')でテンプレートを表示します。

参考

・phpで他のスクリプトを読み込むときrequireを使う。
・他にもincludeで読み込むこともできる。
 この2つの違いは、実行中に問題が発生した場合
 includeは、Warningを出して処理を継続しますが、requireは、処理を中止します。