#author("2022-05-20T05:52:33+09:00;2021-03-28T11:23:41+09:00","default:kanateko","kanateko")
#author("2022-07-06T04:29:04+09:00;2021-03-28T11:23:41+09:00","default:kanateko","kanateko")
&tag(カスタマイズ,プラグイン改造);
#title(【PukiWiki】renameプラグインを改造して管理者以外でもページ名の変更をできるようにする)
#contentsx

*変更箇所のまとめ [#s00080eb]
-alias.inc.phpの導入
-管理者以外でもページ名の変更をできるようにする。

*変更の詳細 [#s25e95d6]

**alias.inc.phpの導入 [#alias]
[[alias.inc.php>Pukiwikiカスタマイズ#add_alias]]の導入に際して以下の記述を追加。

#prism(diff-php diff-highlight){{
function plugin_rename_get_files($pages)
{
@@ -305,6 +305,7 @@
 	$dirs  = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
 	if (exist_plugin_convert('attach'))  $dirs[] = UPLOAD_DIR;
 	if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR;
+	if (exist_plugin_convert('alias')) $dirs[] = ALIAS_DATA_DIR;
 	// and more ...
 
 	$matches = array();
}}

**管理者以外でもページ名の変更をできるようにする [#jce68747]
利用者から多く要望があったため、管理者以外でもページ名の変更を可能にする。

***主な仕様 [#b58c9e2a]
-ゲストパスを設定して、パスワードとして使えるようにする。
-変更履歴の記録ページを":RenameLog"から"RenameLog"に変更。
--ゲストパスの場合はRecentChangesに記録して変更したことを認識しやすくする。
--管理者パスの場合は今まで通りRecentChangesに記録されないようにする。
-編集制限のかかったページや凍結されたページはページ名の変更を制限する。
--編集制限のかかったページの場合は最初にログインを促す。
--凍結されたページはゲストパスだと弾かれるようにする。

***変更点の詳細 [#pd142f49]
まずはゲストパスの設定を追加する。今回はguestをパスに設定。また、記録用ページも変更しておく。

#prism(diff-php diff-highlight){{
-define('PLUGIN_RENAME_LOGPAGE', ':RenameLog');
+define('PLUGIN_RENAME_LOGPAGE', 'RenameLog');
+define('PLUGIN_RENAME_GUESTPASS', 'guest');
}}

記録ページを変更するのは、記録ページをRecentChangesに反映させて、ゲストがページ名を変更したことを察知しやすくするため。気にしない人、もしくはコロンから始まるページ名をnon_listから外している人 (そうそういないとは思うが) などは記録ページを変更する必要はない。既に:RenameLogのページがある場合は既存のページ名を変更しておくことを推奨する。

︙

次に実際の動作を変更していく。
最初にページ名変更ボタンを押した時点で編集制限がかかってるページかどうかを判別する。

#prism(diff-php diff-highlight){{
 function plugin_rename_action()
 {
 	global $whatsnew;
 
 	if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
+	edit_auth(plugin_rename_getvar('refer'), true, true);
 
 	$method = plugin_rename_getvar('method');
 	if ($method == 'regex') {

}}

ここでcheck_editableではなくedit_authを選択しているのは、check_editableの場合だと、管理者であっても凍結されたページをいちいち凍結解除しないとページ名変更ができなくなるため。そんなの気にしない人はedit_authをcheck_editableに変えてもいい。

パスワード要求の処理が最初にあればedit_authとis_freezeの処理分けなくてもいいのになぁと思ってみたり。そのうち最初に要求するよう変えるかもしれない。

︙

気を取り直し、次はゲストと管理者で処理を分けていく。

#prism(diff-php diff-highlight){{
 				$exists[$_page][$old] = $new;
 
 	$pass = plugin_rename_getvar('pass');
-	if ($pass != '' && pkwk_login($pass)) {
-		return plugin_rename_proceed($pages, $files, $exists);
-	} else if ($pass != '') {
+	$is_admin = pkwk_login($pass);
+	$is_guest = ($pass == PLUGIN_RENAME_GUESTPASS);
+	$refer = plugin_rename_getvar('refer');
+	if ($pass != '' ) {
+		switch (true) {
+			case ($is_guest):
+				check_editable($refer);
+			case ($is_admin):
+				return plugin_rename_proceed($pages, $files, $exists, $is_admin);
+				break;
+			default:
                $msg = plugin_rename_err('adminpass');
 	    }
+	}
 
 	$method = plugin_rename_getvar('method');
 	if ($method == 'regex') {

}}

入力されたパスワードが上で設定したゲストパスと一致する場合は、ページ名変更処理に入る前にページが編集可能かどうかの判定を行う。管理者パスワードと一致する場合はそのままページ名変更処理へ。また、plugin_rename_proceed関数に管理者判定を渡すように変更しておく。

余談だが、switch(true)というコードの使い方には賛否あるらしい。今回はフォールスルーが便利だったのでswitchを使ったが、気になる人はif文に変えたほうがいいかもしれない。

︙

これは必須の変更ではないが、一応ゲストパスがあることを利用者に伝えるようにする。
#prism(diff-php diff-highlight){{
   <input type="submit" value="{$_rename_messages['btn_submit']}" />
  </div>
 </form>
+<p>管理者以外の方は"guest"と入力することでページ名を変更できます。</p>
 <p>{$_rename_messages['msg_confirm']}</p>
 EOD;
}}

最後に実際のページ名変更処理で管理者判定を受け取り、管理者の場合はRenameLogのタイムスタンプを更新せず、ゲストの場合はこれを更新するよう手を加える。

#prism(diff-php diff-highlight){{
 	return $files;
 }
 
-function plugin_rename_proceed($pages, $files, $exists)
+function plugin_rename_proceed($pages, $files, $exists, $is_admin)
 {
 	global $now, $_rename_messages;
 
#prism(diff-php diff-highlight){{
 	// 更新の衝突はチェックしない。
 
 	// ファイルの書き込み
-	page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata));
+	page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata), $is_admin);
 
 	// Refresh RecentChanges / Delete cache/recent.dat
 	delete_recent_changes_cache();
}}

*ダウンロード [#id3e154f]
PukiWiki公式ページでも要望を見かけたので、ページ名変更を管理者以外でも可能にするこの改造はそこそこ需要があると思われる。と言うわけで、今回の改造を反映したものをgithubに置いておくので、必要な人は自由に使って欲しい。

[[GitHub:https://github.com/kanateko/pukiwiki-plugin]]

*コメント [#odda96a3]
質問や指摘などあればどうぞ。
----
#pcomment(,10,above,reply)
#pcomment(reply)