サンプルデータを使ってトップページの表示部分を作成します。[イメージ]
できるだけテンプレート側でのプログラムは少なくしたいと思います。
仕様では、カテゴリーごとにフォーラム名を一覧していくということでしたので
カテゴリーの配列とそのカテゴリー毎のフォーラムの配列が必要そうです。
必要なデータを取得するにはいくつかの方法があります。
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を渡すことにしています。
Copyright 1997-2010 BBB All rights reserved.