Trackerプラグインでページに隙間があるとそこを利用してしまう

メッセージ

(official:続・質問箱/539)(official:続・質問箱/522)

現在の tracker プラグインでは番号1のページから最後のページまでをトレースしていき、隙間があるとそのページを利用するアルゴリズムになっています。

この辺には好き嫌いがあるのかもしれませんが、単純に一番最後の次のページを作成する方が計算量的にも早いし、上の質問箱のようなこともおこらないかと思います。隙間を再利用すると関係のないバックアップも残ってしまっていますし。



bugtrack プラグインのページチェックロジックを、tracker プラグインに取り入れてほしい

投稿日: 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)) {

素案なんで、エラーメッセージの部分がいいかげんなのは勘弁してください。



*1 $page = '/' . $real となるから

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-13 (火) 03:43:56
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.278 sec.

SourceForge