- 追加された行はこの色です。
- 削除された行はこの色です。
*Trackerプラグインでページに隙間があるとそこを利用してしまう [#m7f73a9d]
-ページ: BugTrack
-投稿者: [[kak]]
-優先順位: 低
-状態: CVS待ち
-カテゴリー: その他
-カテゴリー: プラグイン
-投稿日: 2005-01-18 (火) 20:48:33
-バージョン:
**メッセージ [#r59ded53]
([[org:続・質問箱/539]])([[org:続・質問箱/522]])
現在の tracker プラグインでは番号1のページから最後のページまでをトレースしていき、隙間があるとそのページを利用するアルゴリズムになっています。
この辺には好き嫌いがあるのかもしれませんが、単純に一番最後の次のページを作成する方が計算量的にも早いし、上の質問箱のようなこともおこらないかと思います。隙間を再利用すると関係のないバックアップも残ってしまっていますし。
----
-動作は追っていないのですが。バックアップファイルを改変してしまうのはあんまり好ましくないですね。毎回ユニークなIDを発行してくれないというのも厳密な番号管理上問題になりそうです。改造はできそうですか? -- [[henoheno]] &new{2005-01-18 (火) 22:39:42};
-2つ方法があると思いますが、どちらにすべきでしょうか?~
1. get_existpages() ですべてのページを取得し、たとえば「質問箱」という文字列を含むページのみをとりだし、ソートし、最後のページを見つけ、番号をとりだす。~
2. どこかに最後の番号をキャッシュしておき、それを取り出す。~
1. はお分かりの通り遅そうです。ページが増えるにつれてさらに遅くなります。が、ページを作るとき1度だけだと考えれば別にいいのかもしれない。2. の cache でいいですよね? -- [[kak]] &new{2005-01-19 (水) 01:10:17};
-ちなみに問題箇所は 110 行からの
// ページ名を決定
$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]] &new{2005-01-19 (水) 01:10:17};
-ページ名は明示的にフォームから[_name]で指定することもできますよね。明示的に指定されていれば、その値をページ名として利用し、指定がされなければ、連番を使うといった仕様だったと思います。[[しろくろのへや:tracker.inc.php]]の予約項目をご覧ください。( is_pagename()や is_page()は lib/func.phpで定義されてますね ) -- [[jjyun]] &new{2005-01-19 (水) 02:31:03};
--$real = is_pagename($name) ? $name : ++$num; は [_name] フォームで指定して名前がページ名として使用できない場合(変な記号が入っているとか)、++$num の値を利用しているわけですが、なぜ ++$num なのだろう。となぜ1なのだろうと思ったわけです。結果、あえて $base/1 のようなページ名を作らせて、連番ループに入らせているみたいですね。ちなみに [_page] と [_name] のフォームを両方作っていると、たとえば [_page] フォームで何も指定していないとしても、if (array_key_exists('_page',$post)) にヒットして、[_name] 用の処理が行われないという不具合があるようです。ちなみに [_name] は $base/$name のような相対指定、[_page] は $page そのものが使われる絶対ページ指定のようです。しろくろさんのページには form に対しての [_page] はかかれていません。 -- [[kak]] &new{2005-01-19 (水) 03:00:52};
-単純にバックアップがあるかどうかを確認して重複チェックするとか。 -- [[teanan]] &new{2005-01-19 (水) 02:48:51};
- while (is_page($page))
+ while (is_page($page) || backup_file_exists($page))
{
$real = ++$num;
$page = "$base/$real";
}
--こんな感じで。試してみたところは大丈夫そうです。 -- [[teanan]] &new{2005-01-19 (水) 02:57:33};
-- それがよさそうですね。キャッシュを作ったとしてもその中身をいじられると結局同じですから。でも、バックアップファイルなどもきれいさっぱり消されている場合は、隙間のページを利用するわけで、先の質問箱のようにユーザーが不思議に思う状況がでてこないとも限らないですよね。-- [[kak]] &new{2005-01-19 (水) 03:05:41};
--でもまぁめんどくさいし、バックアップが壊されなければいいということで、こんなかんじで
$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]] &new{2005-01-19 (水) 03:16:55};
-ところで、[_name] [_page] で指定したページ名がすでに存在していた場合、うむをいわさず連番ページを作成しているようなのですが、いいのですかね?まぁいいか。 -- [[kak]] &new{2005-01-19 (水) 03:20:36};
#comment