トップページの表示

メモ:  Category:php

サンプルデータを使ってトップページの表示部分を作成します。[イメージ]
できるだけテンプレート側でのプログラムは少なくしたいと思います。

仕様では、カテゴリーごとにフォーラム名を一覧していくということでしたのでカテゴリーの配列とそのカテゴリー毎のフォーラムの配列が必要そうです。

必要なデータを取得するにはいくつかの方法があります。

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を渡すことにしています。

bluenote by BBB