Web Collaboration by PukiWiki-chapter6 プラグインを作成する方法
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*[[PukiWikiのプラグインを作成する方法]] [#f4e164c8]
PukiWikiのプラグインの作り方をまとめました。
---------------------------------------------------------...
#contents();
PukiWikiのプラグインの作り方をまとめました。
今回はPukiWikiのプラグインを作成します。また今回作成する...
//
***PukiWikiプラグインの仕様を確認 [#jf35c14f]
このページではより理解を深めるために実際にプラグインを作...
//
***プラグインの保存場所とファイル名 [#zb490183]
プラグインはPukiWikiの「plugin」ディレクトリに保存するこ...
以下のフォーマットでファイル名を付けます。
<プラグイン名>.inc.php
今回は「plugin」ディレクトリに「hoge.inc.php」を作成して...
***プラグインの動作を決める関数 [#t959c307]
プラグインの動作を決めるにはまず、自分が作成したいプラグ...
//
***ブロック型のプラグイン [#u692a904]
ここで言うブロックとはHTMLで言うブロックレベル要素(Block...
見出しや段落、表など1つの固まりとして機能する要素をブロッ...
具体的には以下のタグはブロック要素となります。
、<address>、<blockquote>、<center>、<div>、<dl>、<fields...
<hr>、<noframes>、<noscript>、<ol>、<p>、<pre>、<table>、...
PukiWikiではプラグイン内で以下のフォーマットで関数を定義...
1:function plugin_<プラグイン名>_convert()
2:{
3: <プラグインの動作を定義>
4:}
それでは実際に先ほど作成したhogeプラグインをブロック型に...
hoge.ini.php
1:<?php
2:function plugin_hoge_convert()
3:{
4: return 'hoge';
5:}
6:?>
保存できたらPukiWikiで「テスト」という名前のページを作成...
-PukiWikiテストページ(出力結果)
#hoge()
するとテストページに以下のように表示されるはずです。
表示例
&hoge;
このプラグインはブロック型なので「#hoge()」の記述は行頭に...
反対に「#hoge()あいうえお」と入力した場合は「#hoge()」が...
//
***引数の渡し方 [#yfea789e]
ここで引数の渡し方についても解説します。
hoge.ini.php
1:function plugin_hoge_convert()
2:{
3: $args = func_get_args();
4: return 'hoge、引数は' . $args[0];
5:}
-PukiWikiテストページ
#hoge2(123)
表示例
hoge2、引数は#hong2()
このように()(カッコ)で囲んだ中に引数を指定すると、プラ...
複数の引数を渡す場合は#hoge(123,456)とカンマで区切ります。
//
***インライン型のプラグイン [#f501c3e2]
続いてインライン型のプラグインについて解説します。ブロッ...
インライン要素の具体例は以下の通り
<a>、<abbr>、<acronym>、<b>、<basefont>、<bdo>、<big>、<b...
<em>、<font>、<i>、<img>、<input>、<kbd>、<label>、<q>、<...
<small>、<span>、<strike>、<strong>、<sub>、<sup>、<texta...
インライン型は以下のフォーマットで記述します。
1:function plugin_<プラグイン名>_inline()
2:{
3: <プラグインの動作を定義>
4:}
それでは実際に先ほど作成したhogeプラグインをインライン型...
//
hoge.ini.php
1:function plugin_hoge_convert()
2:{
3: $args = func_get_args();
4: return 'hoge、引数は' . $args[0];
5:}
6:function plugin_hoge_inline()
7:{
8: return 'インライン型hoge';
9:}
-PukiWikiテストページ
&hoge();
表示例
インライン型hoge
今回はインライン要素なのでブロック要素の中に記述すること...
これは「&hoge();」です。
表示例
これは「インライン型hoge」です。
前回と異なり、文章の中に埋め込むことができました。
またインライン型は文字列を渡すことができます。
//
-hoge.ini.php
1:function plugin_hoge_inline()
2:{
3: $args = func_get_args();
4: return 'インライン型hoge、引数は' . $args[0] . '、...
5:}
-PukiWikiテストページ
&hoge(123){こんにちわ};
表示例
インライン型hoge、引数は123、文字列はこんにちわ
これを利用して簡単な文字サイズを変更するインラインプラグ...
hoge.ini.php
1:function plugin_hoge_inline()
2:{
3: $args = func_get_args();
4: $html = '';
5: $html .= '<span style="font-size:' . $args[0] . '%...
6: return $html;
7:}
-PukiWikiテストページ
&hoge(200){こんにちわ};
すると以下の様なフォントサイズが200%に拡大した「こんにち...
pukiwiki_raty01
このように、実用的なプラグインも仕様さえ理解してしまえば...
//
***アクション型のプラグイン [#s3392635]
3つ目はアクション型のプラグインです。
これはGETもしくはPOSTメソッドで渡されたデータを引数として...
PukiWikiの編集画面で引数を編集するのではなく、入力フォー...
GETメソッドとPOSTメソッドについてはHTMLの分野なので詳細は...
アクション型は以下のフォーマットで記述します。
1:function plugin_hoge_action()
2:{
3: <プラグインの動作を定義>
4: return array('msg'=><表示するページ名>, 'body'=><...
5:}
返り値はmsgとbodyで、それぞれページ名とコンテンツを指定し...
すこしややこしいので、実際にやってみます。
//
***GETメソッドの場合 [#hb09228c]
GETメソッドを渡す場合は以下のように「plugin」もしくは「cm...
基本的にプラグイン名のあとに「&(アンド)」で繋いで変数と...
http://example.com?plugin=<プラグイン名>&page=<ページURL>...
http://example.com?cmd=<プラグイン名>&page=<ページURL>&<...
ちなみにpageを省略した場合は$defaultpageが表示されます。...
<ページURL>の部分はURLエンティティ化する必要があるので注...
hoge.ini.phpに追記
01:function plugin_hoge_action()
02:{
03: global $vars;
04:
05: $html = '';
06: $html .= 'cmd:' . $vars['cmd'] . "\n";
07: $html .= '、page:' . $vars['page'] . "\n";
08: $html .= '、hensu:' . $vars['hensu'] . "\n";
09:
10: return array('msg'=>$vars['page'], 'body'=>$html);
11:}
今度はfunc_get_args()ではなく、グローバル変数の$varsで引...
//
-PukiWikiテストページ
(example.comの部分はサイトに合わせて変更してください)
[[hogeプラグインに送信>http://example.com/index.php?cmd=h...
編集が終わったらリンクになっている「hogeプラグインに送信...
ページ名が「テスト」でコンテンツに以下の内容が表示される...
表示例
cmd:hoge 、page:テスト 、hensu:123
これで機能はバラバラながら、1つのプラグインで「ブロック型...
//
***POSTメソッドの場合 [#oc24a568]
続いては応用編としてPOSTの場合もテストします。
hoge.ini.phpを書き換え
01:function plugin_hoge_inline()
02:{
03: global $vars;
04:
05: $args = func_get_args();
06: $html = '';
07: $html .= '<form method="post" action="' . get_scr...
08: $html .= '<p>'. "\n";
09: $html .= '<input type="radio" name="this_page_is"...
10: $html .= '<input type="radio" name="this_page_is"...
11: $html .= '</p>'. "\n";
12: $html .= '<p><input type="submit" value="送信" />...
13: $html .= '</form>'. "\n";
14: return $html;
15:}
16:
17:function plugin_hoge_action()
18:{
19: global $vars;
20:
21: $lines = get_source($vars['page']);
22: array_push($lines, $vars['this_page_is']);
23: $newlines = implode('', $lines);
24:
25: page_write($vars['page'], $newlines);
26:
27:}
インライン型でフォームを書き出し、フォームから渡されるPOS...
7行目、get_script_uri()はPukiWikiの関数で、現在のURLを取...
続けてpageに$vars[‘page’]を渡しているのでURLは「http://ex...
続いてアクション型の部分では、受け取った変数をコンテンツ...
21行目、get_source()もPukiWikiの関数で、引数にページ名を...
22行目、PHPの関数array_push()で配列の最後に$vars[‘this_pa...
23行目、PHPの関数implode()で配列をテキスト形式に成形。
最後、25行目でPukiWikiの関数page_write()を利用してページ...
ではテストページでインライン型でプラグインを読み込んでテ...
-PukiWikiテストページ
&hoge();
すると以下のようにラジオボタンと送信ボタンが表示されるは...
pukiwiki_raty02
試しに「良い」か「悪い」どちらかを選択して「送信」ボタン...
するとクリックする度にgood、badというコンテンツが追加され...
pukiwiki_raty03
以上、PukiWikiのプラグインの仕様について、例を交えながら...
//
***プラグインの初期化関数 [#v0e2e44f]
特殊な関数として初期化のための関数が用意されています。
これはプラグインの読み込み時に1度しか実行されないという特...
1:function plugin_<プラグイン名>_init()
2:{
3: <初期化に関する記述>
4:}
***よくある使い方 [#r33c4a7a]
01:function plugin_<プラグイン名>_init()
02:{
03://定数の定義
04:define ('HOGE_WIDTH', '100');
05:define ('HOGE_HEIGHT', '200');
06:
07://エラーメッセージの定義
08:$messages = array(
09: 'hoge_messages' => array(
10: 'title_error' => 'Title Error',
11: 'no_page_error' => '$1 のページは存在しませ...
12: )
13:);
14:}
理解の早い方は気がついたかもしれませんが、特にinitで関数...
//
***5段階評価を実現するjQuery Ratyと組み合わせたPukiWikiの...
前回解説したjQuery Ratyと今回解説したPukiWikiのプラグイン...
もう十分すぎるほど解説したと思うので、機能だけ紹介しますw
+クリックするだけで5段階評価ができる
+平均値と総投票数を表示
+ページ内に複数設置可能
+Cookieが無効な場合は投稿禁止
+Cookieを利用した連投の禁止(デフォルトで3日間)
//
-raty.ini.php
plain{{
// ブロック型の対応
//-------------------------------------------------------...
function plugin_raty_convert()
{
global $vars, $defaultpage;
// プラグインから引数を取得し平均値を出す
$args = func_get_args();
$args = h($args);
$vowels = array("[", "]");
$num = str_replace($vowels, "", $args); // drop []
// numのバリデーション
foreach($num as $i){
if ( !is_numeric($i) && $i = "" ){
$msg = "ratyプラグインの引数が正しくありま...
return $msg;
}
}
// 投稿時にCookieが有効かチェックするためのCookie
$cookie_name = 'raty_cookie_check';
if ( !isset($_COOKIE[$cookie_name]) ) {
$matches = array();
preg_match('!(.*/)!', $_SERVER['REQUEST_URI'], ...
setcookie($cookie_name, 1, time()+(60*60), $mat...
}
$count = count($num);
$ave_num = array_sum($num) / $count;
$ave_num = round($ave_num, 1);
$page = isset($vars['page']) ? $vars['page'] : $defa...
$html = html_convert($ave_num, $count);
return $html;
}
// jQuery Ratyの記述
//-------------------------------------------------------...
function html_convert($ave_num, $count)
{
global $vars, $digest;
static $raty_id = 0;
// プラグインをクリックされた時に作成されるURLを作成...
$page = isset($vars['page']) ? $vars['page'] : $defa...
$url =
get_script_uri() . '?plugin=raty' .
'&refer=' . rawurlencode($page) .
'&digest=' . rawurlencode($digest) .
'&raty_id=' . $raty_id .
'&score=';
$form = '';
// jQueryがない場合
//if ($raty_id == 0) {
// $form .= '<script type="text/javascript" src="h...
//}
$form .= '<script type="text/javascript" src="./skin...
$form .= '<div class= "raty star' . $raty_id . '" st...
$form .= '<script type="text/javascript">' . "\n";
$form .= '$(function raty' . $raty_id . '() {' . "\n";
$form .= '$.fn.raty.defaults.path = "./image";' . "\...
$form .= '$(".star' . $raty_id . '").raty({' . "\n";
$form .= 'number: 5,' . "\n";
$form .= 'score : ' . $ave_num . ',' . "\n";
$form .= "hints: ['1', '2', '3', '4', '5']," . "\n";
$form .= 'click: function(score, evt) {' . "\n";
$form .= 'var url = "' . $url . '" + score;' . "\n";...
$form .= 'location.href=url;' . "\n"; // GETでURL更新
$form .= '}' . "\n";
$form .= '});' . "\n";
$form .= '});' . "\n";
$form .= '</script>' . "\n";
$raty_id++; // 複数回プラグインが読み込まれたら加算...
return $form;
}
// アクション型の対応
//-------------------------------------------------------...
function plugin_raty_action()
{
global $vars;
// 衝突時のメッセージなど
global $_title_collided;
// pukiwikiが閲覧モードの場合は編集不可
if (PKWK_READONLY) die_message('PKWK_READONLY prohib...
// ページに複数ratyが設置されている場合を想定して$ra...
// 新しく追加するスコアを$scoreに代入する
$raty_id = $vars['raty_id'];
$page = isset($vars['refer']) ? $vars['refer'] : $de...
// Cookieが有効かどうかを調べる(有効であればplugin_...
$cookie_name = 'raty_cookie_check';
if ( !isset($_COOKIE[$cookie_name]) ) {
return array(
'msg' => _('投稿エラー'),
'body' => _('評価をするにはCookieを有効にしてく...
);
}
// 書き込む際に付けられるCookieを既に持っている場合...
if (is_continuous_raty($page, $raty_id)) {
return array(
'msg' => _('投稿エラー'),
'body' => _('評価の連投は禁止しています。'),
);
}
$lines = get_source($page);
// raty_idのバリデーション
if ( is_numeric($vars['raty_id']) ){
$score = $vars['raty_id'];
} else {
$msg = "raty_idの値が正しくありません";
return array('msg'=>$msg, 'body'=>"");
}
// scoreのバリデーション
if ( is_numeric($vars['score']) ){
$score = $vars['score'];
} else {
$msg = "scoreの値が正しくありません";
return array('msg'=>$msg, 'body'=>"");
}
// digestのバリデーション(衝突チェック)
$contents = implode('', $lines);
if (md5($contents) !== $vars['digest']) {
$msg = $_title_collided;
$body = show_preview_form($_msg_collided, $cont...
return array('msg'=>$msg, 'body'=>$body);
}
$i = 0; // 行カウント用
$raty_count = 0; // $raty_idカウント用
foreach($lines as $line)
{
$i++;
// プラグインの行を調べ、複数ある場合に備えて$v...
if (preg_match('/^#raty\(.*\)$/i', $line, $matc...
preg_match('/\[(.*)\]/', $line, $scoredata);
if ( $scoredata[1] == "" ){
$line = '#raty([' . $score . '])' . "...
} else {
$line = '#raty([' . $scoredata[1] . '...
}
$i--;
array_splice($lines, $i, 1, $line);
$newlines = implode('', $lines);
}
}
page_write($page, $newlines, TRUE); // TRUEでタイム...
}
// 衝突時に表示されるエラー画面
//-------------------------------------------------------...
function show_preview_form($msg = '', $body = '')
{
global $vars, $rows, $cols;
$s_refer = h($vars['refer']);
$s_digest = h($vars['digest']);
$s_body = h($body);
$form = '';
$form .= $msg . "\n";
$form .= '<form action="' . get_script_uri() . '?cmd...
$form .= '<div>' . "\n";
$form .= ' <input type="hidden" name="refer" value=...
$form .= ' <input type="hidden" name="digest" value=...
$form .= ' <textarea name="msg" rows="' . $rows . '"...
$form .= '</div>' . "\n";
$form .= '</form>' . "\n";
return $form;
}
// html特殊文字をエスケープ(XSS対策)
//-------------------------------------------------------...
function h($str){
if(is_array($str)){
return array_map("h",$str);
}else{
return htmlspecialchars($str,ENT_QUOTES,"UTF-8");
}
}
// Cookieのを利用して3日間は同じ項目の評価を禁止(連投規...
//-------------------------------------------------------...
function is_continuous_raty($page, $raty_id)
{
$cmd = 'raty';
$ratykey = $cmd . '_' . $page . '_' . $raty_id;
// 有効なCookieを持っている場合(前回の投稿から3日以...
if (isset($_COOKIE[$ratykey])) {
return true;
}
// 有効なCookieを持っていない場合
$matches = array();
preg_match('!(.*/)!', $_SERVER['REQUEST_URI'], $matc...
setcookie($ratykey, 1, time()+(60*60*24*3), $matches...
return false;
}
}};
コメントでざっくり解説しているので、このページを読んでく...
このプラグインはpukiwiki.skin.phpでjQueryを読み込んでいる...
もしサイトでjQueryを利用しておらず、このプラグインでだけj...
さらにプラグインで利用する画像をPukiWikiの「image」ディレ...
デフォルトのままでも良かったのですが、そこはデザイナーの...
サンプルはこちら:[[リンク作成中]]
個人用として作ったので問題ありませんが、スコアをオプショ...
私自身きちんとしたプラグインを作ったのは初めてなので、な...
//
終了行:
*[[PukiWikiのプラグインを作成する方法]] [#f4e164c8]
PukiWikiのプラグインの作り方をまとめました。
---------------------------------------------------------...
#contents();
PukiWikiのプラグインの作り方をまとめました。
今回はPukiWikiのプラグインを作成します。また今回作成する...
//
***PukiWikiプラグインの仕様を確認 [#jf35c14f]
このページではより理解を深めるために実際にプラグインを作...
//
***プラグインの保存場所とファイル名 [#zb490183]
プラグインはPukiWikiの「plugin」ディレクトリに保存するこ...
以下のフォーマットでファイル名を付けます。
<プラグイン名>.inc.php
今回は「plugin」ディレクトリに「hoge.inc.php」を作成して...
***プラグインの動作を決める関数 [#t959c307]
プラグインの動作を決めるにはまず、自分が作成したいプラグ...
//
***ブロック型のプラグイン [#u692a904]
ここで言うブロックとはHTMLで言うブロックレベル要素(Block...
見出しや段落、表など1つの固まりとして機能する要素をブロッ...
具体的には以下のタグはブロック要素となります。
、<address>、<blockquote>、<center>、<div>、<dl>、<fields...
<hr>、<noframes>、<noscript>、<ol>、<p>、<pre>、<table>、...
PukiWikiではプラグイン内で以下のフォーマットで関数を定義...
1:function plugin_<プラグイン名>_convert()
2:{
3: <プラグインの動作を定義>
4:}
それでは実際に先ほど作成したhogeプラグインをブロック型に...
hoge.ini.php
1:<?php
2:function plugin_hoge_convert()
3:{
4: return 'hoge';
5:}
6:?>
保存できたらPukiWikiで「テスト」という名前のページを作成...
-PukiWikiテストページ(出力結果)
#hoge()
するとテストページに以下のように表示されるはずです。
表示例
&hoge;
このプラグインはブロック型なので「#hoge()」の記述は行頭に...
反対に「#hoge()あいうえお」と入力した場合は「#hoge()」が...
//
***引数の渡し方 [#yfea789e]
ここで引数の渡し方についても解説します。
hoge.ini.php
1:function plugin_hoge_convert()
2:{
3: $args = func_get_args();
4: return 'hoge、引数は' . $args[0];
5:}
-PukiWikiテストページ
#hoge2(123)
表示例
hoge2、引数は#hong2()
このように()(カッコ)で囲んだ中に引数を指定すると、プラ...
複数の引数を渡す場合は#hoge(123,456)とカンマで区切ります。
//
***インライン型のプラグイン [#f501c3e2]
続いてインライン型のプラグインについて解説します。ブロッ...
インライン要素の具体例は以下の通り
<a>、<abbr>、<acronym>、<b>、<basefont>、<bdo>、<big>、<b...
<em>、<font>、<i>、<img>、<input>、<kbd>、<label>、<q>、<...
<small>、<span>、<strike>、<strong>、<sub>、<sup>、<texta...
インライン型は以下のフォーマットで記述します。
1:function plugin_<プラグイン名>_inline()
2:{
3: <プラグインの動作を定義>
4:}
それでは実際に先ほど作成したhogeプラグインをインライン型...
//
hoge.ini.php
1:function plugin_hoge_convert()
2:{
3: $args = func_get_args();
4: return 'hoge、引数は' . $args[0];
5:}
6:function plugin_hoge_inline()
7:{
8: return 'インライン型hoge';
9:}
-PukiWikiテストページ
&hoge();
表示例
インライン型hoge
今回はインライン要素なのでブロック要素の中に記述すること...
これは「&hoge();」です。
表示例
これは「インライン型hoge」です。
前回と異なり、文章の中に埋め込むことができました。
またインライン型は文字列を渡すことができます。
//
-hoge.ini.php
1:function plugin_hoge_inline()
2:{
3: $args = func_get_args();
4: return 'インライン型hoge、引数は' . $args[0] . '、...
5:}
-PukiWikiテストページ
&hoge(123){こんにちわ};
表示例
インライン型hoge、引数は123、文字列はこんにちわ
これを利用して簡単な文字サイズを変更するインラインプラグ...
hoge.ini.php
1:function plugin_hoge_inline()
2:{
3: $args = func_get_args();
4: $html = '';
5: $html .= '<span style="font-size:' . $args[0] . '%...
6: return $html;
7:}
-PukiWikiテストページ
&hoge(200){こんにちわ};
すると以下の様なフォントサイズが200%に拡大した「こんにち...
pukiwiki_raty01
このように、実用的なプラグインも仕様さえ理解してしまえば...
//
***アクション型のプラグイン [#s3392635]
3つ目はアクション型のプラグインです。
これはGETもしくはPOSTメソッドで渡されたデータを引数として...
PukiWikiの編集画面で引数を編集するのではなく、入力フォー...
GETメソッドとPOSTメソッドについてはHTMLの分野なので詳細は...
アクション型は以下のフォーマットで記述します。
1:function plugin_hoge_action()
2:{
3: <プラグインの動作を定義>
4: return array('msg'=><表示するページ名>, 'body'=><...
5:}
返り値はmsgとbodyで、それぞれページ名とコンテンツを指定し...
すこしややこしいので、実際にやってみます。
//
***GETメソッドの場合 [#hb09228c]
GETメソッドを渡す場合は以下のように「plugin」もしくは「cm...
基本的にプラグイン名のあとに「&(アンド)」で繋いで変数と...
http://example.com?plugin=<プラグイン名>&page=<ページURL>...
http://example.com?cmd=<プラグイン名>&page=<ページURL>&<...
ちなみにpageを省略した場合は$defaultpageが表示されます。...
<ページURL>の部分はURLエンティティ化する必要があるので注...
hoge.ini.phpに追記
01:function plugin_hoge_action()
02:{
03: global $vars;
04:
05: $html = '';
06: $html .= 'cmd:' . $vars['cmd'] . "\n";
07: $html .= '、page:' . $vars['page'] . "\n";
08: $html .= '、hensu:' . $vars['hensu'] . "\n";
09:
10: return array('msg'=>$vars['page'], 'body'=>$html);
11:}
今度はfunc_get_args()ではなく、グローバル変数の$varsで引...
//
-PukiWikiテストページ
(example.comの部分はサイトに合わせて変更してください)
[[hogeプラグインに送信>http://example.com/index.php?cmd=h...
編集が終わったらリンクになっている「hogeプラグインに送信...
ページ名が「テスト」でコンテンツに以下の内容が表示される...
表示例
cmd:hoge 、page:テスト 、hensu:123
これで機能はバラバラながら、1つのプラグインで「ブロック型...
//
***POSTメソッドの場合 [#oc24a568]
続いては応用編としてPOSTの場合もテストします。
hoge.ini.phpを書き換え
01:function plugin_hoge_inline()
02:{
03: global $vars;
04:
05: $args = func_get_args();
06: $html = '';
07: $html .= '<form method="post" action="' . get_scr...
08: $html .= '<p>'. "\n";
09: $html .= '<input type="radio" name="this_page_is"...
10: $html .= '<input type="radio" name="this_page_is"...
11: $html .= '</p>'. "\n";
12: $html .= '<p><input type="submit" value="送信" />...
13: $html .= '</form>'. "\n";
14: return $html;
15:}
16:
17:function plugin_hoge_action()
18:{
19: global $vars;
20:
21: $lines = get_source($vars['page']);
22: array_push($lines, $vars['this_page_is']);
23: $newlines = implode('', $lines);
24:
25: page_write($vars['page'], $newlines);
26:
27:}
インライン型でフォームを書き出し、フォームから渡されるPOS...
7行目、get_script_uri()はPukiWikiの関数で、現在のURLを取...
続けてpageに$vars[‘page’]を渡しているのでURLは「http://ex...
続いてアクション型の部分では、受け取った変数をコンテンツ...
21行目、get_source()もPukiWikiの関数で、引数にページ名を...
22行目、PHPの関数array_push()で配列の最後に$vars[‘this_pa...
23行目、PHPの関数implode()で配列をテキスト形式に成形。
最後、25行目でPukiWikiの関数page_write()を利用してページ...
ではテストページでインライン型でプラグインを読み込んでテ...
-PukiWikiテストページ
&hoge();
すると以下のようにラジオボタンと送信ボタンが表示されるは...
pukiwiki_raty02
試しに「良い」か「悪い」どちらかを選択して「送信」ボタン...
するとクリックする度にgood、badというコンテンツが追加され...
pukiwiki_raty03
以上、PukiWikiのプラグインの仕様について、例を交えながら...
//
***プラグインの初期化関数 [#v0e2e44f]
特殊な関数として初期化のための関数が用意されています。
これはプラグインの読み込み時に1度しか実行されないという特...
1:function plugin_<プラグイン名>_init()
2:{
3: <初期化に関する記述>
4:}
***よくある使い方 [#r33c4a7a]
01:function plugin_<プラグイン名>_init()
02:{
03://定数の定義
04:define ('HOGE_WIDTH', '100');
05:define ('HOGE_HEIGHT', '200');
06:
07://エラーメッセージの定義
08:$messages = array(
09: 'hoge_messages' => array(
10: 'title_error' => 'Title Error',
11: 'no_page_error' => '$1 のページは存在しませ...
12: )
13:);
14:}
理解の早い方は気がついたかもしれませんが、特にinitで関数...
//
***5段階評価を実現するjQuery Ratyと組み合わせたPukiWikiの...
前回解説したjQuery Ratyと今回解説したPukiWikiのプラグイン...
もう十分すぎるほど解説したと思うので、機能だけ紹介しますw
+クリックするだけで5段階評価ができる
+平均値と総投票数を表示
+ページ内に複数設置可能
+Cookieが無効な場合は投稿禁止
+Cookieを利用した連投の禁止(デフォルトで3日間)
//
-raty.ini.php
plain{{
// ブロック型の対応
//-------------------------------------------------------...
function plugin_raty_convert()
{
global $vars, $defaultpage;
// プラグインから引数を取得し平均値を出す
$args = func_get_args();
$args = h($args);
$vowels = array("[", "]");
$num = str_replace($vowels, "", $args); // drop []
// numのバリデーション
foreach($num as $i){
if ( !is_numeric($i) && $i = "" ){
$msg = "ratyプラグインの引数が正しくありま...
return $msg;
}
}
// 投稿時にCookieが有効かチェックするためのCookie
$cookie_name = 'raty_cookie_check';
if ( !isset($_COOKIE[$cookie_name]) ) {
$matches = array();
preg_match('!(.*/)!', $_SERVER['REQUEST_URI'], ...
setcookie($cookie_name, 1, time()+(60*60), $mat...
}
$count = count($num);
$ave_num = array_sum($num) / $count;
$ave_num = round($ave_num, 1);
$page = isset($vars['page']) ? $vars['page'] : $defa...
$html = html_convert($ave_num, $count);
return $html;
}
// jQuery Ratyの記述
//-------------------------------------------------------...
function html_convert($ave_num, $count)
{
global $vars, $digest;
static $raty_id = 0;
// プラグインをクリックされた時に作成されるURLを作成...
$page = isset($vars['page']) ? $vars['page'] : $defa...
$url =
get_script_uri() . '?plugin=raty' .
'&refer=' . rawurlencode($page) .
'&digest=' . rawurlencode($digest) .
'&raty_id=' . $raty_id .
'&score=';
$form = '';
// jQueryがない場合
//if ($raty_id == 0) {
// $form .= '<script type="text/javascript" src="h...
//}
$form .= '<script type="text/javascript" src="./skin...
$form .= '<div class= "raty star' . $raty_id . '" st...
$form .= '<script type="text/javascript">' . "\n";
$form .= '$(function raty' . $raty_id . '() {' . "\n";
$form .= '$.fn.raty.defaults.path = "./image";' . "\...
$form .= '$(".star' . $raty_id . '").raty({' . "\n";
$form .= 'number: 5,' . "\n";
$form .= 'score : ' . $ave_num . ',' . "\n";
$form .= "hints: ['1', '2', '3', '4', '5']," . "\n";
$form .= 'click: function(score, evt) {' . "\n";
$form .= 'var url = "' . $url . '" + score;' . "\n";...
$form .= 'location.href=url;' . "\n"; // GETでURL更新
$form .= '}' . "\n";
$form .= '});' . "\n";
$form .= '});' . "\n";
$form .= '</script>' . "\n";
$raty_id++; // 複数回プラグインが読み込まれたら加算...
return $form;
}
// アクション型の対応
//-------------------------------------------------------...
function plugin_raty_action()
{
global $vars;
// 衝突時のメッセージなど
global $_title_collided;
// pukiwikiが閲覧モードの場合は編集不可
if (PKWK_READONLY) die_message('PKWK_READONLY prohib...
// ページに複数ratyが設置されている場合を想定して$ra...
// 新しく追加するスコアを$scoreに代入する
$raty_id = $vars['raty_id'];
$page = isset($vars['refer']) ? $vars['refer'] : $de...
// Cookieが有効かどうかを調べる(有効であればplugin_...
$cookie_name = 'raty_cookie_check';
if ( !isset($_COOKIE[$cookie_name]) ) {
return array(
'msg' => _('投稿エラー'),
'body' => _('評価をするにはCookieを有効にしてく...
);
}
// 書き込む際に付けられるCookieを既に持っている場合...
if (is_continuous_raty($page, $raty_id)) {
return array(
'msg' => _('投稿エラー'),
'body' => _('評価の連投は禁止しています。'),
);
}
$lines = get_source($page);
// raty_idのバリデーション
if ( is_numeric($vars['raty_id']) ){
$score = $vars['raty_id'];
} else {
$msg = "raty_idの値が正しくありません";
return array('msg'=>$msg, 'body'=>"");
}
// scoreのバリデーション
if ( is_numeric($vars['score']) ){
$score = $vars['score'];
} else {
$msg = "scoreの値が正しくありません";
return array('msg'=>$msg, 'body'=>"");
}
// digestのバリデーション(衝突チェック)
$contents = implode('', $lines);
if (md5($contents) !== $vars['digest']) {
$msg = $_title_collided;
$body = show_preview_form($_msg_collided, $cont...
return array('msg'=>$msg, 'body'=>$body);
}
$i = 0; // 行カウント用
$raty_count = 0; // $raty_idカウント用
foreach($lines as $line)
{
$i++;
// プラグインの行を調べ、複数ある場合に備えて$v...
if (preg_match('/^#raty\(.*\)$/i', $line, $matc...
preg_match('/\[(.*)\]/', $line, $scoredata);
if ( $scoredata[1] == "" ){
$line = '#raty([' . $score . '])' . "...
} else {
$line = '#raty([' . $scoredata[1] . '...
}
$i--;
array_splice($lines, $i, 1, $line);
$newlines = implode('', $lines);
}
}
page_write($page, $newlines, TRUE); // TRUEでタイム...
}
// 衝突時に表示されるエラー画面
//-------------------------------------------------------...
function show_preview_form($msg = '', $body = '')
{
global $vars, $rows, $cols;
$s_refer = h($vars['refer']);
$s_digest = h($vars['digest']);
$s_body = h($body);
$form = '';
$form .= $msg . "\n";
$form .= '<form action="' . get_script_uri() . '?cmd...
$form .= '<div>' . "\n";
$form .= ' <input type="hidden" name="refer" value=...
$form .= ' <input type="hidden" name="digest" value=...
$form .= ' <textarea name="msg" rows="' . $rows . '"...
$form .= '</div>' . "\n";
$form .= '</form>' . "\n";
return $form;
}
// html特殊文字をエスケープ(XSS対策)
//-------------------------------------------------------...
function h($str){
if(is_array($str)){
return array_map("h",$str);
}else{
return htmlspecialchars($str,ENT_QUOTES,"UTF-8");
}
}
// Cookieのを利用して3日間は同じ項目の評価を禁止(連投規...
//-------------------------------------------------------...
function is_continuous_raty($page, $raty_id)
{
$cmd = 'raty';
$ratykey = $cmd . '_' . $page . '_' . $raty_id;
// 有効なCookieを持っている場合(前回の投稿から3日以...
if (isset($_COOKIE[$ratykey])) {
return true;
}
// 有効なCookieを持っていない場合
$matches = array();
preg_match('!(.*/)!', $_SERVER['REQUEST_URI'], $matc...
setcookie($ratykey, 1, time()+(60*60*24*3), $matches...
return false;
}
}};
コメントでざっくり解説しているので、このページを読んでく...
このプラグインはpukiwiki.skin.phpでjQueryを読み込んでいる...
もしサイトでjQueryを利用しておらず、このプラグインでだけj...
さらにプラグインで利用する画像をPukiWikiの「image」ディレ...
デフォルトのままでも良かったのですが、そこはデザイナーの...
サンプルはこちら:[[リンク作成中]]
個人用として作ったので問題ありませんが、スコアをオプショ...
私自身きちんとしたプラグインを作ったのは初めてなので、な...
//
ページ名: