« 2009年5月 | トップページ | 2009年9月 »

2009年6月

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 の値を利用できるようになりました。めでたい。

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

|

2009.06.24

XOOPSメモ:d3forumでフォーラム毎の承認待ち件数

d3forumモジュールの承認待ち件数取得プラグインwaiting.plugin.php (XOOPS_TRUST_PATHのmodules/d3forum/include内。拡張承認待ちコンテンツwaitingモジュールから呼び出される)。XOOPSを初めてもうすぐ3週間、d3forumと格闘し敗れ再びインストールして2日。試行錯誤の末作成。なくなったら嫌だからメモ。

データ件数が少ない時しかだめだろうなぁ。

  • forumタイトルを別の手段で表示するなら2つめのJOINは不要
  • forumリストで回してSQLを発行する方が良いと思う

……だけどよくわからないからSQL1回でごりおししました。ご了承ください。

ダウンロード waiting.plugin.php (1.1K)

<?php

function b_waiting_d3forum( $mydirname )
{
$db =& Database::getInstance();
$ret = array();

$sql = "SELECT ".$db->prefix($mydirname."_topics").".forum_id, forum_title, ".
   " COUNT( ".$db->prefix($mydirname."_topics").".forum_id ) AS waiting_count ,MIN( post_id ) AS post_id".
   " FROM (".$db->prefix($mydirname."_posts")." LEFT JOIN ".$db->prefix($mydirname."_topics").
   " ON ".$db->prefix($mydirname."_posts").".topic_id = ".$db->prefix($mydirname."_topics").".topic_id)".
   " INNER JOIN ".$db->prefix($mydirname."_forums").
   " ON ".$db->prefix($mydirname."_topics").".forum_id = ".$db->prefix($mydirname."_forums").".forum_id".
   " WHERE ".$db->prefix($mydirname."_posts").".approval = 0".
   " GROUP BY ".$db->prefix($mydirname."_topics").".forum_id";

if ($recs = $db->query($sql)){
while ($result = $db->fetchArray($recs)){
$ret[] = array(
'adminlink' => XOOPS_URL.'/modules/'.$mydirname.'/index.php?post_id='.intval($result['post_id']) ,
'pendingnum' => intval($result['waiting_count']) ,
'lang_linkname' => $result['forum_title'] //._PI_WAITING_WAITINGS ,
) ;
}
}

return $ret ;
}
?>

|

2009.06.05

[TeraTerm] SSHで自動ログインするマクロ

SSH2対応 かつ UTF-8対応の TeraTerm: http://sourceforge.jp/projects/ttssh2/

以下のマクロを実行すると、初回だけユーザー名とパスワードを入力するダイアログが表示される。
C:\Data\myserver.dat というファイルが作られ(ファイル名は何でもよい)、ユーザー名とパスワードが C:\Data\myserver.dat に暗号化された状態で保存される。
ファイル名を myserver.ttl で作成、右クリック→プログラムから開く で、TeraTerm.exe と一緒にインストールされるTTPMacro (C:\Program Files\teraterm\ttpmacro.exe)を選択。「この種類のファイルを開くときは、選択したプログラムをいつも使う」を有効にすれば、ダブルクリックなり、コマンドラインで「myserver.ttl」を実行するなりで、さくっとログインできる。おめでとう。


hostname = 'XXX.XXX.XXX.XXX'
getpassword '
C:\Data\myserver.dat' 'UserName' myname
getpassword '
C:\Data\myserver.dat' 'Password' mypassword
msg = hostname
strconcat msg ':22 /ssh /2 /auth=password /user='
strconcat msg myname
strconcat msg ' /passwd='
strconcat msg mypassword
connect msg

西村自宅構成:ThinkPad(WindowsXP) から MacBookに、Teratermでログインできると便利.だ、ということで、

STEP1c:\bat\MacBook.ttl」に上記マクロを保存(c:\bat にはPATHが通っている状態)

STEP2 環境変数 PATHEXT に .ttl を追加

STEP3 コマンドラインで \> macbookmac[TAB][Enter]) でMacBookにログインしたTeraTermが起動

コマンドラインで作業しているとは限らないので、クリックしやすい場所にショートカットも作ってあります。

|

« 2009年5月 | トップページ | 2009年9月 »