サマリ | ページのメタデータを書くためのプラグインです。 |
---|---|
リビジョン | 1.1.2 |
対応バージョン | 1.4.7 |
投稿者 | jidaikobo |
投稿日 | 2007-05-22 (火) 10:50:19 |
メタデータを書くためのプラグインです。本文には出力したくないけど、メモをとっておきたいときに使います。
またさまざまな表示権限分け(ページの表示期限など)をスムーズに行う装置としても考えてみています(あくまで実験的ですが)。
引数は、出力はされませんが、$vars に突っ込まれます。このときはいわゆる HTML出力サニタイズはしていないので、スキンなどで使うときは注意が必要だと思います。
書式は以下の例の通りです*1。編集画面改造を行わない場合の引数は自由ですが、$vars につっこむので、カンマ区切りで、ラベル = シングルクォート囲みの値にした方がいいと思います。
#meta{{ title='HumptyDumpty' publish='20070604-220605' }}
なんだかんだと本体改造箇所の多いプラグインなので、ちょっと邪道かと思いますが、メリットとしては、ページ名と URL を分離できます。 ただしパンくずなどの表示を合わせるのには、もう一工夫必要ですが……。
pukiwiki.ini.php の 232 行目以降をいじります。
///////////////////////////////////////////////// // User definition $auth_users = array( // Username => password 'admin' => '{x-php-md5}21232f297a57a5a743894a0e4a801fc3', 'editor' => '{x-php-md5}5aee9dbd2a188839105073571bee1b1f', ); ///////////////////////////////////////////////// // Authentication method //$auth_method_type = 'pagename'; // By Page name $auth_method_type = 'contents'; // By Page contents ///////////////////////////////////////////////// // Read auth (0:Disable, 1:Enable) $read_auth = 1; $read_auth_pages = array( // Regex Username '#meta{{(.*\n)*read_auth=\'.*?admin.*?\'#' => 'admin', '#meta{{(.*\n)*read_auth=\'.*?editor.*?\'#' => 'editor,admin', ); ///////////////////////////////////////////////// // Edit auth (0:Disable, 1:Enable) $edit_auth = 1; $edit_auth_pages = array( // Regex Username '#meta{{(.*\n)*edit_auth=\'.*?admin.*?\'#' => 'admin', '#meta{{(.*\n)*edit_auth=\'.*?editor.*?\'#' => 'editor,admin', '/.*/' => 'admin,editor', );
この例では、パスワードと ID が同じユーザとして admin と editor を作っています。
$auth_method_type は、contents(ページ内容)にしています。
$read_auth と $edit_auth を有効にして、ページ内の meta プラグインの引数を確認しています。
この例だと、以下のような meta プラグインが書いてあるページで認証を発動します。
#meta{{ read_auth='editor' edit_auth='admin' }}
ゲストは閲覧不能で、 editor というユーザは読むことができます。編集ができるのは admin だけです(というようになっていると思います)。
#editor というユーザ名がちょっと紛らわしいですね。member とかにしたらよかったかしら。
……とここまでは、べつにたいしたことはありません。特にプラグインなど使わなくても、なにか認証のきっかけになる情報をページ内に書いておいて、default.ini.php でそれを非表示にしておけばいいだけです。
pukiwiki.ini.php の $read_auth_pages を以下のようにしてみます。
$read_auth_pages = array( // Regex Username '#meta{{(.*\n)*read_auth=\'.*?admin.*?\'#' => 'admin', '#meta{{(.*\n)*read_auth=\'.*?editor.*?\'#' => 'editor,admin', '#meta{{(.*\n)*release=\'.*?\'#' => 'editor,admin', '#meta{{(.*\n)*expire=\'.*?\'#' => 'editor,admin', );
lib/auth.php の 180 行目あたりを改変します。
// $user_list = array(); // foreach($auth_pages as $key=>$val) // if (preg_match($key, $target_str)) // $user_list = array_merge($user_list, explode(',', $val)); // publish and exipre check $user_list = array(); foreach( $auth_pages as $key => $val ){ if ( preg_match( $key, $target_str ) ){ if( $key == '#meta{{(.*\n)*release=\'.*?\'#' || $key == '#meta{{(.*\n)*expire=\'.*?\'#' ){ //analyze meta plugin preg_match( '/#meta{{(.*\n)*}}/',$target_str,$m ); $lines = explode( "\n",$m[0] ); foreach( $lines as $k => $v ){ if( empty($v) || $v == '#meta{{' || $v == '}}' ) continue ; list( $kk,$vv ) = explode( '=\'',$v ) ; $vv = trim( $vv ) ; $args[$kk] = rtrim( $vv,"'" ) ; } //analyze args foreach( $args as $k => $v ){ if( $k != 'release' && $k != 'expire' ) continue; if( $v != '' ){ // preg_match( '/(\d\d\d\d)(\d\d)(\d\d)-(\d\d)(\d\d)(\d\d)/',$v,$i ) ; $i[1] = substr( $v, 0, 4 ) ; $i[2] = substr( $v, 4, 2 ) ; $i[3] = substr( $v, 6, 2 ) ; $i[4] = substr( $v, 9, 2 ) ; $i[5] = substr( $v, 11, 2 ) ; $i[6] = substr( $v, 13, 2 ) ; $target_date = mktime( $i[4],$i[5],$i[6],$i[2],$i[3],$i[1] ) ; if( $k == 'release' && time() <= $target_date ){ $user_list = array_merge($user_list, explode(',', $val)); } if( $k == 'expire' && time() >= $target_date ){ $user_list = array_merge($user_list, explode(',', $val)); } } } }else{ //normal auth check $user_list = array_merge($user_list, explode(',', $val)); } } } // publish and exipre check - end
プラグインの引数はこんなふうにします。
#meta{{ release='20070520-000000' expire='20070521-000000' }}
すると、2007年5月20日から2007年5月21日の間だけ閲覧認証がかからないページができると思います(この期間以外に閲覧しようとすると、認証がかかると思います)。release と expire は、どちらか一つだけ記載することもできます*2。
GUI っぽい入力欄を作ってみました。つかうためには、 pukiwiki.ini.php に以下のように設定しておきます*3。拡張する場合は、text, textarea, date, auth から type を選ぶ必要があります。view の値は、TRUE にすると、閲覧モードで、この meta 情報を呼び出した際に、情報開示します。
//meta デフォルトの値(ページタイトル、入力者、概要、作成日、公開日、公開予約、公開期限、閲覧権限、編集権限) $meta['title'] = array( 'title' => 'タイトル' , 'type' => 'text' , 'view' => TRUE ) ; $meta['author'] = array( 'title' => '入力者' , 'type' => 'text' , 'view' => TRUE ) ; $meta['summary'] = array( 'title' => '概要' , 'type' => 'textarea' , 'view' => TRUE ) ; $meta['publish'] = array( 'title' => '作成日' , 'type' => 'date' , 'view' => TRUE ) ; $meta['timestamp'] = array( 'title' => '更新日' , 'type' => 'timestamp' , 'view' => TRUE ) ; $meta['release'] = array( 'title' => '公開予約' , 'type' => 'date' , 'view' => FALSE ) ; $meta['expire'] = array( 'title' => '公開期限' , 'type' => 'date' , 'view' => FALSE ) ; $meta['read_auth'] = array( 'title' => '閲覧権限' , 'type' => 'auth' , 'view' => FALSE ) ; $meta['edit_auth'] = array( 'title' => '編集権限' , 'type' => 'auth' , 'view' => FALSE ) ;
lib/html.php の 237行めあたりにこれを差し込み、html 中に $escaped_plugin_meta を突っ込みます。 なお、タイトルだけは入力欄を拡張するようになっています。上記 pukiwiki.ini.php の改変を忘れないでください。
$e_postdata = $s_original ; include_once PLUGIN_DIR . 'meta.inc.php'; list( $s_postdata,$e_postdata,$escaped_plugin_meta ) = plugin_meta_smartedit( $s_postdata,$e_postdata );
plugin/edit.inc.php の 188 行目あたりです。
include_once PLUGIN_DIR . 'meta.inc.php'; plugin_meta_mergedata( $msg );
入れると meta 情報編集へのリンクが各ページに表示されるようになる。
$meta_hidden = TRUE ;// or FALSE
プラグインなどでメタ情報を取得したいときは、一度 include して、 get_metainfo(ページ名) としてやると、諸々のページ情報を取得できると思います。
include_once PLUGIN_DIR . 'meta.inc.php' ; $meta = get_metainfo( $vars['page'] ) ;
また、pukiwiki.skin.php を読むときには、
print_r( $vars );
してやることで、与えられているメタ情報を取得できるので、適宜使うことができると思います。
すべて UTF-8 です。EUC の場合は、文字コードを変更してお使いください。
2007年5月22日火曜日 | 人柱版公開 | ver 0.5 |
2007年6月08日金曜日 | 人柱版(その2)公開。メタ情報編集インタフェイスを試作 | ver 0.7.0 |
2007年7月09日月曜日 | 人柱版(その3)公開。改造箇所多数 | ver 1.0.8 |
2007年7月10日火曜日 | ファイル作成日をただしく機能するように修正。編集者($_SERVER['PHP_AUTH_USER'])を残すように改造 | ver 1.1.0 |
2007年7月21日火曜日 | プラグインがページの pre 要素を壊す問題を修正 | ver 1.1.2 |