トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/406

ページの作成や編集にはユーザ登録が必要です。

各種フックを提供するプラグイン

  • 投稿者: ぐうます
  • カテゴリ: 新規
  • 優先度: 低
  • 状態: リリース済
  • 日時: 2009年07月24日 00時56分21秒

 内容

FSWiki 非標準の各種フックを提供します。

機能

  • 下記のフックを発行します。
フック名 発行条件 フック引数1 フック引数2 フック引数3
change_page_level ページの参照権限(ページレベル)を変更したとき ページ名 変更後のページレベル 変更前のページレベル
change_config_(パラメータ名※1) 管理メニューの環境設定パラメータを変更したとき 変更後の値 変更前の値

※1:./config(/farm)/config.dat のパラメータ名

  • フック発行時に、次のファイルを作成します。そのファイルのタイムスタンプから、そのフックが最後に発行された日時を知ることができます。
./log(/farm)/フック名.hook.log

本プラグインパッケージの構成とインストール

  • 構成:添付ファイル hookplus.20090814.zip(323) に含まれるファイルは、次の 2 つです。
    • plugin/hookplus/Install.pm
    • plugin/hookplus/AdminConfigHandler.pm
  • インストール:
    1. hookplus.20090814.zip(323) をダウンロードし、FSWiki の動作しているサーバに展開して下さい。
    2. 管理メニューのプラグイン設定ページから、hookplus プラグインパッケージを有効にしてください。

適用可能な FSWiki バージョン

  • 特に制限なく、どの版でも適用可能と思います。
  • FSWiki 3.6.4 以降で本プラグインを有効にした場合は、フック発行時にファイル「./log(/farm)/フック名.hook.log」を作成する機能のみが有効化されます。
    • FSWiki 3.6.4 では、本プラグイン 2009-08-14 版の主要機能を取り込んでいただけましたので、その部分の機能は本プラグイン側では有効化されません。

制限事項

  • FSWiki 3.6.4 以降:次のメソッドをオーバーライドしているため、これらを独自改造している場合や、これらをオーバーライドする別プラグインと併用すると、どちらかが正しく機能しなくなる場合があります。
    • Wiki::do_hook()
  • FSWiki 3.6.3 以前:次の 3 メソッドをオーバーライドしているため、これらを独自改造している場合や、これらをオーバーライドする別プラグインと併用すると、どちらかが正しく機能しなくなる場合があります(※印を付したメソッドについては、内部で元のメソッドを呼び出しているので問題になる可能性は低いと思います)。
    • plugin::admin::AdminConfigHandler::save_config() ※
    • Wiki::do_hook()
    • Wiki::set_page_level() ※
  • change_config_(パラメータ名) フックのパラメータの種類は、適用先の FSWiki の plugin::admin::AdminConfigHandler.pm で定義されているものに限られます。

使用例 1

hookplus プラグインの機能を使用した例題プラグイン:keyword プラグイン keyword.20090724.zip(303) を添付します。このプラグインは、「ページの自動リンク」の設定を変更したときに発行される change_config_auto_keyword_page フック、及び change_config_keyword_slash_page フックを利用して、キーワードキャッシュファイルをクリアします。このプラグインを有効にすることにより、BugTrack-wiki/268:設定を変更しても,キャッシュファイルが残っていると設定が反映されないで報告されている不具合を解消することが出来ます。

使用例 2

BugTrack-plugin/405:keyword 高速化・機能強化プラグインは、hookplus プラグインと併用することにより、使用例 1 と同じフックを利用して同様の機能を実現します。

使用例 3

hookplus プラグインの機能を使用した例題プラグイン:rssclear プラグイン rssclear.20090814.zip(284) を添付します。このプラグインは、ページの参照権限レベルを変更したときに発行される change_page_level フックを利用して、rss feed キャッシュファイルをクリアします。FSWiki 標準添付の rss プラグインと、BugTrack-plugin/325:RSS関連(RSS1.0、RSS2.0、Atom0.3)プラグインの feed キャッシュに対応しています。

Tips

本プラグインには、今後も新たなフックを追加していく予定ですが、フックの種類が増えてゆくと、1 つの操作にともなって発行されるフックが増えることが予想されます。このとき、フックに登録する処理が比較的処理時間を要するものであり、かつ、その処理が複数種類のフックで起動される可能性がある場合、1 つの操作で同じ処理が複数回無駄に実行されて応答が遅くなってしまうかもしれません。このことから、フックに登録する処理はできるだけ軽くて繰り返されても無駄にならないものにするとよいのではないかと思います。

  • 悪いと思われる例:同時に起動される可能性がある複数のフックに、同じキャッシュファイルの更新処理を登録する。
  • 良いと思われる例:同時に起動される可能性がある複数のフックに、同じキャッシュファイルの削除処理を登録する。
    • キャッシュファイルの再作成は、キャッシュファイル削除後に最初にキャッシュファイルを読みにいった際に実施する。

提案プラグイン更新履歴

