** meta.inc.php [#l2415914] |RIGHT:100|LEFT:360|c |~サマリ|ページのメタデータを書くためのプラグインです。| |~リビジョン|1.1.2| |~対応バージョン|1.4.7| |~投稿者|[[jidaikobo]]| |~投稿日|&new{2007-05-22 (火) 10:50:19};| #contents *概要 [#f7c788d2] メタデータを書くためのプラグインです。本文には出力したくないけど、メモをとっておきたいときに使います。~ またさまざまな表示権限分け(ページの表示期限など)をスムーズに行う装置としても考えてみています(あくまで実験的ですが)。~ 引数は、出力はされませんが、$vars に突っ込まれます。このときはいわゆる HTML出力サニタイズはしていないので、スキンなどで使うときは注意が必要だと思います。 書式は以下の例の通りです((0.7.0で複数行プラグインにかえました。0.5.0 の説明は 0.5.0 に同梱しています))。編集画面改造を行わない場合の引数は自由ですが、$vars につっこむので、カンマ区切りで、ラベル = シングルクォート囲みの値にした方がいいと思います。 #meta{{ title='HumptyDumpty' publish='20070604-220605' }} なんだかんだと本体改造箇所の多いプラグインなので、ちょっと邪道かと思いますが、メリットとしては、ページ名と URL を分離できます。 ただしパンくずなどの表示を合わせるのには、もう一工夫必要ですが……。 *使い方の例:表示権限分け [#b0402cc5] 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 でそれを非表示にしておけばいいだけです。 *使い方の例:表示権限分け - 期限切れのページと公開前のページ [#c0468214] 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 は、どちらか一つだけ記載することもできます(( 0.7.0 で publish を release にかえました))。 *メタ情報編集インタフェイス [#x143c97d] GUI っぽい入力欄を作ってみました。つかうためには、 pukiwiki.ini.php に以下のように設定しておきます((たぶんここを拡張すれば、入力欄も拡張すると思うのですが、しっかり検証していません :-P ))。拡張する場合は、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 ) ; **通常の編集画面にmeta情報を表示しないようフック [#u852f02b] 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 ); **通常の編集画面にmeta情報を表示しないようフック2(埋め込み直し) [#p0905d8b] plugin/edit.inc.php の 188 行目あたりです。 include_once PLUGIN_DIR . 'meta.inc.php'; plugin_meta_mergedata( $msg ); **pukiwiki.in.php に入れるものだが、これは特に入れなくてもよい。 [#cb2f75b2] 入れると meta 情報編集へのリンクが各ページに表示されるようになる。 $meta_hidden = TRUE ;// or FALSE *関数など [#h39b9b20] プラグインなどでメタ情報を取得したいときは、一度 include して、 get_metainfo(ページ名) としてやると、諸々のページ情報を取得できると思います。 include_once PLUGIN_DIR . 'meta.inc.php' ; $meta = get_metainfo( $vars['page'] ) ; また、pukiwiki.skin.php を読むときには、 print_r( $vars ); してやることで、与えられているメタ情報を取得できるので、適宜使うことができると思います。 *ダウンロード [#f7a474bf] すべて UTF-8 です。EUC の場合は、文字コードを変更してお使いください。 -%%meta 0.5.0(http://www.jidaikobo.com/pukiwiki/meta050.zip )%% -%%meta 0.7.0(http://www.jidaikobo.com/pukiwiki/meta070.zip )%% -%%meta 1.0.8(http://www.jidaikobo.com/pukiwiki/meta108.zip )%% -%%meta 1.1.0(http://www.jidaikobo.com/pukiwiki/meta110.zip )%% -%%meta 1.1.2(http://www.jidaikobo.com/pukiwiki/meta112.zip )%% -meta 1.1.2(http://www.jidaikobo.com/pukiwiki/meta112.zip ) *ライセンス [#xead3ffa] -PukiWiki と同じライセンスで。 *履歴 [#wa65bebb] |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| *コメント [#mfea5375] //#comment