アプリケーション全体で使用するための共通スクリプト、common.phpを作成します。
テンプレートクラスとデータベースクラスをcommon.phpで読み込みます。
GETで取得できるパラメータをクラスに変更します。
<?php class B3Foruminfo{ public $fid; public $tid; public $pid; public $pg; function __construct(){ $this->fid = $_GET['fid']; $this->tid = $_GET['tid']; $this->pid = $_GET['pid']; $this->pg = $_GET['pg']; } } ?>
このクラスもcommon.phpに追加します。
各クラスをcommon.phpでインスタンス化します。
<?php require('include/template.php'); require('include/db.php'); require('foruminfo.php'); $smarty = new B3Tpl(); $db = new B3DB("localhost","ユーザー","パスワード","データベース"); $foruminfo = new B3Foruminfo(); ?>
これで準備ができました。
ここからメッセージ表示部を作成していきます。メッセージ表示部は、msg.phpとします。
テンプレートは、msg.tplとします。
今回は、選択されたポストメッセージの表示と投稿された件名の一覧(ツリー)表示です。
選択されたポストメッセージの表示は、選択されたものだけを表示したいので
post_idを元に表示データを作成します。
トピックの一覧から画面遷移した場合、post_idの取得ができないのでtopic_idから
post_idを取得します。msg.php内でのスレッドの選択ではpost_idを受け取るようにします。
post_idが取得できる場合は、そのままpost_idを使用します。
メッセージ表示に必要な情報もクラスとして取得するようにします。
<?php class B3Post{ public $subject; public $message; public $user; public $post_date; function __construct($pid,$db){ $sql = "SELECT * FROM post_message WHERE post_id = " . $pid; $dyn = $db->Query($sql); if(!$dyn){ die("query error"); } $row = $db->FetchRow($dyn); $this->subject = $row['post_subject']; $this->message = str_replace("\n","<br>",$row['post_msg']); $this->user = $row['post_user']; $this->post_date = $row['post_date']; } } ?>
コンストラクタにpost_idとデータベースオブジェクトを渡すと
メッセージ情報を取得します。
次に、スレッド表示部です。これは、再帰呼出を使用したいと思います。
親となるpost_idから子メッセージを取得し、取得したpost_idを親として
子を取得するようにします。
function ExpandMsg($post_id){ global $postarray; global $db; global $level; $levelstr; $level++; //表示をツリーに見せるためスペースをセット for($i = 0;$i < $level;$i++){ $levelstr = $levelstr . " "; } $sql = "SELECT post_id,post_subject,post_user,post_date FROM post_message " . "WHERE parent_post_id = " . $post_id; $dyn = $db->Query($sql); if(!$dyn){ die("query error"); } while($row = $db->FetchRow($dyn)){ $postarray[$row['post_id']]['post_id'] = $row['post_id']; $postarray[$row['post_id']]['level'] = $levelstr; $postarray[$row['post_id']]['post_subject'] = $row['post_subject']; $postarray[$row['post_id']]['post_user'] = $row['post_user']; $postarray[$row['post_id']]['post_date'] = $row['post_date']; ExpandMsg($row['post_id']); } $level--; }
関数内でグローバル変数を使うには、globalとつけて宣言します。
スレッドの表現を件名の前にスペースを入れることで表現するようにしています。
後は、通常のSELECT文の処理と同じですね。
whileの中でExpandMsg関数を呼んでいるのがポイントとなります。
[ソース]
Copyright 1997-2010 BBB All rights reserved.