ツリー型ビューの作成
新年明けましておめでとうございます!!!
安藤ですm(_ _)m
本年もよろしくお願いいたします。
さて僕の自作php掲示板作りも佳境を迎えているわけなのですが、一番悶絶したのはツリー型データの作成です。。
それって何ぞや?っていうと、掲示板に投稿した記事への返信記事、それへの返信記事、さらにそれへの返信記事、というように、入れ子構造状に記事を形成しようっていうやつです。
こんな感じに記事を表示したいわけですね!
やり方が分かってしまえば何てことはないのですが、シンプルな答えに辿り着くまで苦労しましたねぇ(*_*)
社長にヒントをもらって、PUSHして、コード見てもらって、ダメをもらって、それを繰り返し。
訳がわからなくなったら、とにかくシンプルに考える。
これを大事にしていこうと思いました。
そうすれば灯台元暗し、答えが見つかる気がします。
さて、コーディングを振り返ってみますと、、、
data.php
・・・
//記事一覧データの取得
function getPostList($con,$table_name,$target_id = 0)
{
//データの初期化
$post_list = array();
//一覧データの取得
$statement = $con->prepare("SELECT * FROM $table_name WHERE target_id = :target_id ORDER BY id DESC");
$statement->bindValue(':target_id',$target_id,PDO::PARAM_STR);
$statement->execute();
while($row = $statement->fetch(PDO::FETCH_OBJ))
{
array_push($post_list,$row);
}
//記事一覧データを返却
return $post_list;
}
・・・
こんな具合に、まずは記事一覧を取得します。
子記事がどの親記事に対する返信なのかを判断するため、テーブルにはtarget_id
というカラムを用意。子記事の場合は対象の親記事id
、親記事自体の場合は0
が入ります。
問題はここからで、どうやって子記事を追加し続けるのかですね。
僕の苦悶の末にたどり着いた処理がこれ!!!!
・・・
//ツリー型一覧データの形成
function getTree($con,$table_name,$parent_posts)
{
//各記事ごとに処理
foreach($parent_posts as $post)
{
//対象の返信一覧を取得し、childrenに挿入
$post->children = getPostList($con,$table_name,$post->id);
//取得したchildrenから更に対象の返信一覧の取得、これをループ
$post->children = getTree($con,$string_table,$file_table,$post->children);
}
//ツリー型一覧データを返却
return $post_data;
}
・・・
こうすることで、各記事ひとつひとつに対し、返信一覧が取得出来る限り、一覧をchilren
に追加し続ける、というループ処理が可能です(^^)
たったこれだけの行なのに。。。
何日間か迷走しちゃいましたw
そろそろ自作での掲示板づくりもおわり!
ブログもあと何回かで終わりそうです。
次のシリーズは、Flamework「Laravel」を扱うことになるかと!
今年はどんどん学ぶぞ〜