(official:続・質問箱/539)(official:続・質問箱/522)
現在の tracker プラグインでは番号1のページから最後のページまでをトレースしていき、隙間があるとそのページを利用するアルゴリズムになっています。
この辺には好き嫌いがあるのかもしれませんが、単純に一番最後の次のページを作成する方が計算量的にも早いし、上の質問箱のようなこともおこらないかと思います。隙間を再利用すると関係のないバックアップも残ってしまっていますし。
// ページ名を決定 $base = $post['_base']; $num = 0; $name = (array_key_exists('_name',$post)) ? $post['_name'] : ''; if (array_key_exists('_page',$post)) { $page = $real = $post['_page']; } else { $real = is_pagename($name) ? $name : ++$num; $page = get_fullname('./'.$real,$base); } if (!is_pagename($page)) { $page = $base; } while (is_page($page)) { $real = ++$num; $page = "$base/$real"; }のところです。$real = is_pagename($name) ? $name : ++$num; あたりで何を意図しているのかよくわかりません。-- kak 2005-01-19 (水) 01:10:17
- while (is_page($page)) + while (is_page($page) || backup_file_exists($page)) { $real = ++$num; $page = "$base/$real"; }
$base = $post['_base']; $name = (array_key_exists('_name',$post)) ? $post['_name'] : ''; $_page = (array_key_exists('_page',$post)) ? $post['_page'] : ''; if ( is_pagename( $_page ) ) { $page = $real = $_page; } else if ( is_pagename( $name ) ) { $real = $name; $page = get_fullname('./'.$real,$base); } else { $page = $base; // is_page($page) にヒットさせ連番ループに入らせる } while (is_page($page) || _backup_file_exists($page) ) { $real = ++$num; $page = "$base/$real"; }上の [_page] があるときは [_name] が働かない。の不具合も修正しています。自分の環境(1.4.4)では_backup_file_exists($page) のように _ が先頭についていたのですが。-- kak 2005-01-19 (水) 03:16:55
投稿日: 2007-11-07 (水) 23:05:33
上の話題とは少し違う方法なのですが、bugtrack プラグインがページを作る時には、まず50ごとにチェックしてそれから・・・、という処理をしています。
1から順番に数えていく今のロジックだと、100を超える数を数えるのにはそれなりに時間がかかるので、できればtracker にこの処理を取り入れてもらえないでしょうか。
cvs:plugin/tracker.inc.php (1.22)
$name = isset($post['_name']) ? $post['_name'] : ''; - if (isset($post['_page'])) { + if (isset($post['_page']) && $post['_page'] != '') { $real = $page = $post['_page']; } else { $real = is_pagename($name) ? $name : ++$num; $page = get_fullname('./' . $real, $base); } if (! is_pagename($page)) $page = $base; - while (is_page($page)) { - $real = ++$num; - $page = $base . '/' . $real; - } + if (is_page($page)) { + $jump = 0; + do { + $num = $jump; + $jump += 50; + $page = $base . '/' . $jump; + } while (is_page($page)); + do { + $real = ++$num; + $page = $base . '/' . $real; + } while (is_page($page)); + } $config = isset($post['_config']) ? $post['_config'] : '';
最初にif (is_page($page)) で括ることで、[_page] や[_name] で指定した場合に、途中で連番になってしまわないようにしています(if (! is_pagename($page)) に引っ掛かった場合を除く)。
if (is_page($page)) で括っているので、その中はwhile ループではなく、do-while ループにしています。連続で同じチェックしても意味無いですし。
投稿日: 2007-11-07 (水) 23:05:33
tracker にはベースページを作らなくても、パラメータとしてベースページを指定することで、他のページからも投稿できる機能があります。
しかし、次の部分の中で不正なページ名だった場合$page = $base としているので、ベースページが未作成だった場合、連番付きページではなくペースページに投稿してしまうと思います。
$base = isset($post['_base']) ? $post['_base'] : ''; $refer = isset($post['_refer']) ? $post['_refer'] : ''; // $page name to add will be decided here $num = 0; $name = isset($post['_name']) ? $post['_name'] : ''; if (isset($post['_page'])) { $real = $page = $post['_page']; } else { $real = is_pagename($name) ? $name : ++$num; $page = get_fullname('./' . $real, $base); } if (! is_pagename($page)) $page = $base;
この部分で不正なページと判断されるのは$post['_page'] に不正な文字が含まれている場合か、$base に不正な文字が含まれているか、$base が空文字の時*1です。
ふと思ったんですけど、$base が空文字の時だと$page も空文字になって'.txt' てファイル作ったりしませんよね?
改修案の素案
cvs:plugin/tracker.inc.php (1.22)
$num = 0; $name = isset($post['_name']) ? $post['_name'] : ''; if (isset($post['_page'])) { $real = $page = $post['_page']; } else { $real = is_pagename($name) ? $name : ++$num; $page = get_fullname('./' . $real, $base); } - if (! is_pagename($page)) $page = $base; + if (! is_pagename($page)) { + if (! is_pagename($base)) { + return array( + 'msg' => 'エラーメッセージ', + 'body' => 'エラーメッセージ' + ); + } + $page = $base . '/' . ++$num; + } while (is_page($page)) {
素案なんで、エラーメッセージの部分がいいかげんなのは勘弁してください。