メッセージ表示部の作成

メモ:  Category:php

アプリケーション全体で使用するための共通スクリプト、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関数を呼んでいるのがポイントとなります。

[ソース]

bluenote by BBB