Smartyを使ってみる

メモ:  Category:php

データベースからのデータの取得と表示ができるようになったので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 は処理を中止します。

bluenote by BBB