例えば…
- カテゴリー名じゃなくそのディレクトリ(ないしはそこへのリンク)自体を返すプチプラグイン
- トラックバック受付期間を利用しての自動的な期間限定アナウンス機能
- BBS 用にコメントでソート順が上がるよう改造
- BBS のレス(コメント)でのアイコンサポート
- Perl の CGI でのアクセスカウンタやアクセス解析を、PHP のプラグインで実現
溜めすぎて力尽きそうなくらい(^^;
…ひとつひとつやっていこう。
とりあえず BBS でレス(コメント)がついたら上げる機能をつけよう、と思ってソースを眺め、トラックバックとコメントが同じ log ファイルに混ざって保存される仕組みになっていることを知る。
改造するなら別ファイル化したほうがいじりやすいけど…あまりいじりすぎると、rNote がバージョンアップしたときに差し替えるの大変だし…。
他にいい手はないかと眺めていると、recent.cache なるところにコメントされた日付と対象ファイルが格納されているのを見つけた。
どうも最近 64 個までの更新が格納されるみたい。
何にどうつかっているのかと検索してみたら、$LastModifiedTime(最終更新日時) の生成にのみ使用しているっぽい。
ん~。
というわけで、あきらめてがんばってみる。
どうやら <%=$site_item%> でのソートは SelectFileList() でやっているらしいので、ここの switch に
case 'cr': SortFileByCommentTime( $flisttmp ); break;
を追加してみる。
この関数自体は
function CompareFileTime( $a, $b )
{
if( $a[ FILELIST_DATE ] == $b[ FILELIST_DATE ] ) return 0;
return ( $a[ FILELIST_DATE ] < $b[ FILELIST_DATE ] ) ? 1 : -1;
}
function SortFileByCommentTime( &$filelist )
{
foreach( $filelist as $fname =%gt; $lst )
{
$logfile = DIR_DATA.ext_change($fname,EXT_LOGFILE);
if( ! file_exists( $logfile ) ) continue;
$log_data = _file($logfile);
$d0 = end( $log_data );
if( ! $d0 ) continue;
list ($name,$url,$com,$times,$title,$mode)
= explode("\t",str_replace("\n","",$d0));
// とりあえずトラックバックでも上げてみよう
// if( $mode == 'tb' ) continue;
if( $times > $lst[ FILELIST_DATE ] )
{
$filelist[ $fname ][ FILELIST_DATE ] = $times;
}
}
uasort( $filelist, CompareFileTime );
}
といった感じ。
こう書くとすんなり出来たみたいだけど、実は数回の試行錯誤を重ねてる…。
もともと PHP は レッツPHP! さんの携帯機種判別をコピったことがあるくらいでぜんぜん判らないし(^^;
PHP マニュアル とにらめっこしてようやく、といったところ(^^;
で、実験するとなんとなく上手くいったみたい。
そこで次はトラックバック受付期間を利用しての自動的な期間限定アナウンス機能に挑戦。
これはアナウンス用の記事に <WB_Accept> を設定、受付期間内なら最新のを 1 つだけトップページに表示する、というもの。
表示するアナウンスがなければいつもの「ようこそ」メッセージを表示するのだ。
そう、別にこの機能はソースを改造しようというのではなく、スキンの修正だけでやれちゃうのだ。
でもサポートページをよーく見ると、if flag="bAccept" などで判定できるのは WriteBack 用スキンの中だけ(T_T)
思いついた時にはナイスアイディア! と喜んだのに。
Σ(°°)
そうか ITEM 用スキンでもこれ使えるようにしちゃいえばいいんだ!
と思ってさっそく if 文の処理をしてるぽい skin_macro() 関数で IsWBAccept() 関数の呼び出しをしようと…して、WriteBack 用スキンを処理する WriteBack() 関数でも当然使っていて、しかもこの関数からはその後 skin_macro() が呼ばれることに気付く。
処理が重なっちゃう!
というわけで、結局 GetContentsEach() に入れることにした。
えとこんな感じ↓
// 元の呼び出しをコメントアウトし下の処理と差し替え
// skin_macro($a,$fname);
$iAccept = IsWBAccept($fname);
$flag['bAccept'] = false;
$flag['bTimeout'] = false;
if($iAccept==WB_FLAG_ACCEPT){
$flag['bAccept'] = true;
}elseif($iAccept==WB_FLAG_TIMEOVER){
$flag['bTimeout'] = true;
}
skin_macro( $a, $fname, $flag );
というわけで、実験の結果も OK!
順調…かな。

