** 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