201.一覧ページの記述方法(Smarty版)

 Smartyを使ったメンバー一覧sources/member_list_smarty.phpとなります。
 さっと全体を見るとわかると思いますが。HTMLブロックがありません。HTMLはSmartyのテンプレートディレクトリに記述します。

Smartyのインクルード

 まず、上のほうに
require_once("inc_smarty.php");
 という記載があります。ここでinc_smarty.phpを呼び出してしているわけですがその内容は
<?php
//Smartyの読み込み
require_once('../Smarty/libs/Smarty.class.php');
//Smartyを構築
$smarty = new Smarty();
//Smartyの各ディレクトリを設定
$smarty->template_dir = '../Smarty/templates/';
$smarty->compile_dir = '../Smarty/templates_c/';
$smarty->config_dir = '../Smarty/config/';
$smarty->cache_dir = '../Smarty/cache/';
?>
 となっています。ここではsourcesディレクトリからの相対パスで
//Smartyの読み込み
require_once('../Smarty/libs/Smarty.class.php');
//Smartyを構築
$smarty = new Smarty();
 を行ってます。これでSmartyクラスのインスタンスが構築されます。変数名は$smartyです。これはグローバル変数ですので。関数内で使用する場合はglobal宣言が必要になります。
 そのあとはSnartyにテンプレート位置や、キャッシュの位置を設定します。
 ですからsources/member_list_smarty.php側ではこのファイルを呼び出せばSmartyの準備は完了となります。

Smartyへのアサイン

 Smartyアサインという概念があります。PHPで定義した変数Smartyに伝える仕組みです。
 例えば、158秒目付近に一覧のアサインがあります。
function assign_member_list(){
    //$smartyをグローバル宣言(必須)
    global $smarty;
    global $rows;
    $smarty->assign('rows',$rows);
}
 ここでは、Smartyに$rows配列rowsという名前でアサインします。こうすることで、Smartyのテンプレートでこの変数を使えるようになります。

Smartyのdisplay

 必要な変数をアサインしたら、最後に
//Smartyを使用した表示(テンプレートファイルの指定)
$smarty->display('member_list_smarty.tmpl');
 と記述して、Smartyに出力を指示します。この際テンプレートファイル名を指定します。

Smartyのテンプレート

 テンプレートは前に指定したようにSmarty/templatesディレクトリにあります。この中のmember_list_smarty.tmplが一覧ページ用のテンプレートになります。以下抜粋です。
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="css/main.css" rel="stylesheet" type="text/css">
<title>メンバー一覧</title>
{literal}
<script type="text/javascript">
<!--
function set_func_form(fn,pm){
    document.form1.target = "_self";
    document.form1.func.value = fn;
    document.form1.param.value = pm;
    document.form1.submit();
}

function del_func_form(pm,mess){
    var message = "本当に\r\n";
    message += mess;
    message += "\r\nを削除しますか?";
    if(confirm(message)){
        document.form1.target = "_self";
        document.form1.func.value = 'del';
        document.form1.param.value = pm;
        document.form1.submit();
    }
}
// -->
</script>
{/literal}
</head>
<body>
//中略

<table>
<tr>
<th>メンバーID</th>
<th>メンバー名</th>
<th>操作</th>
</tr>
{foreach from=$rows key=k item=value}
<tr>
<td width="20%" class="center">
{$value.member_id}
</td>
<td width="65%" class="center">
<a href="member_detail_smarty.php?mid={$value.member_id}">{$value.member_name}</a>
</td>
<td width="15%" class="center">
<input type="button" value="削除確認" 
    onClick="javascript:del_func_form({$value.member_id},'【{$value.member_name}】')" /></td>
</tr>
{foreachelse}
<tr>
<tr><td colspan="3" class="nobottom">メンバーが見つかりません</td></tr>
</tr>
{/foreach}
</table>
//中略

 まず、注意したいのはjavascriptブロックです。Smartyと記号がかぶってしまうので{literal}で囲みます。
 またforeachで始まるブロックがメンバー一覧表示しているところです。このドキュメントはSmartyの文法を説明するものではないので詳細は述べませんが、テンプレートエンジンは中にループを記述することができます。つまりPHP側では、配列であれ単純な変数であれ、テンプレートエンジンに変数のみ渡せば、テンプレート内でループ処理が書けるので、非常に便利になります。また、デザインをそのままかけるので、デザインの修正にも柔軟に対応できます。

 このようにテンプレートエンジンを使うと、ソースとデザインの分離が図れるだけではなく、デザインも柔軟に反映できます。Smartyに限らず、PHPOBaseを使う場合、ぜひテンプレートエンジンを併用するといいと思います。