メッセージ表示部の作成
アプリケーション全体で使用するための共通スクリプト、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関数を呼んでいるのがポイントとなります。
[ソース]