Smartyを使ってみる
データベースからのデータの取得と表示ができるようになったのでSmartyを使って表示をしてみたいと思います。
ApacheのDocumentRootの外にtemplates,templates_c,cache,cnofigsディレクトリを作成します。(DocumentRootの外に作るのはセキュリティ上有効だそうです。)
(Windowsでのイメージ[使い回しです])
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 は処理を中止します。