« XOOPSメモ:d3forumでフォーラム毎の承認待ち件数 | トップページ | 9月上旬の日記 »

2009.06.26

XOOPSメモ:d3forumの新着リストと未承認投稿

d3forumでフォーラム毎の承認待ち件数なんてやってたら、新着リスト(投稿リスト)に、承認待ち投稿のタイトルが表示されてしまうことが気になりだした。

下調べ1:この辺は、d3forum_block_list_posts.html というテンプレートで表示をコントロールしているようである。
表示部分は

<{foreach item=post from=$block.posts}>
<li style="margin:1px;"><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>">
<{$post.subject}></a> <{$post.uname}> <{$post.post_time_formatted}></li>
<{/foreach}>

とある(私はstyle属性を削除した:後々は外部CSSファイルで調整する方が楽なのだろうと思ったため)。

下調べ2:データベースを覗いてみるに、XXXXX_forum_posts、_topics、_forumsのようなテーブルがある。投稿は XXXXX_forum_posts で、タイトルや、承認済みかどうかなどかはこのテーブルに格納されている。不可視かどうかは invisible(不可視ならTRUEであろう)、未承認かどうかは approval(承認済みならTRUEなのであろう)というフィールドで判定できるようである。(忙しい人はまとめへ

じゃぁってことで、見よう見まねで条件を加えてみる。

<{if $post.approval && ! $post.invisible}>
     <li><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>"><{$post.subject}></a>
<{$post.uname}> <{$post.post_time_formatted}></li>
<{/if}>

ダメなようである。値はどうなってるんだろう? と思い、条件文を外して確認。

<li><{$post.invisible}><{$post.approval}><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>"><{$post.subject}></a> <{$post.uname}> <{$post.post_time_formatted}></li>

全部0(すなわちFALSE、というか初期値、というか値が取得されていない?)。何かが違う。

機能の作業を思い出してみるに、この辺は多分SQLでテーブル全体ではなく必要なフィールドだけを取り出しているに違いない。そしてここでは、invisibleや approvalは必要とされていなかったのではなかろうか。私の考えている用途と違うのかもしれないが、でも、私は invisibleや approvalが欲しい。

テンプレートやスタイルシートという話ではなさそうなのでソースを見るしかなさそうである。ひとまず、URLで指定されている/modules/d3forum/index.phpを見る。

require XOOPS_TRUST_PATH.'/modules/'.$mytrustdirname.'/main.php' ;という行に目をつける。そうか、XOOPS_TRUST_PATH下にあるファイルか。d3モジュールというのはそういうことになっているという話だったけど、なるほどそういうことか。

じゃぁってことで、とりあえず XOOPS_TRUST_PATHのmodules/d3forum/main.phpを見る。

// fork each pages
$page = preg_replace( '/[^a-zA-Z0-9_-]/' , '' , @$_GET['page'] ) ;
if( file_exists( "$mytrustdirpath/main/$page.php" ) ) {
     include "$mytrustdirpath/main/$page.php" ;
} else {
     include "$mytrustdirpath/main/index.php" ;
}

というあたりに目をつける。

XOOPS_TRUST_PATHのmodules/d3forum/main/を見る。

なんか違うっぽいと思う。

XOOPS_TRUST_PATHのmodules/d3forum/blocks/というディレクトリを見つける。

block_functions.php というファイルがあるのでそれを見る。

function b_d3forum_list_posts_show( $options ) を見つける。

SQL文のあたりを眺める。

$sql = "SELECT p.post_id, p.subject, p.votes_sum, p.votes_count, p.post_time, p.uid, f.forum_id, f.forum_title FROM…

から察するに、やはり、invisibleや approvalはない。他方、フォーラムIDやフォーラムタイトルは取得しているのだな、と思う。
(vote=役に立った云々の投票に関するやつだろうきっと、はむしろいらないんだけどなぁとも思うが何かするつもりはとりあえずない)

試しに、列名 forum_title をそのまま表示に使ってみる。

<li><{$post.forum_title}><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>"><{$post.subject}></a> <{$post.uname}> <{$post.post_time_formatted}></li>

なるほどフォーラム名が表示される。

じゃぁってことで、SQL文に invisibleと approvalを追加してみる(SELECT部分、p.invisible, p.approval。FROM句で投稿データのテーブル名を p に割り当ててある模様)。

$sql = "SELECT p.post_id, p.subject, p.votes_sum, p.votes_count, p.post_time, p.uid, p.invisible, p.approval, f.forum_id, f.forum_title FROM…

これだけではダメなようである。おちついて前後のソースを見る。

while( $post_row = $db->fetchArray( $result ) ) {
   $post4assign = array(
        'id' => intval( $post_row['post_id'] ) ,
        'subject' => $myts->makeTboxData4Show( $post_row['subject'] ) ,
        'forum_id' => intval( $post_row['forum_id'] ) ,
        'forum_title' => $myts->makeTboxData4Show( $post_row['forum_title'] ) ,
        'votes_count' => $post_row['votes_count'] ,
        'votes_sum' => intval( $post_row['votes_sum'] ) ,
        'post_time' => intval( $post_row['post_time'] ) ,
        'post_time_formatted' => formatTimestamp( $post_row['post_time'] , 'm' ) ,
        'uid' => intval( $post_row['uid'] ) ,
        'uname' => XoopsUser::getUnameFromId( $post_row['uid'] ) ,
   ) ;
   $block['posts'][] = $post4assign ;
}

ああここか、と思う。

じゃぁってことで

while( $post_row = $db->fetchArray( $result ) ) {
   $post4assign = array(
        'id' => intval( $post_row['post_id'] ) ,
        'subject' => $myts->makeTboxData4Show( $post_row['subject'] ) ,
        'forum_id' => intval( $post_row['forum_id'] ) ,
        'forum_title' => $myts->makeTboxData4Show( $post_row['forum_title'] ) ,
        'votes_count' => $post_row['votes_count'] ,
        'votes_sum' => intval( $post_row['votes_sum'] ) ,
        'post_time' => intval( $post_row['post_time'] ) ,
        'post_time_formatted' => formatTimestamp( $post_row['post_time'] , 'm' ) ,
        'uid' => intval( $post_row['uid'] ) ,
        'uname' => XoopsUser::getUnameFromId( $post_row['uid'] ) ,
        'invisible' => intval( $post_row['invisible'] ) ,
        'approval' => intval( $post_row['approval'] ) ,
   ) ;
   $block['posts'][] = $post4assign ;
}

てな感じで invisibleと approval の部分を追加(※arrayの中のラスト2行)。

よし。あらためて、d3forum_block_list_posts.html テンプレートでinvisibleと approval の値を表示してみる。

<li><{$post.invisible}><{$post.approval}><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>"><{$post.subject}></a> <{$post.uname}> <{$post.post_time_formatted}></li>

0や1がセットされている様子が見受けられる。万歳。

なので、そうだなぁ、未承認や不可視の発言は存在しないがごとく、という表示でいいんじゃなかろうか。

<{if $post.approval && ! $post.invisible}>
     <li><a href="<{$block.mod_url}>/index.php?post_id=<{$post.id}>"><{$post.subject}></a> <{$post.uname}> <{$post.post_time_formatted}></li>
<{/if}>

ここは管理者の好みと、参加者次第だよね。「未承認投稿」と表示した方がわかりやすいという場と、そういうのは見せないでおいてくれるかな、という場とあるからね。

まぁそれはさておき、やったことのまとめ

ファイル名:XOOPS_TRUST_PATHのmodules/d3forum/blocks/block_functions.php

(1)function b_d3forum_list_posts_show( $options ) にて、SQL文に p.invisible, p.approval を追加。

$sql = "SELECT p.post_id, p.subject, p.votes_sum, p.votes_count, p.post_time, p.uid, p.invisible, p.approval, f.forum_id, f.forum_title FROM…

(2)同じくfunction b_d3forum_list_posts_show( $options ) にて、$post4assign = array(の最後に invisibleと approvalの行を追加。

while( $post_row = $db->fetchArray( $result ) ) {
   $post4assign = array(
        'id' => intval( $post_row['post_id'] ) ,
        'subject' => $myts->makeTboxData4Show( $post_row['subject'] ) ,
        'forum_id' => intval( $post_row['forum_id'] ) ,
        'forum_title' => $myts->makeTboxData4Show( $post_row['forum_title'] ) ,
        'votes_count' => $post_row['votes_count'] ,
        'votes_sum' => intval( $post_row['votes_sum'] ) ,
        'post_time' => intval( $post_row['post_time'] ) ,
        'post_time_formatted' => formatTimestamp( $post_row['post_time'] , 'm' ) ,
        'uid' => intval( $post_row['uid'] ) ,
        'uname' => XoopsUser::getUnameFromId( $post_row['uid'] ) ,
        'invisible' => intval( $post_row['invisible'] ) , //added
        'approval' => intval( $post_row['approval'] ) , //added
   ) ;
   $block['posts'][] = $post4assign ;
}

(3)これで、d3forum_block_list_posts.html テンプレートでinvisibleと approval の値を利用できるようになりました。めでたい。

取得する列を増やした追加しただけなので、副作用は特にないはず(もちろん、処理に必要なメモリはその分増えるので、厳密に考えれば処理スピードに影響がでるかもしれないけど、今回の場合はまー影響ないっしょ、と思える範囲内だと思います)。

|

« XOOPSメモ:d3forumでフォーラム毎の承認待ち件数 | トップページ | 9月上旬の日記 »