トップページの表示
サンプルデータを使ってトップページの表示部分を作成します。[イメージ]
できるだけテンプレート側でのプログラムは少なくしたいと思います。
仕様では、カテゴリーごとにフォーラム名を一覧していくということでしたのでカテゴリーの配列とそのカテゴリー毎のフォーラムの配列が必要そうです。
必要なデータを取得するにはいくつかの方法があります。
1. 外部結合を使って一度に全て取得する
select c.cat_name,f.forum_name from category c left join forum f on c.cat_id = f.cat_id;
2. 2回に分けてcategoryとforumをそれぞれ取得する。
select * from category;
mysql_fetch_array(ループ)
select forum_id,forum_name,topic_count from forum where cat_id = 取得したcat_id;
mysql_fetch_array(ループ)
例.1
<?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("forum"))){
die("select error");
}
$sql = "select c.cat_name,f.forum_id,f.forum_name,f.topic_count "
. "from category c left join forum f on c.cat_id = f.cat_id";
$dyn = mysql_query($sql);
if(!$dyn){
die("query error");
}
$i = -1;
while($row = mysql_fetch_array($dyn)){
if($row['forum_id'] != NULL){
$forum['forum_id'] = $row['forum_id'];
$forum['name'] = $row['forum_name'];
$forum['topic_count'] = $row['topic_count'];
$forums[$cur_name][] = $forum;
}
}
$smarty->assign('forums',$forums);
$smarty->display('index.tpl');
mysql_close($cn);
?>
例.2
<?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("forum"))){
die("select error");
}
$sql = "SELECT cat_id,cat_name FROM category";
$dyn = mysql_query($sql);
if(!$dyn){
die("query error");
}
$i = 0;
while($row = mysql_fetch_array($dyn)){
$cur_name = $row['cat_name'];
$sql = "SELECT forum_id,forum_name,topic_count "
. "FROM forum where cat_id = " . $row['cat_id'];
$dyn_forum = mysql_query($sql);
if(!$dyn_forum){
die("query error");
}
$j = 0;
while($rec = mysql_fetch_array($dyn_forum)){
$forum['forum_id'] = $row['forum_id'];
$forum['name'] = $row['forum_name'];
$forum['topic_count'] = $row['topic_count'];
$forums[$cur_name][] = $forum;
}
}
$smarty->assign('forums',$forums);
$smarty->display('index.tpl');
mysql_close($cn);
?>
phpは、今まで使用してきた関数なので問題ないと思います。
カテゴリーとフォーラムの配列を別にしているのはテンプレート側で、条件分岐の記述をしたくないからです。(他の方法もあるかもしれません。)
次にテンプレートを作成します。
phpから受け取る変数は、$catと$forumsになります。
例.3
<title>forum</title>
</head>
<body>
<table bgcolor=#FE9423 cellspacing=1 cellpadding=0>
<tr><td>
<table bgcolor=#FFFFFF cellspacing=0 cellpadding=0>
<tr><td>
<table width=500>
<tr>
<td align=center width=450><font size=2>フォーラム</font></td><td >topic</td>
</tr>
{foreach name=cat_idx key=cat_name item=forum from=$forums}
<tr bgcolor=#7B9FB6>
<td colspan=2>{$cat_name|escape}</td>
</tr>
{foreach item=foruminfo from=$forum}
<tr bgcolor=#E7EFF0>
<td><a href=viewtopic.php?fid={$foruminfo.forum_id}>{$foruminfo.name|escape}</a></td>
<td align=right>{$foruminfo.topic_count|escape}</td>
</tr>
{/foreach}
{/foreach}
</table>
</td></tr>
</table>
</td></tr>
</table>
</body>
</html>
配列を作る際、添え字(普通の配列)にするか連想配列にするかは悩みどころですね。
今回$forums.$catとして連想配列を使用していますが、$forums[$smarty.foreach.cat_idx.iteration]として添え字を使って実行することも可能でした。この場合、iterationは1から始まるので添え字の開始位置を気をつけないといけません。
トピックの画面に遷移する際、GET METHODでforum_idを渡すことにしています。