2009-08-14 版:hookplus.20090814.zip(323)
下記の変更を実施しました。
  • バグ修正:「ページレベル = 0 のページを削除時に、ページレベルデータが削除されない」というバグを修正。
  • バグ修正:「ページレベル = 0 のページを作成時に、ページレベルデータが登録されない」というバグを修正。
  • 仕様変更:バグ修正に伴い、change_page_level フック発行時に hook メソッド呼び出しの第 3 フック引数「変更前のページレベル」を削除。
2009-07-24 版:hookplus.20090724.zip
初版公開

例題プラグイン更新履歴

2009-07-24 版:keyword.20090724.zip(303)
初版公開
2009-08-14 版:rssclear.20090814.zip(284)
初版公開

ライセンス

GPL

 コメント

  • 取り込ませていただきました。SVNにコミット済みです。 - たけぞう (2009年08月12日 18時34分45秒)
  • 宛 たけぞうさん:コミットいただきましてありがとうございます。コミットいただいた直後に申し訳ありませんが、本プラグインの set_page_level() にはバグがありましたので、 SVN Head の Wiki.pm に対し、Wiki.pm.diff(277) の修正をお願い致します。 - ぐうます (2009年08月12日 23時48分05秒)

Wiki.pm.diff

--- Wiki.pm.revision=43	2009-08-12 23:33:32.000000000 +0900
+++ Wiki.pm	2009-08-12 23:32:11.000000000 +0900
@@ -1073,6 +1073,9 @@ sub set_page_level {
 	my $page  = shift;
 	my $level = shift;
 	
+	# $level が未定義ならページデータ削除なので、フック関連処理不要。
+	return $self->{"storage"}->set_page_level($page) if (not defined $level);
+
 	# 与えられた $level が現在のページレベルと等しければ何もせずに終了。
 	my $old_level = $self->get_page_level($page);
 	return if ($level == $old_level);
  • バグの内容は次の通りです。なお、本プラグインについても、この後、更新版を添付致します。 - ぐうます (2009年08月12日 23時48分05秒)
    • 「ページレベル無指定時には、そのページのページレベルデータを削除する」というのが本来の Wiki::set_page_level() の動作であるが、本プラグイン 2009-07-24 版の Wiki::set_page_level() では、「削除対象ページの現ページレベルが 0 の場合には、ページレベル無指定時にもページレベルデータが削除されない」。
  • ありがとうございます。パッチも取り込ませていただきました。 - たけぞう (2009年08月13日 01時15分52秒)
  • 宛 たけぞうさん:大変申し訳ありません。set_page_level() でもう 1 つバグを見つけてしまいました。SVN Head の Wiki.pm に対する修正案は Wiki.pm.diff3(292) になりますので、適用要否も含めてご検討をお願い致します。 - ぐうます (2009年08月13日 17時03分31秒)
    • バグ内容:新規ページ作成時、$wiki->set_page_level(ページ名, 0) を実行しても、showlevel.log にページレベルが登録されない。
    • バグ原因:showlevel.log にページレベルが未登録のページに対し、$wiki->get_page_level(ページ名) は 0 を返すことから、下記の if にて処理が途中終了してしまうため。
# 与えられた $level が現在のページレベルと等しければ何もせずに終了。
my $old_level = $self->get_page_level($page);
return if ($level == $old_level);
    • 備考:外から見た動作としては実質的には問題無いという見方もできますが、「存在する全ページのページレベルが showlevel.log には登録されるべきである」という観点からすると問題あると思います。

Wiki.pm.diff3

--- Wiki.pm.revision=46	2009-08-13 15:57:24.000000000 +0900
+++ Wiki.pm	2009-08-13 17:17:10.000000000 +0900
@@ -1073,15 +1073,11 @@ sub set_page_level {
 	my $page  = shift;
 	my $level = shift;
 	
-	# $level が未定義ならページデータ削除なので、フック関連処理不要。
-	return $self->{"storage"}->set_page_level($page) if (not defined $level);
-
-	# 与えられた $level が現在のページレベルと等しければ何もせずに終了。
-	my $old_level = $self->get_page_level($page);
-	return if ($level == $old_level);
-
 	$self->{"storage"}->set_page_level($page,$level);
 
+	# $level が未定義ならページデータ削除なので、フック関連処理不要。
+	return if (not defined $level);
+
 	# 処理の成否を検査。
 	my $new_level = $self->get_page_level($page);
 	if ($new_level != $level) {
@@ -1089,7 +1085,7 @@ sub set_page_level {
 	}
 
 	# ページレベルの変更に成功したので、フックを発行。
-	$self->do_hook('change_page_level', $page, $new_level, $old_level);	
+	$self->do_hook('change_page_level', $page, $new_level);
 }
 
 #==============================================================================
  • バグ修正を施した新版 hookplus.20090814.zip(323) を添付しました。また、使用例 3 を追記し、その例題プラグイン rssclear.20090814.zip(284) を添付しました。 - ぐうます (2009年08月14日 05時24分17秒)
  • Wiki.pm.diff3も取り込んでおきました。 - たけぞう (2009年08月14日 15時12分01秒)
お名前: コメント: