1 <?xml version="1.0" encoding="UTF-8"?>
\r
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
\r
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP">
\r
6 Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
\r
7 Copyright (C) 2002-2012 The Nucleus Group
\r
9 This program is free software; you can redistribute it and/or
\r
10 modify it under the terms of the GNU General Public License
\r
11 as published by the Free Software Foundation; either version 2
\r
12 of the License, or (at your option) any later version.
\r
13 (see nucleus/documentation/index.html#license for more info)
\r
15 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
\r
16 <meta http-equiv="Content-Style-Type" content="text/css" />
\r
17 <meta http-equiv="Content-Script-Type" content="text/javascript" />
\r
18 <link rel="index" href="./index.html" />
\r
19 <title>Nucleus - プラグイン API</title>
\r
20 <link rel="stylesheet" type="text/css" href="styles/manual.css" />
\r
21 <style type="text/css">
\r
22 /* refence parameters (greenish) */
\r
24 background-color: #c9f2d4;
\r
30 /* object parameters */
\r
38 content: " (object)";
\r
41 /* read-only parameters (non-ref; reddish) */
\r
43 background-color: #ffddce;
\r
49 list-style-image:none;
\r
50 list-style-type:none;
\r
55 <script src="http://www.google.com/jsapi"></script>
\r
56 <script type="text/javascript">
\r
57 google.load("jquery", "1");
\r
58 google.setOnLoadCallback(function() {
\r
59 $.getScript("javascript/fontsizeChanger.js");
\r
64 <div id="fontSizeChanger">
\r
65 <a href="#top" id="f_small">小</a>
\r
66 <a href="#top" id="f_medium">中</a>
\r
67 <a href="#top" id="f_large">大</a>
\r
71 <div class="heading">
\r
72 <a id="top" name="top">プラグイン API</a>
\r
76 <div class="note-trans"><strong>訳者注:</strong>
\r
78 <li>このドキュメントの原文は以下のURLにあります。<br />
\r
79 <a href="http://nucleuscms.org/documentation/devdocs/plugins.html">http://nucleuscms.org/documentation/devdocs/plugins.html</a></li>
\r
80 <li>誤訳にお気づきの方は<a href="http://japan.nucleuscms.org/bb/viewforum.php?f=7">NucleusCMS日本語フォーラム</a>までご連絡いただけると助かります。</li>
\r
84 <div class="note"><strong>注:</strong>
\r
86 <li>このドキュメントは基本的なプラグインの書き方についての情報を提供しています。さらに質問がある方は <a href="http://forum.nucleuscms.org/viewforum.php?f=10">Plugin
\r
87 Development Forum</a> (<a href="http://japan.nucleuscms.org/bb/viewforum.php?f=5">日本語フォーラム</a>)をご覧ください。</li>
\r
88 <li>Nucleusバージョン1.5以降に導入されたメソッドとイベントには、導入時のバージョン情報を付記しています。それらの機能を利用するときは、<code>getMinNucleusVersion</code> を適切に設定するのを忘れないでください。</li>
\r
95 <a href="./index.html">開発者向けドキュメントの目次へ戻る</a>
\r
99 このドキュメントはNucleusプラグインの作り方についての解説です。
\r
102 <h1><a id="toc" name="toc">目次</a></h1>
\r
105 <li><a href="#introduction">イントロダクション</a></li>
\r
106 <li><a href="#firstplug">はじめてプラグインを書いてみる</a></li>
\r
107 <li><a href="#nucleusplugin"><code>NucleusPlugin</code> クラスの概要</a></li>
\r
108 <li><a href="#skinvars"><code><%plugin(...)%></code> スキン変数</a></li>
\r
109 <li><a href="#templatevars"><code><%plugin(...)%></code> テンプレート変数</a></li>
\r
110 <li><a href="#actions"><code>action.php</code> を使ったアクション</a></li>
\r
111 <li><a href="#events">イベントとイベント登録の仕方</a></li>
\r
112 <li><a href="#options">オプションを保存する</a></li>
\r
113 <li><a href="#tables">データベース・テーブル</a></li>
\r
114 <li><a href="#admin">プラグイン管理エリアの提供</a></li>
\r
115 <li><a href="#help">ヘルプページの提供</a></li>
\r
116 <li><a href="#dependency">プラグイン依存チェック</a></li>
\r
117 <li><a href="#internationalization">プラグインの国際化</a></li>
\r
118 <li><a href="#skinvar-formatting">スキン変数の出力の書式</a></li>
\r
119 <li><a href="#additional-reading">追記事項</a></li>
\r
120 <!-- <li><a href="#parser">Using the <code>PARSER</code> class</a></li>
\r
121 <li><a href="#"></a></li>
\r
122 <li><a href="#"></a></li>
\r
123 <li><a href="#"></a></li>-->
\r
126 <h1>イントロダクション <a id="introduction" name="introduction" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
129 Nucleusプラグインによって、誰もがNucleusの提供する機能を、Nucleus内部のPHPコードを変更することなく拡張することができます。プラグインはあるメソッドを実装したシンプルなPHPスクリプトで、Nucleusユーザー同士で簡単に交換することができます。インストールは簡単で、プラグインディレクトリにファイルをアップし、Nucleusにそれを認識させるだけです。
\r
137 <li>実装について詳しくしらなくてもNucleusフレームワークに簡単に機能を追加できる</li>
\r
138 <li>必要なプラグインだけをインストールでき、ページ生成にかかる時間を節約できる</li>
\r
142 すべてのプラグインファイルは <code>config.php</code> に記述されたディレクトリに置く必要があります。一般的に、それは <code>/your/path/nucleus/plugins/</code> になるでしょう。プラグインファイル名は <code>NP<em>_name</em>.php</code> という形式を用いることにより認識されます。プラグインによっては、追加ファイルを格納する同名のサブディレクトリや、管理エリアを必要とします。
\r
146 <strong>注:</strong> プラグイン名は大文字・小文字を識別しますので、<code>Np_</code> や <code>np_</code> ではなく、<code>NP_</code> で始まることに気をつけてください。またプラグインがサブディレクトリを使用する場合は、サブディレクトリの名称は<em>すべて小文字にします</em>。
\r
152 <h1>はじめてプラグインを書いてみる<a id="firstplug" name="firstplug" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
155 では、シンプルなプラグインを書いてみましょう。基本的にプラグインは、あらかじめ定義された <code>NucleusPlugin</code> クラスを継承したPHPクラスです。以下は<code>HelloWorld</code>プラグインの例です。
\r
158 <pre class="example"><code><?php
\r
160 class NP_HelloWorld extends NucleusPlugin
\r
165 return 'Hello World';
\r
169 function getAuthor()
\r
171 return 'Wouter Demuynck';
\r
175 // mailto:foo@bar.com の形式も可
\r
178 return 'http://nucleuscms.org/';
\r
182 function getVersion()
\r
187 // インストール済みのプラグインリストに表示される説明文
\r
188 function getDescription()
\r
190 return 'Just a sample plugin.';
\r
193 function doSkinVar($skinType)
\r
195 echo 'Hello World!';
\r
198 function supportsFeature ($what)
\r
202 case 'SqlTablePrefix':
\r
216 このコードをコピーし、 <code>NP_HelloWorld.php</code> と名づけて保存し、プラグインディレクトリに置きます。<em>最後の <code>?></code> の後や、最初の <code><?php</code> の前にスペースがないことを確認しましょう</em>。ところでNP は "Nucleus Plugin" って意味ですよ :-) 念のため。
\r
218 <li>Nucleusの管理画面を開き、<em>Nucleusの管理>プラグインの管理</em>にいきます。</li>
\r
219 <li><em>HelloWorld</em> プラグインがインストール可能な状態になっているはずですので、インストールします。すべてがうまくいけば、インストール済みプラグインリストに追加されます。</li>
\r
221 あなたのスキンの1つを編集し、実際のページに表示する箇所に次の文を挿入します。
\r
222 <pre class="example"><code><%HelloWorld%></code></pre>
\r
223 注意:カッコ内の名称 (<code>HelloWorld</code>) は大文字小文字を識別します!
\r
225 <li>さて、編集したスキンから生成されるページを見てみましょう。プラグイン変数を追加した場所に "Hello World" と見えますね?</li>
\r
229 ここまではそれほど難しくなかったと思います。さらに読み進めて理解してください。
\r
238 <h1>NucleusPlugin クラスの概要 <a id="nucleusplugin" name="nucleusplugin" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
240 <p>すべてのプラグインは、<code>NucleusPlugin</code> というPHPクラスを継承しなければなりません。難しそうに聞こえても心配ご無用、大丈夫です。このPHPクラスの継承によって、プラグインに必要なメソッドだけを実装でき、いくつかの補助ファンクションにアクセスでき、つまりはあなたの人生はよりラクになります。</p>
\r
242 <p>下記は <code>NucleusPlugin</code> が提供する、再実装可能なメソッドの概要です。このクラス自身のソースコードを見たければ、<code>nucleus/libs/PLUGIN.php</code>にあります。</p>
\r
244 <table summary="An overview of the redefinable methods in the class NucleusPlugin">
\r
245 <caption><code>NucleusPlugin</code> クラスの概要(再定義可能なメソッド)</caption>
\r
247 <th abbr="method">メソッド名</th><th abbr="desc">説明</th>
\r
250 <td><code>getName()</code></td>
\r
251 <td>プラグイン名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>
\r
254 <td><code>getAuthor()</code></td>
\r
255 <td>プラグインの作者名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>
\r
258 <td><code>getURL()</code></td>
\r
259 <td>プラグインをダウンロード可能な、またはプラグインの追加情報のあるサイトのURLを返します。そのようなサイトがない場合は作者のメールアドレスへの mailto:リンクが適切です。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>
\r
262 <td><code>getDescription()</code></td>
\r
263 <td>プラグインに関する説明文(長文)を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返します。</td>
\r
266 <td><code>getVersion()</code></td>
\r
267 <td>プラグインの現在のバージョンを返します。デフォルトは <code>0.0</code> を返します。</td>
\r
270 <td><code>getMinNucleusVersion()</code></td>
\r
271 <td>(v2.0b) 最低限必要なNucleusのバージョンを返します。デフォルトは <code>155</code> (v1.55)を返します。後に導入されたプラグイン関連機能を利用している場合は、このファンクションを実装するようお願いします(例: v2.0 => 200)。ただし、Nucleus v1.55 はこのファンクションを使用しないため、新機能を利用したプラグインが(対応する前のシステムに)インストールされる可能性が残っています。</td>
\r
274 <td><code>getMinNucleusPatchLevel()</code></td>
\r
275 <td>(v3.1) 最低限必要なNucleusのバージョン(<code>getMinNucleusVersion</code>)での、最低限必要なパッチレベルを返します。デフォルトは <code>0</code> を返します。このファンクションは主に新しいプラグインの機能がNucleusの最新版のパッチによって可能になる場合に用いられます。</td>
\r
278 <td><code>init()</code></td>
\r
279 <td>プラグインを初期化します。このメソッドはプラグインオブジェクトが生成された直後に呼び出され、<code>plugid</code>属性がセットされます。デフォルトではこのメソッドは何もしません。</td>
\r
282 <td><code>doSkinVar($skinType)</code></td>
\r
283 <td><code><%plugin(...)%></code> スキン変数によってプラグインが呼び出されたときにこのメソッドが呼ばれます。<code>$skinType</code> パラメータはプラグインが呼ばれた場所のスキンタイプに該当します(<code>item</code>, <code>archive</code>, ...)。パラメータが一つしかないことに混乱しないでください。複数パラメータを渡すことも<strong>可能</strong>です。<a href="#skinvars"><code>doSkinVar</code> メソッドの実装に関する詳細情報はこちら</a>。デフォルトではこのメソッドはなにも出力しません。</td>
\r
286 <td><code>doTemplateVar(&$item)</code></td>
\r
287 <td>基本的に <code>doSkinVar</code> と同じですが、今度は<em>テンプレート</em>内(<code>item header/body/footer</code> と <code>dateheader/footer</code>)での<code><%plugin(...)%></code> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなして<code>doSkinVar</code> メソッドに処理を渡します。<a href="#templatevars"><code>doTemplateVar</code> メソッドの実装に関する詳細情報はこちら</a></td>
\r
290 <td><code>doTemplateCommentsVar(&$item, &$comment)</code></td>
\r
291 <td>(v2.0b) 基本的に <code>doSkinVar</code> と同じですが、今度は<em>テンプレート</em>内(コメント部分)での<code><%plugin(...)%></code> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなして<code>doSkinVar</code> メソッドに処理を渡します。<a href="#templatevars"><code>doTemplateCommentsVar</code>メソッドの実装に関する詳細情報はこちら</a></td>
\r
294 <td><code>doItemVar(&$item, &$param)</code></td>
\r
295 <td>(v3.30) 基本的に <code>doSkinVar</code> と同じですが、今度は<em>投稿した記事</em>内での<code><%plugin(...)%></code> 変数からの呼び出しになります。渡される引数のうち<code>&$item</code>は変数が記述されているアイテムのフルオブジェクトを、<code>&$param</code>はプラグインごとの関数のパラメータになります。</td>
\r
298 <td><code>doIf($key, $value)</code></td>
\r
299 <td>(v3.30) スキン変数 <code>if/ifnot/elseif/elseifnot</code> に対して、プラグイン独自の判断をする事が出来るメソッドです。通常は、<code>$key</code> 変数が <code>$value</code> の値を持っているかを調べて、 <code>true</code> か <code>false</code> を返すことになります。このメソッドをプラグインに実装する場合は、作者は使用方法のドキュメントを書くようにしてください。</td>
\r
302 <td><code>doAction($type)</code></td>
\r
303 <td>プラグインがユーザーインタラクションを求めたとき、 <code>action.php</code>を介してこのメソッドがそれを与えます。これはNucleus自身が新しいコメントや投票を処理するのに使用するスクリプトです。正しいパラメータを用いることで、プラグインからの <code>doAction</code> メソッドを呼び出せます。<code>$type</code> はオプションのメッセージタイプに該当します。<code>doAction</code> メソッド内で、リクエストからの追加の変数にアクセスできます。デフォルトではこのメソッドがエラーメッセージをトリガーすると<code>'No Such Action'</code>という文字列を返します。<a href="#actions"><code>doAction</code> に関する詳細情報はこちら</a></td>
\r
306 <td><code>install()</code></td>
\r
307 <td>このメソッドはプラグインがインストールされた際に呼ばれます。データベース・テーブルの生成やプラグインオプションの生成などの初期化作業を行うことができます。デフォルトではこのメソッドは何もしません。</td>
\r
310 <td><code>unInstall()</code></td>
\r
311 <td>プラグインがアンインストールされた際に呼ばれます。この時点でデータベースに作られたプラグイン情報を消去すると良いです。デフォルトではこのメソッドは何もしません。</td>
\r
314 <td><code>getEventList()</code></td>
\r
315 <td>プラグインはイベント登録が可能です。イベントはNucleusが何かアクションを起こすたびに生成されます。たとえば、<code>AddItem</code> イベントは、このイベントを登録しているすべてのプラグインを呼び出します。呼び出されるメソッドは <code>event_AddItem($params)</code>になります。 <code>$params</code> パラメータは、例えば <code>AddItem</code> の <code>itemid</code> のような、情報フィールドを複数持つ連想配列です。デフォルトではどのイベントにも登録されていないことを示す空の配列を返します。<a href="#events">イベントに関する詳細情報はこちら</a></td>
\r
318 <td><code>getTableList()</code></td>
\r
319 <td>このメソッドはプラグインが生成したデータベース・テーブルの配列を返します。これはNucleusが提供するバックアップ機能で利用されるので、プラグインテーブルをバックアップに含めることができます。デフォルトでは空の配列を返します。</td>
\r
322 <td><code>hasAdminArea()</code></td>
\r
323 <td>プラグインが独自の管理エリアをもつ場合 1 を、そうでない場合 0 を返します。デフォルトでは <code>0</code> を返します。</td>
\r
326 <td><code>getPluginDep()</code></td>
\r
327 <td>(v3.2) プラグイン名の配列を返します。Nucleusはこれらのプラグインが前もってインストールされてない場合、プラグインのインストールを拒否します。デフォルトでは空の配列が返されます。<a href="#dependency">プラグイン依存に関する詳細情報はこちら</a></td>
\r
331 <p>実装可能なメソッドの次は、<code>NucleusPlugin</code> クラスが提供する、再実装<strong>すべきでない</strong>幾つかの特殊メソッドです。これらはプラグイン内で、<code>$this->functionName()</code>シンタックスを利用して呼び出します。</p>
\r
333 <table summary="An overview of the auxiliary methods in the class NucleusPlugin. You should NOT redefine these">
\r
334 <caption><code>NucleusPlugin</code> クラスの概要(再定義不可能なメソッド)</caption>
\r
336 <th abbr="method">メソッド名</th><th abbr="desc">説明</th>
\r
341 <li><code>createOption(...)</code></li>
\r
342 <li><code>createBlogOption(...)</code>(v2.2)</li>
\r
343 <li><code>createCategoryOption(...)</code>(v2.2)</li>
\r
344 <li><code>createMemberOption(...)</code>(v2.2)</li>
\r
345 <li><code>createItemOption(...)</code>(v3.2)</li>
\r
348 <td><a href="#options" title="More info on options">新しいオプションを生成します。</a></td>
\r
353 <li><code>deleteOption(...)</code></li>
\r
354 <li><code>deleteBlogOption(...)</code>(v2.2)</li>
\r
355 <li><code>deleteCategoryOption(...)</code>(v2.2)</li>
\r
356 <li><code>deleteMemberOption(...)</code>(v2.2)</li>
\r
357 <li><code>deleteItemOption(...)</code>(v3.2)</li>
\r
360 <td><a href="#options" title="More info on options">オプションを削除します。</a></td>
\r
365 <li><code>setOption(...)</code></li>
\r
366 <li><code>setBlogOption(...)</code>(v2.2)</li>
\r
367 <li><code>setCategoryOption(...)</code>(v2.2)</li>
\r
368 <li><code>setMemberOption(...)</code>(v2.2)</li>
\r
369 <li><code>setItemOption(...)</code>(v3.2)</li>
\r
372 <td><a href="#options" title="More info on options">オプションに値をセットします。</a></td>
\r
377 <li><code>getOption(...)</code></li>
\r
378 <li><code>getBlogOption(...)</code>(v2.2)</li>
\r
379 <li><code>getCategoryOption(...)</code>(v2.2)</li>
\r
380 <li><code>getMemberOption(...)</code>(v2.2)</li>
\r
381 <li><code>getItemOption(...)</code>(v3.2)</li>
\r
384 <td><a href="#options" title="More info on options">オプションの値を取得します。</a></td>
\r
389 <li><code>getAllBlogOptions(...)</code>(v2.2)</li>
\r
390 <li><code>getAllCategoryOptions(...)</code>(v2.2)</li>
\r
391 <li><code>getAllMemberOptions(...)</code>(v2.2)</li>
\r
392 <li><code>getAllItemOptions(...)</code>(v3.2)</li>
\r
395 <td><a href="#options" title="More info on options">与えられたオプションにより、すべての値(コンテクストごとの一つの値)の連想配列を返します。</a></td>
\r
401 <li><code>getBlogOptionTop(...)</code>(v3.2)</li>
\r
402 <li><code>getMemberOptionTop(...)</code>(v3.2)</li>
\r
403 <li><code>getCategoryOptionTop(...)</code>(v3.2)</li>
\r
404 <li><code>getItemOptionTop(...)</code>(v3.2)</li>
\r
407 <td><a href="#options" title="More info on options">与えられたオプションにより、すべての値のうちの最初の値を返します。</a></td>
\r
410 <td><code>getID()</code></td>
\r
411 <td>このプラグインのIDを返します(このIDはNucleus内部で利用されるものです)。</td>
\r
414 <td><code>getAdminURL()</code></td>
\r
415 <td>プラグインの管理エリアが置かれたURLを返します(そのような管理エリアがない場合は、この情報は無効です)。</td>
\r
418 <td><code>getDirectory()</code></td>
\r
419 <td>プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(そのようなファイルがない場合は、この情報は無効です)。結果は"<code>.../nucleus/plugins/<em>plugname</em>/</code>"のようになります。</td>
\r
422 <td><code>getShortName()</code></td>
\r
423 <td>"NP_"部分を省き、全てを小文字にしたプラグインのクラス名を返します。この情報は <code>getAdminURL</code> と <code>getDirectory</code> で使用されます。</td>
\r
428 <h1>スキン変数<a id="skinvars" name="skinvars" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
433 独自のスキン変数を生成し、<code><%plugin(<em>PlugName,parameters</em>)%></code> または <code><%PlugName(parameters)%></code>で呼び出すことが出来ます(すでに存在するスキン変数とかぶらない場合)。パラメータはカンマ区切りです。
\r
437 スキン変数を扱うには、<code>doSkinVar</code> メソッドを実装する必要があります。いくつかの例を以下に示します。
\r
440 <pre class="example"><code>function doSkinVar($skinType)
\r
441 function doSkinVar($skinType, $param1, $param2)
\r
442 function doSkinVar($skinType, $skinVar, $param1, $param2)
\r
443 function doSkinVar($skinType, $skinVar, $param1 = 'default value')</code></pre>
\r
446 <li><code>$skinType</code> パラメータは、'index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', <a href="#templatevars" title="Information on templatevars">'template'</a>のうちの一つを取ります</li>
\r
447 <li><code>$skinVar</code> は、スキン変数のタイプとして解釈される実質的に最初のパラメータになります(例:<code><%plugin(PlugName,VarType)%></code>)。</li>
\r
448 <li><code>doSkinVar()</code>(パラメータ無し)を使い、PHPファンクションの<code>func_get_args()</code>を用いてパラメータを取得することができます。引数の数の異なる、タイプの違うスキン変数を扱うときに便利です。</li>
\r
454 <li>(v2.0b) グローバル変数としてパースされている <code>$currentSkinName</code> を使ってスキンの名前を取得できます。</li>
\r
460 <h1>テンプレート変数<a id="templatevars" name="templatevars" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
465 テンプレートプラグイン変数はスキンプラグイン変数と同様に働きますが以下の2点が異なります。</p>
\r
468 <li>スキン内ではなくテンプレート内から呼ばれます。</li>
\r
469 <li>$skinTypeパラメータを取りません。代わりに現在パースされているアイテムやコメントの情報付きの追加パラメータを取ります。
\r
471 <li><code>doTemplateVar</code> メソッドは <code>&$item</code> パラメータを取ります。</li>
\r
472 <li><code>doTemplateCommentsVar</code> メソッドは <code>&$item</code> と <code>&$comment</code> パラメータを取ります。</li>
\r
474 <strong>&マークに注意!</strong>
\r
478 <p>テンプレート変数はスキン変数と同じ要領で呼ばれます(<code><%plugin(PlugName,parameters)%></code> または <code><%PlugName(parameters)%></code>)。
\r
482 デフォルトでは、全てのテンプレート変数は'<code>template</code>'を<code>skintype</code>パラメータとして、<code>doSkinVar</code> メソッドに渡ります。
\r
486 独自の実装を提供したい場合は、<code>doTemplateVar</code> メソッドや <code>doTemplateCommentsVar</code> メソッドを再定義する必要があります。<code>skintype</code>パラメータが無くなる以外はdoSkinVarと同様に働きます。
\r
489 <pre class="example"><code>function doTemplateVar(&$item)
\r
490 function doTemplateVar(&$item, $param1, $param2)
\r
491 function doTemplateVar(&$item, $type, $param1, $param2)
\r
492 function doTemplateVar(&$item, $type, $param1 = 'default value')
\r
493 function doTemplateCommentsVar(&$item, &$comment)
\r
494 function doTemplateCommentsVar(&$item, &$comment, $param1, $param2)
\r
495 function doTemplateCommentsVar(&$item, &$comment, $type, $param1, $param2)
\r
496 function doTemplateCommentsVar(&$item, &$comment, $type, $param1 = 'default value')</code></pre>
\r
501 <li>(v2.0b) グローバル変数として内部で利用される <code>$currentSkinName</code> を使ってテンプレートの名前を取得できます。</li>
\r
507 <h1>アクション<a id="actions" name="actions" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
509 <p>プラグインは <code>action.php</code> を通してアクションを行うことができ、同様のスクリプトがコメントや投票の受け取りにも使用されてます。GETまたはPOSTのどちらかを通して呼び出せます。必要なパラメータは<code>action</code>('plugin'と指定)、<code>name</code>(プラグイン名)、<code>type</code>(リクエストされたアクションの種類)です。</p>
\r
511 <p>これらのアクションを有効にするために、<code>doAction($actionType)</code> メソッドをプラグイン内で実装する必要があります。リクエストからの追加パラメータは<code>requestVar('<em>name</em>')</code> で取得できます(<code>requestVar</code> はPHPが付加する magic_quotes_gpc に配慮しています)。</p>
\r
514 <code>doAction</code> メソッドが文字列を返すとき、エラーとして解釈され、エラーメッセージが表示されます。
\r
522 <h1>イベント<a id="events" name="events" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
525 Nucleusプラグインはなにか重要なことが起きたときに発生するイベントに登録可能です。プラグインはイベント発生の際にアクションを実行したり、テキストを出力したりできます。
\r
531 下記は <code>PreAddComment</code> イベント(blogにコメントが追加される直前に生成されるイベント)にプラグインが登録する例です。
\r
534 <pre class="example"><code>class NP_Acronyms extends NucleusPlugin {
\r
536 function getEventList() { return array('PreAddComment'); }
\r
538 function event_PreAddComment(&$data) {
\r
540 $data['comment']['body'] =
\r
542 '<acronym title="HyperText Markup Language">HTML</acronym>',
\r
543 $data['comment']['body']);
\r
548 <p>このプラグインはコメント中の'HTML'というテキストを'<code><acronym title="HyperText Markup Language">HTML</acronym></code>'に置き換えます。acronymタグはHTMLタグで、頭字語についての追加情報を提供します。</p>
\r
552 <p>イベント登録に必要なステップは以下になります。</p>
\r
555 <li><code>getEventList</code> メソッドから返る配列にイベント名を追加します。</li>
\r
556 <li><code>event_EventName($data)</code> という形でメソッドを生成し、この中でイベントを処理します。</li>
\r
559 <p>複数のプラグインが同じイベントに登録できます。管理エリアのプラグインリストの順序に従ってプラグインに通知が行きます。リストの上にあるプラグインほど早く通知されます。</p>
\r
563 <p><code>event_EventName</code> メソッドはひとつだけ <code>$data</code> パラメータを持ち、それはイベントごとに内容が異なります。これは連想配列です。この連想配列に渡されたオブジェクトや配列は<strong>参照形式</strong>で渡されるため、これらに加えた変更は記憶されます。</p>
\r
565 <p>以下のイベントリストは、パラメータ変更がNucleusに知られるかどうかを示すために色を使い分けています。</p>
\r
568 <li><var class="ref">参照渡し(緑)</var>: この種のパラメータに変更を加えるとNucleusに知られます。</li>
\r
569 <li><var class="ro">値渡し(赤)</var>: プラグインイベントハンドラに渡される前に値がコピーされます。これらの変数への変更は自動的に破棄されます。.</li>
\r
572 <p>パラメータとして渡されるオブジェクトは<var class="obj">object</var>.として示されます。ほとんどのオブジェクトは参照渡しで、<var class="obj ref">object by ref</var>のように示されます。</p>
\r
576 <table summary="An overview of events to which a Nucleus Plugin can subscribe, and what parameters are passed along to the method that handles the event">
\r
577 <caption>プラグインが登録できるイベント</caption>
\r
579 <th abbr="name">イベントの名前</th><th abbr="timing">イベントが発生するタイミング</th><th abbr="param">プラグインに渡されるパラメータ</th>
\r
582 <td>InitSkinParse</td>
\r
583 <td>スキンの初期化の直前</td>
\r
585 <dt class="obj ref">skin</dt>
\r
586 <dd>パースする<code>SKIN</code>オブジェクト</dd>
\r
587 <dt class="ro">type</dt>
\r
588 <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>
\r
592 <td>PreSkinParse</td>
\r
593 <td>スキンのパースの直前</td>
\r
595 <dt class="obj ref">skin</dt>
\r
596 <dd>パースする<code>SKIN</code>オブジェクト</dd>
\r
597 <dt class="ro">type</dt>
\r
598 <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>
\r
599 <dt class="ref">contents</dt>
\r
604 <td>PostSkinParse</td>
\r
605 <td>スキンのパースの直後</td>
\r
607 <dt class="obj ref">skin</dt>
\r
608 <dd>パースする<code>SKIN</code>オブジェクト</dd>
\r
609 <dt class="ro">type</dt>
\r
610 <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>
\r
615 <td>アイテムのパース前、ただしアイテムヘッダーのパース後</td>
\r
617 <dt class="ref obj">blog</dt>
\r
618 <dd><code>BLOG</code> オブジェクト</dd>
\r
619 <dt class="ref obj">item</dt>
\r
620 <dd>アイテムデータを持つオブジェクト</dd>
\r
625 <td>アイテムのパース後、ただしアイテムフッターのパース前</td>
\r
627 <dt class="ref obj">blog</dt>
\r
628 <dd><code>BLOG</code> オブジェクト</dd>
\r
629 <dt class="ref obj">item</dt>
\r
630 <dd>アイテムデータを持つオブジェクト</dd>
\r
634 <td>PreComment</td>
\r
637 <dt class="ref">comment</dt>
\r
638 <dd>コメントデータを持つ連想配列</dd>
\r
642 <td>PostComment</td>
\r
645 <dt class="ref">comment</dt>
\r
646 <dd>コメントデータを持つ連想配列</dd>
\r
650 <td>PreDateHead</td>
\r
651 <td>日付ヘッダーのパース前</td>
\r
653 <dt class="obj ref">blog</dt>
\r
654 <dd><code>BLOG</code> オブジェクト</dd>
\r
655 <dt class="ro">timestamp</dt>
\r
656 <dd>日付ヘッダーのタイムスタンプ</dd>
\r
660 <td>PostDateHead</td>
\r
661 <td>日付ヘッダーのパース後</td>
\r
663 <dt class="obj ref">blog</dt>
\r
664 <dd><code>BLOG</code> オブジェクト</dd>
\r
665 <dt class="ro">timestamp</dt>
\r
666 <dd>日付ヘッダーのタイムスタンプ</dd>
\r
670 <td>PreDateFoot</td>
\r
671 <td>日付フッターのパース前</td>
\r
673 <dt class="ref obj">blog</dt>
\r
674 <dd><code>BLOG</code> オブジェクト</dd>
\r
675 <dt class="ro">timestamp</dt>
\r
676 <dd>日付フッターのタイムスタンプ</dd>
\r
680 <td>PostDateFoot</td>
\r
681 <td>日付フッターのパース後</td>
\r
683 <dt class="ref obj">blog</dt>
\r
684 <dd><code>BLOG</code> オブジェクト</dd>
\r
685 <dt class="ro">timestamp</dt>
\r
686 <dd>日付フッターのタイムスタンプ</dd>
\r
690 <td>LoginSuccess</td>
\r
693 <dt class="obj ref">member</dt>
\r
694 <dd><code>MEMBER</code> オブジェクト</dd>
\r
695 <dt class="ro">username</dt>
\r
696 <dd>ログ印字に使用されたログイン名</dd>
\r
700 <td>LoginFailed</td>
\r
703 <dt class="ro">username</dt>
\r
704 <dd>ログイン時に使われたユーザー名</dd>
\r
711 <dt class="ro">username</dt>
\r
712 <dd>ログアウト時のユーザー名</dd>
\r
716 <td>PreBlogContent</td>
\r
717 <td>blogの内容がスキン変数を通して挿入される前</td>
\r
719 <dt class="obj ref">blog</dt>
\r
720 <dd><code>BLOG</code> オブジェクト</dd>
\r
721 <dt class="ro">type</dt>
\r
722 <dd>呼び出されたスキン変数 ('blog', 'otherblog', 'archive', 'archivelist', 'item', 'searchresults', 'othersearchresults', 'categorylist', 'otherarchive', 'otherarchivelist')</dd>
\r
726 <td>PostBlogContent</td>
\r
727 <td>blogの内容がスキン変数を通して挿入された後</td>
\r
729 <dt class="obj ref">blog</dt>
\r
730 <dd><code>BLOG</code> オブジェクト</dd>
\r
731 <dt class="ro">type</dt>
\r
732 <dd>呼び出されたスキン変数 ('blog', 'otherblog', 'archive', 'archivelist', 'item', 'searchresults', 'othersearchresults', 'categorylist', 'otherarchive', 'otherarchivelist')</dd>
\r
736 <td>PreAddComment</td>
\r
737 <td>コメントがデータベースに追加される前</td>
\r
739 <dt class="ref">comment</dt>
\r
740 <dd>コメントデータ(連想配列)</dd>
\r
741 <dt class="ref">spamcheck</dt>
\r
742 <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返されるデータ構造(連想配列)</dd>
\r
746 <td>PostAddComment</td>
\r
747 <td>コメントがデータベースに追加された後</td>
\r
749 <dt class="ref">comment</dt>
\r
750 <dd>コメントデータ(連想配列)</dd>
\r
751 <dt class="ref">commentid</dt>
\r
753 <dt class="ref">spamcheck</dt>
\r
754 <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返されるデータ構造(連想配列)</dd>
\r
758 <td>PostRegister</td>
\r
759 <td>新規ユーザーの登録後</td>
\r
761 <dt class="obj ref">member</dt>
\r
762 <dd>新しい<code>MEMBER</code> オブジェクト</dd>
\r
766 <td>PostAddItem</td>
\r
767 <td>アイテムがデータベースに追加された後</td>
\r
769 <dt class="ro">itemid</dt>
\r
770 <dd>データベースに出来た新しい itemid</dd>
\r
774 <td>PostUpdateItem</td>
\r
775 <td>アイテムがデータベースにアップデートされた直後</td>
\r
777 <dt class="ro">itemid</dt>
\r
782 <td>PreAddItem</td>
\r
783 <td>アイテムがデータベースに追加される直前</td>
\r
785 <dt class="ref">title</dt>
\r
787 <dt class="ref">body</dt>
\r
789 <dt class="ref">more</dt>
\r
791 <dt class="ref obj">blog</dt>
\r
792 <dd><code>BLOG</code> オブジェクト</dd>
\r
793 <dt class="ref">authorid</dt>
\r
795 <dt class="ref">timestamp</dt>
\r
796 <dd>UNIX タイムスタンプ</dd>
\r
797 <dt class="ref">closed</dt>
\r
798 <dd>1 (コメント不可) or 0 (コメント可)</dd>
\r
799 <dt class="ref">draft</dt>
\r
800 <dd>1 (ドラフト) or 0 (非ドラフト)</dd>
\r
801 <dt class="ref">catid</dt>
\r
806 <td>PreUpdateItem</td>
\r
807 <td>データベースにあるアイテムが更新される直前</td>
\r
809 <dt class="ro">itemid</dt>
\r
811 <dt class="ref">title</dt>
\r
813 <dt class="ref">body</dt>
\r
815 <dt class="ref">more</dt>
\r
817 <dt class="ref obj">blog</dt>
\r
818 <dd><code>BLOG オブジェクト</code> object</dd>
\r
819 <dt class="ref">closed</dt>
\r
820 <dd>1 (コメント不可) or 0 (コメント可)</dd>
\r
821 <dt class="ref">catid</dt>
\r
826 <td>PrepareItemForEdit</td>
\r
827 <td>アイテムをデータベースから取得した直後で、編集のためにユーザーに表示される前</td>
\r
829 <dt class="ref">item</dt>
\r
830 <dd>アイテムデータを持つ連想配列</dd>
\r
834 <td>PreUpdateComment</td>
\r
835 <td>コメントが更新され、データベースに保存される直前</td>
\r
837 <dt class="ref">body</dt>
\r
842 <td>PrepareCommentForEdit</td>
\r
843 <td>コメントをデータベースから取得した直後で、編集のためにユーザーに表示される前</td>
\r
845 <dt class="ref">comment</dt>
\r
846 <dd>コメントデータ(連想配列)</dd>
\r
850 <td>PrePluginOptionsEdit</td>
\r
853 <li>(v2.0b) 'プラグインオプションの編集'フォームが生成される前</li>
\r
854 <li>(v2.2) パラメータ追加</li>
\r
855 <li>(v3.2) 各オプションにパラメータ追加</li>
\r
859 <dt class="ro">context</dt>
\r
860 <dd>(v2.2) <code>global</code>, <code>blog</code>, <code>member</code>, <code>item</code>, <code>category</code>のいずれか</dd>
\r
861 <dt class="ref">options</dt>
\r
862 <dd>次のインデックスをもつ連想配列: <code>name</code>, <code>value</code>, <code>oid</code>, <code>description</code>, <code>type</code>, <code>typeinfo</code>, <code>contextid</code>, <code>extra</code> 。追加オプションをここに加えることも可能(それらで何かの処理をするときはPostPluginOptionsUpdateの記述も必要)<br />
\r
863 <code>extra</code>フィールドを用いて、オプションに追加HTML(たとえばフォームのコントロール)を追加できます。もしそうする場合、 <code>extra</code> に追加する前に <code>pid</code> と <code>getID()</code> を比較し、さらに <code>name</code> をチェックすべきです。</dd>
\r
864 <dt class="ro">plugid</dt>
\r
865 <dd>プラグイン ID (これが気になるなら、<code>GetID()</code>を見ると理解できる)(コンテクストがglobalのときのみ存在)</dd>
\r
866 <dt class="ro">contextid</dt>
\r
867 <dd>コンテクスト ID (blogid, memberid, catid, itemid コンテクストによる)</dd>
\r
872 <td>PrePluginOptionsUpdate</td>
\r
874 (v3.2) プラグインオプションが更新される前。(このイベントを使ってオプションの新しい値を評価したり変更したりできます)
\r
877 <dt class="ro">context</dt>
\r
878 <dd>(v2.2) <code>global</code>, <code>member</code>, <code>blog</code>, <code>item</code>, <code>category</code>のいずれか</dd>
\r
879 <dt class="ro">plugid</dt>
\r
880 <dd>プラグイン ID (これが気になるなら、<code>GetID()</code>を見ると理解できる)</dd>
\r
881 <dt class="ro">optionname</dt>
\r
883 <dt class="ro">contextid</dt>
\r
884 <dd>コンテクスト ID (blogid, memberid, catid, itemid コンテクストによる)</dd>
\r
885 <dt class="ref">value</dt>
\r
886 <dd>そのオプションの新しい値</dd>
\r
892 <td>PostPluginOptionsUpdate</td>
\r
895 <li>(v2.0b) プラグインオプションの更新後</li>
\r
896 <li>(v2.2) コンテクストによって異なるパラメータ</li>
\r
900 <dt class="ro">context</dt>
\r
901 <dd>(v2.2) <code>global</code>, <code>member</code>, <code>blog</code>, <code>item</code>, <code>category</code>のいずれか</dd>
\r
902 <dt class="ro">plugid</dt>
\r
903 <dd>プラグイン ID (これが気になるなら、<code>GetID()</code>を見ると理解できる)(globalコンテクスト)</dd>
\r
904 <dt class="ro">blogid</dt>
\r
905 <dd>(v2.2) blog ID (blog コンテクスト)</dd>
\r
906 <dt class="ref obj">blog</dt>
\r
907 <dd>(v2.2) BLOG オブジェクト (blog コンテクスト)</dd>
\r
908 <dt class="ro">memberid</dt>
\r
909 <dd>(v2.2) member ID (member コンテクスト)</dd>
\r
910 <dt class="ref obj">member</dt>
\r
911 <dd>(v2.2) MEMBER オブジェクト (member コンテクスト)</dd>
\r
912 <dt class="ro">catid</dt>
\r
913 <dd>(v2.2) category ID (category コンテクスト)</dd>
\r
914 <dt class="ro">itemid</dt>
\r
915 <dd>(v2.2) item ID (item コンテクスト)</dd>
\r
916 <dt class="ref obj">member</dt>
\r
917 <dd>(v2.2) ITEM オブジェクト (item コンテクスト)</dd>
\r
922 <td>PostAuthentication</td>
\r
923 <td>(v2.0b) ログイン処理の完了後。ページリクエストごとに発生</td>
\r
925 <dt class="ro">loggedIn</dt>
\r
926 <dd><code>$member->isLoggedIn()</code>の戻り値</dd>
\r
930 <td>PreAddItemForm</td>
\r
931 <td>(v2.0b) アイテム追加フォーム(ブックマークレットまたは管理エリア)が生成される直前</td>
\r
933 <dt class="ref">contents</dt>
\r
934 <dd>連想配列への参照。そのうちの'title', 'body', 'more'にはフォームフィールドへの初期値を与えることができます。複数のプラグイン間でこれらの値の変更を避けるには、処理後に'hasBeenSet'の値を1にセットします(かつ処理前にこの値をチェックするようにします)</dd>
\r
935 <dt class="ref obj">blog</dt>
\r
936 <dd><code>BLOG</code> オブジェクトへの参照</dd>
\r
940 <td>AddItemFormExtras</td>
\r
941 <td>(v2.0b) アイテム追加ページまたはブックマークレット内部のどこか。<code>template</code> ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。</td>
\r
943 <dt class="ref obj">blog</dt>
\r
944 <dd><code>BLOG</code> オブジェクトへの参照</dd>
\r
948 <td>EditItemFormExtras</td>
\r
950 (v2.0b) アイテム編集ページまたはブックマークレット内部のどこか。<code>template</code> ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。<br style="margin-bottom:1.5em;" />
\r
952 あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。
\r
953 <pre class="example"><code><h3>プラグイン名</h3>
\r
954 <p>追加フォームの内容</p></code></pre>
\r
955 このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。
\r
958 <dt class="ref obj">blog</dt>
\r
959 <dd><code>BLOG</code> オブジェクトへの参照</dd>
\r
960 <dt class="ro">variables</dt>
\r
962 (read-only) 編集されるアイテムに関する全ての情報を持つ連想配列: 'itemid', 'draft', 'closed', 'title', 'body', 'more', 'author', 'authorid', 'timestamp', 'karmapos', 'karmaneg', 'catid'
\r
964 <dt class="ro">itemid</dt>
\r
965 <dd>アイテム IDへのショートカット</dd>
\r
969 <td>BlogSettingsFormExtras</td>
\r
970 <td>(v2.0) blog設定ページにフォームを追加可能
\r
971 <br style="margin-bottom:1.5em;" />
\r
972 あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。
\r
973 <pre class="example"><code><h4>プラグイン名</h4>
\r
974 <form method="post" action="..."><p>
\r
976 </p></form></code></pre>
\r
977 このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。
\r
981 <dt class="obj ref">blog</dt>
\r
982 <dd><code>BLOG</code> オブジェクトへの参照</dd>
\r
986 <td>PreDeleteItem</td>
\r
987 <td>(v2.0) アイテムがデータベースから削除される直前</td>
\r
989 <dt class="ro">itemid</dt>
\r
990 <dd>削除されるアイテムID</dd>
\r
994 <td>PostDeleteItem</td>
\r
995 <td>(v2.0) アイテムがデータベースから削除された直後</td>
\r
997 <dt class="ro">itemid</dt>
\r
998 <dd>削除されたアイテムID</dd>
\r
1002 <td>PreDeleteCategory</td>
\r
1003 <td>(v2.0) カテゴリーがデータベースから削除される直前</td>
\r
1005 <dt class="ro">catid</dt>
\r
1006 <dd>削除されるカテゴリー ID</dd>
\r
1010 <td>PostDeleteCategory</td>
\r
1011 <td>(v2.0) カテゴリーがデータベースから削除された直後</td>
\r
1013 <dt class="ro">catid</dt>
\r
1014 <dd>削除されたカテゴリー ID</dd>
\r
1018 <td>PreDeleteBlog</td>
\r
1019 <td>(v2.0) blogがデータベースから削除される直前</td>
\r
1021 <dt class="ro">blogid</dt>
\r
1022 <dd>削除されるblogID</dd>
\r
1026 <td>PostDeleteBlog</td>
\r
1027 <td>(v2.0) blogがデータベースから削除された直後</td>
\r
1029 <dt class="ro">blogid</dt>
\r
1030 <dd>削除されたblogID</dd>
\r
1034 <td>PreDeleteMember</td>
\r
1035 <td>(v2.0) メンバーがデータベースから削除される直前</td>
\r
1037 <dt class="ref obj">member</dt>
\r
1038 <dd><code>削除されるメンバーに関するMEMBER</code> オブジェクトへの参照</dd>
\r
1042 <td>PostDeleteMember</td>
\r
1043 <td>(v2.0) メンバーがデータベースから削除された直後</td>
\r
1045 <dt class="ref obj">member</dt>
\r
1046 <dd><code>削除されるメンバーに関するMEMBER</code> オブジェクトへの参照</dd>
\r
1050 <td>PreDeleteTeamMember</td>
\r
1051 <td>(v2.0) メンバーがweblogチームから削除される直前</td>
\r
1053 <dt class="ref obj">member</dt>
\r
1054 <dd><code>MEMBER</code> オブジェクトへの参照</dd>
\r
1055 <dt class="ro">blogid</dt>
\r
1060 <td>PostDeleteTeamMember</td>
\r
1061 <td>(v2.0) メンバーがweblogチームから削除された直後</td>
\r
1063 <dt class="ref obj">member</dt>
\r
1064 <dd><code>MEMBER</code> オブジェクトへの参照</dd>
\r
1065 <dt class="ro">blogid</dt>
\r
1070 <td>PreDeleteComment</td>
\r
1071 <td>(v2.0) コメントがデータベースから削除される直前</td>
\r
1073 <dt class="ro">commentid</dt>
\r
1074 <dd>削除されるコメントID</dd>
\r
1078 <td>PostDeleteComment</td>
\r
1079 <td>(v2.0) コメントがデータベースから削除された直後</td>
\r
1081 <dt class="ro">commentid</dt>
\r
1082 <dd>削除されたコメントID</dd>
\r
1086 <td>ActionLogCleared</td>
\r
1087 <td>(v2.0) アクションログが消去された後</td>
\r
1091 <td>PreDeleteTemplate</td>
\r
1092 <td>(v2.0) テンプレートがデータベースから削除される直前</td>
\r
1094 <dt class="ro">templateid</dt>
\r
1095 <dd>削除されるテンプレートID</dd>
\r
1099 <td>PostDeleteTemplate</td>
\r
1100 <td>(v2.0) テンプレートがデータベースから削除された直後</td>
\r
1102 <dt class="ro">templateid</dt>
\r
1103 <dd>削除されたテンプレートID</dd>
\r
1107 <td>PreDeleteSkin</td>
\r
1108 <td>(v2.0) スキンがデータベースから削除される直前</td>
\r
1110 <dt class="ro">skinid</dt>
\r
1111 <dd>削除されるスキンID</dd>
\r
1115 <td>PostDeleteSkin</td>
\r
1116 <td>(v2.0) スキンがデータベースから削除された直後</td>
\r
1118 <dt class="ro">skinid</dt>
\r
1119 <dd>削除されたスキンID</dd>
\r
1123 <td>PreDeleteSkinPart</td>
\r
1124 <td>スペシャルスキンパーツがデータベースから削除される直前</td>
\r
1126 <dt class="ro">skinid</dt>
\r
1127 <dd>削除されるスペシャルスキンパーツが含まれるスキンのID</dd>
\r
1128 <dt class="ro">skintype</dt>
\r
1129 <dd>削除されるスペシャルスキンパーツの名前</dd>
\r
1133 <td>PostDeleteSkin</td>
\r
1134 <td>スペシャルスキンパーツがデータベースから削除された直後</td>
\r
1136 <dt class="ro">skinid</dt>
\r
1137 <dd>削除されたスペシャルスキンパーツが含まれるスキンのID</dd>
\r
1138 <dt class="ro">skintype</dt>
\r
1139 <dd>削除されたスペシャルスキンパーツの名前</dd>
\r
1143 <td>PreDeletePlugin</td>
\r
1144 <td>(v2.0) プラグインがデータベースから削除される直前</td>
\r
1146 <dt class="ro">plugid</dt>
\r
1147 <dd>削除されるプラグインID</dd>
\r
1151 <td>PostDeletePlugin</td>
\r
1152 <td>(v2.0) プラグインがデータベースから削除された直後</td>
\r
1154 <dt class="ro">plugid</dt>
\r
1155 <dd>削除されたプラグインID</dd>
\r
1159 <td>PreDeleteBan</td>
\r
1160 <td>(v2.0) 禁止IPがデータベースから削除される直前</td>
\r
1162 <dt class="ro">blogid</dt>
\r
1163 <dd>禁止IPが削除されるblogのID</dd>
\r
1164 <dt class="ro">iprange</dt>
\r
1165 <dd>禁止されたIPレンジ</dd>
\r
1169 <td>PostDeleteBan</td>
\r
1170 <td>(v2.0) 禁止IPがデータベースから削除された直後</td>
\r
1172 <dt class="ro">blogid</dt>
\r
1173 <dd>禁止IPが削除されたblogのID</dd>
\r
1174 <dt class="ro">iprange</dt>
\r
1175 <dd>禁止されたIPレンジ</dd>
\r
1179 <td>PreAddCategory</td>
\r
1180 <td>(v2.0) 新しいカテゴリーがデータベースに生成される直前</td>
\r
1182 <dt class="ref obj">blog</dt>
\r
1183 <dd><code>BLOG</code> オブジェクトの参照</dd>
\r
1184 <dt class="ref">name</dt>
\r
1185 <dd>新しいカテゴリー名</dd>
\r
1186 <dt class="ref">description</dt>
\r
1187 <dd>新しいカテゴリーの説明</dd>
\r
1191 <td>PostAddCategory</td>
\r
1192 <td>(v2.0) 新しいカテゴリーがデータベースに生成された直後</td>
\r
1194 <dt class="ref obj">blog</dt>
\r
1195 <dd><code>BLOG</code> オブジェクトへの参照</dd>
\r
1196 <dt class="ro">name</dt>
\r
1197 <dd>新しいカテゴリー名</dd>
\r
1198 <dt class="ro">description</dt>
\r
1199 <dd>新しいカテゴリーの説明</dd>
\r
1200 <dt class="ro">catid</dt>
\r
1201 <dd>新しいカテゴリー ID</dd>
\r
1205 <td>PreAddBlog</td>
\r
1206 <td>(v2.0) 新しいblogが生成される直前</td>
\r
1208 <dt class="ref">name</dt>
\r
1209 <dd>新しい blog名</dd>
\r
1210 <dt class="ref">shortname</dt>
\r
1211 <dd>新しい blogの短縮名</dd>
\r
1212 <dt class="ref">timeoffset</dt>
\r
1213 <dd>新しい blogのタイムオフセット</dd>
\r
1214 <dt class="ref">description</dt>
\r
1215 <dd>新しい blogの説明</dd>
\r
1216 <dt class="ref">defaultskin</dt>
\r
1217 <dd>新しいblogのデフォルトスキンのID</dd>
\r
1221 <td>PostAddBlog</td>
\r
1222 <td>(v2.0) 新しいblogが生成された直後</td>
\r
1224 <dt class="ref obj">blog</dt>
\r
1225 <dd>新しい<code>BLOG</code> オブジェクト</dd>
\r
1229 <td>PreAddPlugin</td>
\r
1230 <td>(v2.0) プラグインが追加される直前</td>
\r
1232 <dt class="ref">file</dt>
\r
1233 <dd>新しいプラグインのファイル名</dd>
\r
1237 <td>PostAddPlugin</td>
\r
1238 <td>(v2.0) プラグインが追加された直後</td>
\r
1240 <dt class="ref obj">plugin</dt>
\r
1241 <dd>新しく追加されたプラグインのオブジェクト</dd>
\r
1245 <td>PreAddTeamMember</td>
\r
1246 <td>(v2.0) メンバーがblogチームに追加される直前</td>
\r
1248 <dt class="ref obj">blog</dt>
\r
1249 <dd><code>BLOG</code> オブジェクト</dd>
\r
1250 <dt class="ref obj">member</dt>
\r
1251 <dd><code>MEMBER</code> オブジェクト</dd>
\r
1252 <dt class="ref">admin</dt>
\r
1253 <dd>新しく追加されたメンバーが管理権限を持っているかどうかを示すブール値</dd>
\r
1257 <td>PostAddTeamMember</td>
\r
1258 <td>(v2.0) メンバーがblogチームに追加された直後</td>
\r
1260 <dt class="ref obj">blog</dt>
\r
1261 <dd><code>BLOG</code> オブジェクト</dd>
\r
1262 <dt class="ref obj">member</dt>
\r
1263 <dd><code>MEMBER</code> オブジェクト</dd>
\r
1264 <dt class="ro">admin</dt>
\r
1265 <dd>新しく追加されたメンバーが管理権限を持っているかどうかを示すブール値</dd>
\r
1269 <td>PreAddTemplate</td>
\r
1270 <td>(v2.0) 新しいテンプレートが生成される直前(注:テンプレートが複製されたときも呼ばれる)</td>
\r
1272 <dt class="ref">name</dt>
\r
1273 <dd>新しいテンプレート名</dd>
\r
1274 <dt class="ref">description</dt>
\r
1275 <dd>新しいテンプレートの説明</dd>
\r
1279 <td>PostAddTemplate</td>
\r
1280 <td>(v2.0) 新しいテンプレートが生成された直後</td>
\r
1282 <dt class="ro">name</dt>
\r
1283 <dd>新しいテンプレート名</dd>
\r
1284 <dt class="ro">description</dt>
\r
1285 <dd>新しいテンプレートの説明</dd>
\r
1286 <dt class="ro">templateid</dt>
\r
1287 <dd>新しいテンプレートID</dd>
\r
1291 <td>PreAddSkin</td>
\r
1292 <td>(v2.0) 新しいスキンが生成される直前(注:スキンが複製されたときも呼ばれる)</td>
\r
1294 <dt class="ref">name</dt>
\r
1296 <dt class="ref">description</dt>
\r
1297 <dd>新しいスキン名の説明</dd>
\r
1298 <dt class="ref">type</dt>
\r
1299 <dd>スキンのコンテントタイプ</dd>
\r
1300 <dt class="ref">includeMode</dt>
\r
1301 <dd>新しいスキンのインクルードモード</dd>
\r
1302 <dt class="ref">includePrefix</dt>
\r
1303 <dd>新しいスキンのインクルードプレフィックス</dd>
\r
1307 <td>PostAddSkin</td>
\r
1308 <td>(v2.0) 新しいスキンが生成された直後</td>
\r
1310 <dt class="ro">name</dt>
\r
1312 <dt class="ro">description</dt>
\r
1313 <dd>新しいスキンの説明</dd>
\r
1314 <dt class="ro">type</dt>
\r
1315 <dd>スキンのコンテントタイプ</dd>
\r
1316 <dt class="ro">includeMode</dt>
\r
1317 <dd>新しいスキンのインクルードモード</dd>
\r
1318 <dt class="ro">includePrefix</dt>
\r
1319 <dd>新しいスキンのインクルードプレフィックス</dd>
\r
1320 <dt class="ro">skinid</dt>
\r
1325 <td>PreAddBan</td>
\r
1326 <td>(v2.0) 新しい禁止IPが追加される直前</td>
\r
1328 <dt class="ref">blogid</dt>
\r
1330 <dt class="ref">iprange</dt>
\r
1331 <dd>禁止されたIPレンジ</dd>
\r
1332 <dt class="ref">reason</dt>
\r
1333 <dd>禁止された理由を記述したテキストメッセージ</dd>
\r
1337 <td>PostAddBan</td>
\r
1338 <td>(v2.0) 新しい禁止IPが追加された直後</td>
\r
1340 <dt class="ro">blogid</dt>
\r
1342 <dt class="ro">iprange</dt>
\r
1343 <dd>禁止されたIPレンジ</dd>
\r
1344 <dt class="ro">reason</dt>
\r
1345 <dd>禁止された理由を記述したテキストメッセージ</dd>
\r
1350 <td>PreMoveItem</td>
\r
1351 <td>(v2.0) アイテムが他のblog/カテゴリーに移される直前</td>
\r
1353 <dt class="ref">itemid</dt>
\r
1355 <dt class="ref">destblogid</dt>
\r
1356 <dd>移動先のblogID</dd>
\r
1357 <dt class="ref">destcatid</dt>
\r
1358 <dd>移動先のカテゴリーID</dd>
\r
1362 <td>PostMoveItem</td>
\r
1363 <td>(v2.0) アイテムが他のblog/カテゴリーに移された直後</td>
\r
1365 <dt class="ro">itemid</dt>
\r
1367 <dt class="ro">destblogid</dt>
\r
1368 <dd>新しいblogID</dd>
\r
1369 <dt class="ro">destcatid</dt>
\r
1370 <dd>新しいカテゴリーID</dd>
\r
1374 <td>PreMoveCategory</td>
\r
1375 <td>(v2.0) カテゴリーが他のblogに移される直前</td>
\r
1377 <dt class="ref">catid</dt>
\r
1379 <dt class="ref obj">sourceblog</dt>
\r
1380 <dd>移動元の<code>BLOG</code> オブジェクト</dd>
\r
1381 <dt class="ref obj">destblog</dt>
\r
1382 <dd>移動先の<code>BLOG</code> オブジェクト</dd>
\r
1386 <td>PostMoveCategory</td>
\r
1387 <td>(v2.0) カテゴリーが他のblogに移された直後</td>
\r
1389 <dt class="ro">catid</dt>
\r
1391 <dt class="ref obj">sourceblog</dt>
\r
1392 <dd>移動元の<code>BLOG</code> オブジェクト</dd>
\r
1393 <dt class="ref obj">destblog</dt>
\r
1394 <dd>移動先の<code>BLOG</code> オブジェクト</dd>
\r
1398 <td>MemberSettingsFormExtras</td>
\r
1399 <td><span style="display:block;margin-bottom:1.5em;">(v2.0) メンバー設定ページにフォームを追加可能</span>
\r
1400 あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。
\r
1401 <pre class="example"><code><h4>プラグイン名</h4>
\r
1402 <form method="post" action="..."><p>
\r
1404 </p></form></code></pre>
\r
1405 このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。
\r
1409 <dt class="ref obj">member</dt>
\r
1410 <dd><code>MEMBER</code> オブジェクトへの参照</dd>
\r
1414 <td>GeneralSettingsFormExtras</td>
\r
1415 <td><span style="display:block;margin-bottom:1.5em;">(v2.0) 一般設定ページにフォームを追加可能</span>
\r
1416 あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。
\r
1417 <pre class="example"><code><h4>プラグイン名</h4>
\r
1418 <form method="post" action="..."><p>
\r
1420 </p></form></code></pre>
\r
1421 このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。
\r
1427 <td>AdminPrePageHead</td>
\r
1428 <td>(v2.5) 管理画面で、ページヘッドを出力する直前。このイベントはヘッド領域にスクリプトやCSSを追加するのに用いられます。</td>
\r
1430 <dt class="ref">extrahead</dt>
\r
1431 <dd>HTMLページのヘッド領域に埋め込まれる追加情報。ここに追加したいものを入れてください。</dd>
\r
1432 <dt class="ro">action</dt>
\r
1433 <dd>現在実行されているアクション、またはページタイプ</dd>
\r
1437 <td>AdminPrePageFoot</td>
\r
1438 <td>(v2.5) 管理画面で、ページフッターを出力する直前。</td>
\r
1440 <dt class="ro">action</dt>
\r
1441 <dd>現在実行されているアクション、またはページタイプ</dd>
\r
1445 <td>PreSendContentType</td>
\r
1446 <td>(v2.5) HTTPヘッダーにコンテントタイプがセットされる直前</td>
\r
1448 <dt class="ref">contentType</dt>
\r
1449 <dd>コンテントタイプ(<code>application/xhtml+xml</code>など)</dd>
\r
1450 <dt class="ref">charset</dt>
\r
1451 <dd>キャラクターセット</dd>
\r
1452 <dt class="ro">pageType</dt>
\r
1453 <dd>表示するページの種類を示す文字列:<code>skin</code> (スキンタイプ), <code>media</code> (メディアライブラリ), <code>admin-<em>action</em></code> (管理エリア), <code>bookmarklet-<em>action</em></code> (ブックマークレット)</dd>
\r
1457 <td>QuickMenu</td>
\r
1458 <td>(v2.5) 管理エリアのクイックメニューの一番下。そこへのプラグイン登録に利用されます。登録するにはoptionsに連想配列を入れます。実装例が<a href="#admin">プラグイン管理エリアを作る</a>のセクションにあります。</td>
\r
1460 <dt class="ref">options</dt>
\r
1465 <td>BookmarkletExtraHead</td>
\r
1466 <td>(v2.5) ブックマークレット XHTMLコードのヘッド領域内。</td>
\r
1468 <dt class="ref">extrahead</dt>
\r
1469 <dd>XHTMLコードのヘッド領域に埋め込まれる追加情報。ここに追加したいものを入れてください。</dd>
\r
1473 <td>FormExtra</td>
\r
1474 <td>(v3.2) このイベントは、プラグインがコメント、メンバー間メール、認証フォームのいずれかのフォーム内に追加フィールドを挿入するときに使います。フォーム処理の際に発生する <code>ValidateForm</code> イベントに対応します。</td>
\r
1476 <dt class="ro">type</dt>
\r
1477 <dd>イベントを発生させるフォームタイプ
\r
1479 <li><code>activation</code></li>
\r
1480 <li><code>additemform</code> (注:これは管理画面のアイテム追加フォームではない)</li>
\r
1481 <li><code>commentform-loggedin</code></li>
\r
1482 <li><code>commentform-notloggedin</code></li>
\r
1483 <li><code>membermailform-loggedin</code></li>
\r
1484 <li><code>membermailform-notloggedin</code></li>
\r
1487 <dt class="ro obj">member</dt>
\r
1488 <dd><code>type</code> が <code>activation</code>のとき、このフィールドは認証メンバーの詳細情報を含みます</dd>
\r
1492 <td>ValidateForm</td>
\r
1493 <td>(v3.2) コメント、メンバー間メール、アカウント認証のいずれかが処理されるときに呼ばれます。プラグインはこれで各データの評価を実行でき、もし不具合があれば処理を中断できます。<code>FormExtra</code> と共に使うとフォームにフィールドを追加できます。</td>
\r
1495 <dt class="ro">type</dt>
\r
1498 <li><code>membermail</code></li>
\r
1499 <li><code>comment</code></li>
\r
1500 <li><code>activation</code></li>
\r
1503 <dt class="ref">error</dt>
\r
1504 <dd>フォーム処理をストップするときに、<code>error</code> フィールドに空でないエラーメッセージを記入します。このエラーメッセージはユーザー側に表示されます。</dd>
\r
1505 <dt class="ref">comment</dt>
\r
1506 <dd>コメントデータの連想配列(コメントフォームのときのみ)</dd>
\r
1507 <dt class="ref">spamcheck</dt>
\r
1508 <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返される連想配列(コメントフォームのときのみ)</dd>
\r
1509 <dt class="ro obj">member</dt>
\r
1510 <dd>認証フォームのとき、認証中のメンバー情報を含みます。</dd>
\r
1515 <td>(v3.22)NucleusのコアでURLからアイテムやカテゴリのIDを読み取る前。プラグインはこのイベントを使ってURLを解釈します</td>
\r
1517 <dt class="ro">type</dt>
\r
1518 <dd>FancyURLの仮想ディレクトリ(拡張子無しファイル)のファイル名(item, blog, ...)</dd>
\r
1519 <dt class="ro">info</dt>
\r
1520 <dd>解決される前のURL(この名前は以前の変数名である<code>pathinfo</code>から来ています).</dd>
\r
1521 <dt class="ref">complete</dt>
\r
1522 <dd>プラグインがURLを解釈し終わるとこれが<strong>true</strong>にセットされます。<strong>false</strong>の場合はプラグインはURLを解釈していません。</dd>
\r
1526 <td>GenerateURL</td>
\r
1527 <td>(v3.22)URLが自動生成される前。このイベントを使って独自のURLを生成する事が出来ます。</td>
\r
1529 <dt class="ro">type</dt>
\r
1530 <dd>生成するURLのタイプ(item, blog, ...)</dd>
\r
1531 <dt class="ro">params</dt>
\r
1532 <dd>生成するURLに付加するパラメータ</dd>
\r
1533 <dt class="ref">completed</dt>
\r
1534 <dd>プラグインはURLを生成し終わるとこれを<strong>true</strong>にセットしてURLを返します。<strong>false</strong>の場合はプラグインはURLを生成していません。</dd>
\r
1535 <dt class="ref">url</dt>
\r
1536 <dd>プラグインが生成したURLを格納する為の空の変数</dd>
\r
1540 <td>SpamCheck</td>
\r
1541 <td>(v3.3) 新しいコメントが追加されるときに呼ばれます。アンチスパムのプラグインはこのイベントを使ってコメントがスパムかどうかマークを付けられます。<code>SpamCheck</code>イベントの詳しい説明は別の文書を参照のこと(<a href='http://wakka.xiffy.nl/spamcheck_api'>SpamCheck API 2.0</a>)</td>
\r
1543 <dt class="ref">spamcheck</dt>
\r
1544 <dd>spamcheckのデータ構造(連想配列)</dd>
\r
1548 <td>PreMediaUpload</td>
\r
1549 <td>(v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれる前。</td>
\r
1551 <dt class="ref">collection</dt>
\r
1552 <dd>アップロードされたファイルが格納されるべき「コレクション」</dd>
\r
1553 <dt class="ro">uploadfile</dt>
\r
1554 <dd>テンポラリディレクトリに狩り沖されているアップロードされたファイルのファイル名</dd>
\r
1555 <dt class="ref">filename</dt>
\r
1556 <dd>最終的に保存されるファイル名</dd>
\r
1560 <td>PostMediaUpload</td>
\r
1561 <td>(v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれた後。</td>
\r
1563 <dt class="ro">collection</dt>
\r
1564 <dd>アップロードされたファイルが格納された「コレクション」</dd>
\r
1565 <dt class="ro">mediadir</dt>
\r
1566 <dd>アップロードされたファイルが保存されたメディアディレクトリ</dd>
\r
1567 <dt class="ro">filename</dt>
\r
1568 <dd>保存されたファイル名</dd>
\r
1573 <td>(v3.3)「ブログの設定」で「更新時にweblogsアップデート通知サービスへPingを送りますか?」が「はい」に設定されている時に限り、新しいアイテムを追加した時に呼び出されます(このイベントに対応しているプラグインがインストールされている時に限る)。このイベントはPing送信プラグインで各種「ブログ検索サービス」へ更新pingを送信します(例えば<a href="http://blogsearch.google.co.jp/">Googleブログ検索</a>など)</td>
\r
1575 <dt class="ref">blogid</dt>
\r
1576 <dd>アイテムが追加されたブログのID</dd>
\r
1580 <td>JustPosted</td>
\r
1581 <td>(v3.3)投稿された未来の日付のアイテムの設定時刻が来た時。このイベントはページの表示が完了した後に発生条件をチェックします。</td>
\r
1583 <dt class="ref">blogid</dt>
\r
1584 <dd>未来の日付のアイテムの設定時刻が来たブログのID</dd>
\r
1588 <td>RegistrationFormExtraFields</td>
\r
1589 <td>(v3.40) createaccount.php からビジターに表示されるアカウント作成フォームが表示され、FormExtra イベントが起きる前。プラグインはこのイベントによって、アカウント作成フォームに独自のフィールドを付け加える事が出来ます。PostRegister イベントに同時に登録すると、付け加えたフィールドの値を評価する事が出来る様になります。渡されるパラメータは、付け加えられたフィールドを、元々のフィールドと違和感無く表示させる為に使用されます。このイベントの使用例はNP_Profileプラグインを参照してください。</td>
\r
1591 <dt class="ro">type</dt>
\r
1592 <dd>アカウント作成フォームのタイプ。通常は <code>createaccount.php</code>。</dd>
\r
1593 <dt class="ro">prelabel</dt>
\r
1594 <dd>追加フィールドの「ラベル」の<strong>前に</strong>挿入される HTML コード</dd>
\r
1595 <dt class="ro">postlabel</dt>
\r
1596 <dd>追加フィールドの「ラベル」の<strong>後に</strong>挿入される HTML コード</dd>
\r
1597 <dt class="ro">prefield</dt>
\r
1598 <dd>追加フィールドの「入力フィールド」の<strong>前に</strong>挿入される HTML コード</dd>
\r
1599 <dt class="ro">postfield</dt>
\r
1600 <dd>追加フィールドの「入力フィールド」の<strong>後に</strong>挿入される HTML コード</dd>
\r
1604 <td>TemplateExtraFields</td>
\r
1605 <td>(v3.40) テンプレートが編集・更新される時。プラグイン製作者がコアのテンプレートシステムをより使いやすくするために、テンプレートにフィールドを追加する事が出来ます。プラグイン作者は追加するテンプレートフィールドの初期状態をプラグインオプションに保存し、そこで使用するテンプレート変数についてのドキュメントを書くことが要求されます。また、このイベントに関するサンプルプラグインが、フォーラムの<a href="http://japan.nucleuscms.org/bb/viewtopic.php?p=24401#24401" title="Sample">新API「TemplateExtraFields」を使ったプラグインの見本</a>(本家フォーラムのスレッドは <a href="http://forum.nucleuscms.org/viewtopic.php?p=87672#87672" title="Sample">Skin specific values for Plugins</a>)にあります。</td>
\r
1607 <dt class="ref">fields</dt>
\r
1608 <dd>プラグイン名をキーにした連想配列。配列の内容は、テンプレートのフィールド名をキーにした連想配列で、その値はフォームのフィールドに表示されるラベル。フィールド名は全て英数小文字で、フィールド名の重複を避けるためにプラグイン名を含んでいる事が好ましい。</dd>
\r
1612 <td>PreArchiveListItem</td>
\r
1613 <td>(v3.40) アーカイブリストが表示される前。アーカイブリストを表示するために使われたテンプレートのアーカイブリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>
\r
1615 <dt class="ref">listitem</dt>
\r
1616 <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>
\r
1620 <td>PreCategoryListItem</td>
\r
1621 <td>(v3.40) カテゴリーリストが表示される前。カテゴリーリストを表示するために使われたテンプレートのカテゴリーリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>
\r
1623 <dt class="ref">listitem</dt>
\r
1624 <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>
\r
1628 <td>PreBlogListItem</td>
\r
1629 <td>(v3.40) ブログリストが表示される前。ブログリストを表示するために使われたテンプレートのブログリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>
\r
1631 <dt class="ref">listitem</dt>
\r
1632 <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>
\r
1636 <td>PreTemplateRead</td>
\r
1637 <td>(v3.40) テンプレートが読み込まれる直前。読み込むテンプレートを変更する事が出来ます。NP_MultiLanguage はこのイベントを使用しています。</td>
\r
1639 <dt class="ref">name</dt>
\r
1640 <dd>呼び出されるテンプレートの名前</dd>
\r
1644 <td>CustomLogin</td>
\r
1645 <td>(v3.40) Nucleus にログインする直前。ログインの手順をカスタマイズできます。外部認証を簡素化し、ログイン ID にメールアドレス等を使用出来る様になります。</td>
\r
1647 <dt class="ref">login</dt>
\r
1648 <dd>ユーザーが「ログインID」フィールドに入力した文字列。Nucleus のメンバーとして登録されているなら、プラグイン側で外部認証された「ログインID」と Nucleus のそれを紐つけるべきです。そうでないとクッキーがセットされず、ページを移動するごとにログアウトしてしまいます。</dd>
\r
1649 <dt class="ref">password</dt>
\r
1650 <dd>ユーザーが「パスワード」フィールドに入力した文字列。</dd>
\r
1651 <dt class="ref">success</dt>
\r
1652 <dd>認証が成功したかどうかのフラグ。「1」が成功。失敗だと「0」。初期値は「0」。プラグイン側でセットします。</dd>
\r
1653 <dt class="ref">allowlocal</dt>
\r
1654 <dd>整数値。プラグイン側で外部認証に失敗した後に、Nucleus のログインを試すかどうかのフラグ。「1」が試す「0」が試さない。初期値は「1」プラグイン側でセットします。</dd>
\r
1658 <td>PrePasswordSet</td>
\r
1659 <td>(v3.50)パスワードを設定する時に呼び出されます。パスワードの強度をプラグインで設定することが出来ます。</td>
\r
1661 <dt class="ro">password</dt>
\r
1662 <dd>ユーザーが入力したパスワード文字列</dd>
\r
1663 <dt class="ref">errormessage</dt>
\r
1664 <dd>エラーメッセージ。エラーが起きない場合は空白に設定します。</dd>
\r
1665 <dt class="ref">valid</dt>
\r
1666 <dd>設定しようとしているパスワードが妥当かどうかのフラグ。デフォルトは「真」。プラグインはこの値の妥当性を審査するべきです。</dd>
\r
1670 <td>PostParseURL</td>
\r
1671 <td>(v3.60) URLが完全にパースされた後( globalfunctions の ParseURL による)。selector() が実行されたりpath関連のglobal変数に何かがセットされる前にglobal変数を調整するのに便利。</td>
\r
1673 <dt class="ro">type</dt>
\r
1674 <dd>生成するURLのタイプ(item, blog, ...)</dd>
\r
1675 <dt class="ro">info</dt>
\r
1676 <dd>解決される前のURL(この名前は以前の変数名である<code>pathinfo</code>から来ています).</dd>).</dd>
\r
1681 <td>MediaUploadFormExtras</td>
\r
1682 <td>(v3.60) Nucleusメディアマネージャのファイルアップロードページにフィールドを追加します。すべての出力が正しいXHTML 1.0 でなければなりません。PreMediaUpload イベントに同時に登録し、requestVar()を使って追加したフィールドから値を得ます。</td>
\r
1683 <td>データは渡されません。</td>
\r
1754 <h1>オプションを保存する<a id="options" name="options" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
1756 <p>プラグインに簡単にオプションを登録・取得できるように一連のメソッドが用意されています。これらのオプションは直接Nucleusの管理エリアで編集でき、プラグイン自身の管理エリアを用意する必要もなく、PHPファイルそのものの中にオプションの値を書き込まずにすみます。</p>
\r
1758 <p>オプションは異なったコンテクストで利用可能です。</p>
\r
1761 <li><strong>グローバルオプション</strong>:管理エリアのプラグインセクションで編集可能</li>
\r
1762 <li><strong>blogオプション</strong>:blog設定ページで編集可能</li>
\r
1763 <li><strong>カテゴリーオプション</strong>:blog設定ページ(のカテゴリー編集ページ)で編集可能</li>
\r
1764 <li><strong>メンバーオプション</strong>:メンバー編集ページで編集可能</li>
\r
1765 <li><strong>アイテムオプション</strong>:アイテムの追加、およびアイテムの編集ページで編集可能</li>
\r
1770 <p>オプションにはいくつかのタイプが提供されています。</p>
\r
1774 <dd>シンプルなテキスト</dd>
\r
1776 <dd>'yes'か'no'どちらか(編集画面ではラジオボタンとして表示されます)</dd>
\r
1778 <dd>テキストフィールド (編集画面では伏字で表示されます)</dd>
\r
1779 <dt>textarea (v2.2)</dt>
\r
1780 <dd>複数行のテキストフィールド</dd>
\r
1781 <dt>select (v2.2)</dt>
\r
1782 <dd>ドロップダウンメニュー。次のような形式の追加情報が必要です: Option 1|value1|Option 2|value2|Option 3|value3
\r
1788 <p>Nucleus v3.2よりオプション・メタデータを用いて、オプションタイプを正しい値を受け取れるように制限できるようになりました。このメタデータは <code>$typeExtras</code>フィールドにセミコロン区切りのリストで保存されます。注:selectオプションでは、selectリストは<code>$typeExtras</code>のなかで一番最初でなければいけません。</p>
\r
1790 <table summary="メタデータ"><tr>
\r
1791 <th abbr="key">キー</th>
\r
1792 <th abbr="desc">説明</th>
\r
1794 <td><code>datatype</code></td>
\r
1795 <td>Nucleus本体に、どのデータ型を使いたいかという追加情報を与えます。現在は '<code>numerical</code>' のみ利用できます。 '<code>numerical</code>' を指定することでNucleusは数値情報のみを受け付けます(クライアントサイド・サーバサイド両方でチェック) ('<code>select</code>' と '<code>text</code>'のオプションタイプで利用できます)</td>
\r
1797 <td><code>access</code></td>
\r
1798 <td>'<code>readonly</code>'にセットすることで、オプションを編集不可能にします('<code>text</code>' と '<code>textarea</code>'のオプションタイプで利用できます)<br />
\r
1799 '<code>hidden</code>'を使うと、利用者側にそのオプションの存在を完全に隠蔽します('<code>text</code>'のオプションタイプで利用できます)</td>
\r
1803 <pre class="example"><code>// 数値のみを受け付けるテキストオプションを作成
\r
1804 $this->createBlogOption('FooBar', 'foobar', 'text', '0', 'datatype=numerical');
\r
1805 // 数値のみを受け付けるセレクトオプションを作成
\r
1806 $this->createItemOption('FooBar', 'foobar', 'select', '0', '0|0|1|1|2|2;datatype=numerical');
\r
1807 // 編集不可能なテキストエリアオプションを作成
\r
1808 $this->createOption('FooBar', 'foobar', 'textarea', 'This textarea is readonly', 'access=readonly');
\r
1814 <li>オプション名は最大20文字です。</li>
\r
1815 <li>オプションの説明文は最大255文字です。</li>
\r
1816 <li>オプションの値は制限ありません(v2.2より前のバージョンでは128文字の制限がありました)</li>
\r
1817 <li>'=', '|', ';' のキャラクターはセレクトオプション用のセレクトリストやオプション・メタデータ中で使用することはできません。</li>
\r
1822 <h3>createOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>
\r
1824 <p><strong>グローバル</strong>なコンテクストで新しいオプションを生成します。</p>
\r
1826 <table summary="createOption"><tr>
\r
1827 <th abbr="param">パラメータ</th>
\r
1828 <th abbr="value">値</th>
\r
1834 <td>オプション編集画面で表示される説明文</td>
\r
1837 <td>オプションタイプ(前出)</td>
\r
1839 <td>$defValue</td>
\r
1842 <td>$typeExtras</td>
\r
1843 <td>オプションタイプの追加情報(前出)</td>
\r
1846 <h3>[v2.2] createBlogOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>
\r
1848 <p><strong>blog</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>
\r
1850 <h3>[v2.2] createCategoryOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>
\r
1852 <p><strong>カテゴリー</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>
\r
1854 <h3>[v2.2] createMemberOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>
\r
1856 <p><strong>メンバー</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>
\r
1858 <h3>[v3.2] createItemOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>
\r
1860 <p><strong>アイテム</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>
\r
1862 <h3>setOption($name, $value)</h3>
\r
1864 <p>すでにデータベースに存在するオプションの値を変更します。</p>
\r
1866 <table summary="setOption"><tr>
\r
1867 <th abbr="param">パラメータ</th>
\r
1868 <th abbr="value">値</th>
\r
1877 <h3>[v2.2] setBlogOption($blogid, $name, $value)</h3>
\r
1879 <p>blogオプションの値を変更します。<code>blogid</code>属性はどのblogでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>
\r
1881 <h3>[v2.2] setCategoryOption($catid, $name, $value)</h3>
\r
1883 <p>カテゴリーオプションの値を変更します。<code>catid</code>属性はどのカテゴリーでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>
\r
1885 <h3>[v2.2] setMemberOption($memberid, $name, $value)</h3>
\r
1887 <p>メンバーオプションの値を変更します。<code>memberid</code>属性はどのメンバーでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>
\r
1889 <h3>[v3.2] setItemOption($itemid, $name, $value)</h3>
\r
1891 <p>アイテムオプションの値を変更します。<code>itemid</code>属性はどのアイテムでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>
\r
1893 <h3>getOption($name)</h3>
\r
1895 <p>データベース内のオプションの値を返します。</p>
\r
1897 <table summary="getOption"><tr>
\r
1898 <th abbr="param">パラメータ</th>
\r
1899 <th abbr="value">値</th>
\r
1905 <h3>[v2.2] getBlogOption($blogid, $name)</h3>
\r
1907 <p>blogオプションの値を返します。<code>blogid</code>属性は値がリスエストされたblogを示します(その他のオプション:<code>getOption</code>を参照)。</p>
\r
1909 <h3>[v2.2] getCategoryOption($catid, $name)</h3>
\r
1911 <p>カテゴリーオプションの値を返します。<code>catid</code>属性は値がリスエストされたカテゴリーを示します(その他のオプション:<code>getOption</code>を参照)。</p>
\r
1913 <h3>[v2.2] getMemberOption($memberid, $name)</h3>
\r
1915 <p>メンバーオプションの値を返します。<code>memberid</code>属性は値がリスエストされたメンバーを示します(その他のオプション:<code>getOption</code>を参照)。</p>
\r
1917 <h3>[v3.2] getItemOption($itemid, $name)</h3>
\r
1919 <p>アイテムオプションの値を返します。<code>itemid</code>属性は値がリスエストされたアイテムを示します(その他のオプション:<code>getOption</code>を参照)。</p>
\r
1921 <h3>deleteOption($name)</h3>
\r
1923 <p>データベースからオプションを削除します。</p>
\r
1925 <table summary="deleteOption"><tr>
\r
1926 <th abbr="param">パラメータ</th>
\r
1927 <th abbr="value">値</th>
\r
1933 <h3>[v2.2] deleteBlogOption($name)</h3>
\r
1935 <p>blogオプションを削除します(<code>deleteOption</code>を参照)。</p>
\r
1937 <h3>[v2.2] deleteCategoryOption($name)</h3>
\r
1939 <p>カテゴリーオプションを削除します(<code>deleteOption</code>を参照)。</p>
\r
1941 <h3>[v2.2] deleteMemberOption($name)</h3>
\r
1943 <p>メンバーオプションを削除します(<code>deleteOption</code>を参照)。</p>
\r
1945 <h3>[v3.2] deleteItemOption($name)</h3>
\r
1947 <p>アイテムオプションを削除します(<code>deleteOption</code>を参照)。</p>
\r
1949 <h3>[v2.2] getAllBlogOptions($name)</h3>
\r
1951 <p>与えられたblogオプションの全ての値を返します。結果は存在するblogidごとの連想配列です。</p>
\r
1953 <h3>[v2.2] getAllCategoryOptions($name)</h3>
\r
1955 <p>与えられたカテゴリーオプションの全ての値を返します。結果は存在するcatidごとの連想配列です。</p>
\r
1957 <h3>[v2.2] getAllMemberOptions($name)</h3>
\r
1959 <p>与えられたメンバーオプションの全ての値を返します。結果は存在するmemberidごとの連想配列です。</p>
\r
1961 <h3>[v3.2] getAllItemOptions($name)</h3>
\r
1963 <p>与えられたアイテムオプションの全ての値を返します。結果は存在するitemidごとの連想配列です。</p>
\r
1965 <h3>[v3.2] getBlogOptionTop($name, $amount = 10, $sort = 'desc')</h3>
\r
1967 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのblogid ('id') の値 ('value') を持つ配列になっています。</p>
\r
1969 <table summary="getOption"><tr>
\r
1970 <th abbr="param">パラメータ</th>
\r
1971 <th abbr="value">値</th>
\r
1977 <td>必要なオプション数</td>
\r
1980 <td>昇順 ('asc') か降順 ('desc') で並べ替え</td>
\r
1983 <h3>[v3.2] getMemberOptionTop($name, $amount = 10, $sort = 'desc')</h3>
\r
1985 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのメンバーID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>
\r
1987 <h3>[v3.2] getCategoryOptionTop($name, $amount = 10, $sort = 'desc')</h3>
\r
1989 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのカテゴリーID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>
\r
1991 <h3>[v3.2] getItemOptionTop($name, $amount = 10, $sort = 'desc')</h3>
\r
1993 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのアイテムID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>
\r
1995 <div class="note">
\r
1996 <strong>注:</strong> プラグインクラス内のコンストラクタから、これらのファンクションを呼ぶことはできません。プラグインがロードされた後にこれらを実行したいときは、かわりに<code>init()</code>メソッド内に置きます。
\r
1999 <h1>データベース・テーブル<a id="tables" name="tables" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2001 <h2>Nucleusテーブルへのアクセス</h2>
\r
2003 <p>v2.0まで、Nucleusテーブルへのアクセスは単に<code>nucleus_</code>と名づけられたテーブルに対してSQL命令を実行するだけのものでした。Nucleusのバージョン2.2以降はカスタム・テーブル名を利用できるようになったため、プラグイン開発に若干注意する必要があります。</p>
\r
2004 <p>v3.5でNucleusはPDO等MySQL以外のデータベースハンドラのサポートをするようになりました。この機能はベータ実装ではありますが、プラグイン開発者はデータベースの呼び出しに使用する関数の「sql_*」への書き換えを始めてください。
\r
2005 基本的に、使用している全ての「mysql_*」関数を「sql_*」に置き換える必要があります。たとえば<code>mysql_fetch_assoc($result)</code>は<code>sql_fetch_assoc($result)</code> に置き換えになります。
\r
2006 全ての関数を書き換えたら、Sql APIが無い古いバージョンのNucleusインストールできないように、次に示すコードをプラグイン内に記述して、インストールに必要な最低バージョンを350に指定する必要があります。<br />
\r
2007 <code>function getMinNucleusVersion( return '350';)</code></p>
\r
2010 <li><code>nucleus_item</code> などの固定されたテーブル名の代わりに、テーブル名のプレフィックスを生成するために <code>sql_table('item') </code>というグローバルファンクションを利用します。</li>
\r
2011 <li><code>supportsFeature('SqlTablePrefix')</code> が呼ばれたときにプラグインが1(真)を返すようにします。これがないと、カスタムプレフィックスがセットされている場合でバージョンが2.0より大きいNucleusではプラグインをロードできません(用心のため)。</li>
\r
2012 <li>3.5以降:<code>supportsFeature('SqlApi')</code> が呼ばれたときにプラグインが1(真)を返すようにします。3.5以降のバージョンでは、データベースのバックエンドにmysqlでないものを使用している場合にプラグインをロードできなくなります(用心のため)。</li>
\r
2015 <p class="note">v2.0までのNucleusではグローバルファンクション <code>sql_table</code> は利用できないことに注意してください。もしこのメソッドを用いつつ、プラグインをv2.0以下のNucleusで動作させたい場合は、以下のコードをプラグインクラスの前に追加してください。</p>
\r
2017 <pre class="example"><code><?
\r
2019 // プラグインがNucleusバージョン2.0以下と互換性を持つために必要
\r
2020 if (!function_exists('sql_table'))
\r
2022 function sql_table($name) {
\r
2023 return 'nucleus_' . $name;
\r
2027 class NP_HelloWorld extends NucleusPlugin {
\r
2031 ?></code></pre>
\r
2035 <p>もしプラグイン独自のテーブルが必要なら、<code>install</code>メソッドの中で独自テーブルを生成し、<code>unInstall</code>メソッドの中でそれを削除するようにします。</p>
\r
2039 <li><code>nucleus_plug_<em>plugname</em></code> のように、他のプラグインと競合しないテーブル名を考えてください。カスタムプレフィックスに対応するため、テーブル名を<code>sql_table('plug_plugname')</code> で生成してください。</li>
\r
2040 <li>自分自身でデータベース接続をする必要はありません。PHPコマンド <code>mysql_query()</code> のラッパーであるNucleus関数 <code>sql_query()</code> を使ってSQL命令を実行できます。</li>
\r
2041 <li>自分でデータベース接続をする場合、後でNucleusデータベースへの接続を復元するようにしてください。自前処理の後で <code>sql_connect()</code> を呼ぶことで可能です。頻繁な再接続を避けるために、コンストラクタでそれを行うのも良いです。<code>$this- >db</code>のリンクIDを保持でき、各クエリにそれを渡すことができます。</li>
\r
2042 <li>バックアップ機能を使う時は、独自テーブルもバックアップに含めるよう、<code>getTableList()</code> を再定義してください。</li>
\r
2043 <li>ユーザーがプラグインをアップデートする時や、何らかの理由で一時的にプラグインをアンインストールしなければならない時、やプラグイン独自のテーブルの内容が失われる事があります。そうならないように、テーブルを削除するか否かをプラグインオプションで設定できるようにしておくといいでしょう。テーブルの削除をオプションでコントロールするには、install()メソッドで次のようなオプションを作成します。
\r
2044 <pre class="example"><code>$this->createOption('del_uninstall', 'Delete NP_MyPlugin data tables on uninstall?', 'yesno','no');</code></pre>
\r
2045 そしてuninstall()メソッドで、次のようにします。
\r
2046 <pre class="example"><code>if ($this->getOption('del_uninstall') == 'yes') {
\r
2047 foreach ($this->getTableList() as $table) {
\r
2048 sql_query("DROP TABLE $table");
\r
2050 }</code></pre></li>
\r
2055 <h1>プラグイン管理エリア<a id="admin" name="admin" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2057 <p>Ver2.5から、Nucleusの管理エリアに統合されたプラグイン管理エリアを作成できます。これらのページは従来のプラグイン管理ページや左側のクイックメニューからアクセスできます。</p>
\r
2061 <p>管理エリアを提供するには、次のステップが必要です。</p>
\r
2064 <li>プラグインディレクトリに<strong>プラグイン名</strong>のサブディレクトリを作ります。たとえばプラグイン名が<code>NP_PluginName</code>なら、'pluginname'です。ディレクトリ名はすべて小文字で!</li>
\r
2066 そのディレクトリで、次のような<strong>index.php</strong>を用意します。
\r
2067 <pre><code><?php
\r
2069 // if your 'plugin' directory is not in the default location,
\r
2070 // edit this variable to point to your site directory
\r
2071 // (where config.php is)
\r
2072 $strRel = '../../../';
\r
2074 include($strRel . 'config.php');
\r
2075 if (!$member->isLoggedIn())
\r
2076 doError('You\'re not logged in.');
\r
2078 include($DIR_LIBS . 'PLUGINADMIN.php');
\r
2080 // create the admin area page
\r
2081 $oPluginAdmin = new PluginAdmin('<strong>PluginName</strong>');
\r
2082 $oPluginAdmin->start();
\r
2084 echo '<h2>プラグイン名</h2>';
\r
2086 echo '<p><strong>ページ内容</strong><p>';
\r
2088 $oPluginAdmin->end();
\r
2090 ?></code></pre>
\r
2093 プラグイン側に次のコードを挿入し、クイックメニューイベントに登録します。
\r
2094 <pre><code>function event_QuickMenu(&$data) {
\r
2098 'title' => '<strong>プラグイン名</strong>',
\r
2099 'url' => $this->getAdminURL(),
\r
2100 'tooltip' => '<strong>ツールチップテキスト</strong>'
\r
2106 プラグイン側に次の関数を記述します。
\r
2107 <pre><code>function hasAdminArea()
\r
2112 <li> オプション。クイックメニュー登録のオプションを作成し、誰に表示するか制限します。<code>quickmenu</code>という<code>yesno</code>タイプのオプションがinstall()にあるとします。次のように、クイックメニュー登録の表示を最高管理者とブログ管理者に制限します。
\r
2113 <pre class="example"><code>function event_QuickMenu(&$data) {
\r
2114 // only show when option enabled
\r
2115 if ($this->getOption('quickmenu') != 'yes') return;
\r
2117 if (!$member->isAdmin() && !count($member->getAdminBlogs())) return;
\r
2118 array_push($data['options'],
\r
2119 array('title' => 'PluginName',
\r
2120 'url' => $this->getAdminURL(),
\r
2121 'tooltip' => 'Administer NP_PluginName'));
\r
2129 <li>登録できるからといって安易にクイックメニューへ登録しないこと。クイックメニューにプラグインが100個並んだりしたらかなりウンザリするでしょう。ですので、クイックメニューに登録する場合でも、クイックメニュー登録を有効・無効化するプラグインオプションを(グローバルまたはメンバーオプションで)用意することを考えてください。</li>
\r
2130 <li><code>プラグインディレクトリが nucleus/plugins/ ではない場合は、index.php内の $strRel</code> 変数は手動で書き換える必要があります。</li>
\r
2131 <li>管理エリアのアウトプットが<strong>正しいXHTML</strong>になっているか確認してください。正しくないと、MozillaなどのGeckoベースのブラウザでページ表示が崩れます。</li>
\r
2134 <h2>PluginAdmin クラス</h2>
\r
2136 <p><code>PluginAdmin</code> クラスは助けになります。これを一度生成すれば、<code>$oPluginAdmin->plugin</code> でプラグインのインスタンスにアクセスできます。</p>
\r
2138 <h1>プラグイン用ヘルプページ <a id="help" name="help" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2140 <p>Nucleus v3.2から、プラグインの機能の概要、利用できるスキン・テンプレート変数、さらに詳細な情報のありかなどを示すヘルプページを提供可能になりました。</p>
\r
2142 <p>ヘルプページは管理画面のプラグイン一覧からアクセス可能になります。</p>
\r
2145 <p>ヘルプページを提供するために、次のステップが必要です。</p>
\r
2147 <li>プラグインディレクトリに、プラグイン名をつけたサブディレクトリを作成します。ディレクトリ名は小文字であることに注意します。<a href="#admin">管理エリア</a>を作るときと同様です。</li>
\r
2148 <li>そのディレクトリの中に help.html を作り、プラグインについての文章を記述します。次の雛型からはじめると良いでしょう。
\r
2149 <pre><code><h3>プラグインの概要</h3>
\r
2151 <p>このプラグインはヘルプページがいかに機能するかを示すためだけのものです</p>
\r
2153 <h3>インストール</h3>
\r
2155 <p>これを読めてるならインストールは正しく出来てます :-)</p>
\r
2157 <h3>スキン変数</h3>
\r
2159 <p>このプラグインはただのテストケースなのでスキン・テンプレート変数はありませんが、書くとすれば。
\r
2161 <ul><li><b><%HelpPageTestCase1%></b>: なにかをする</li>
\r
2162 <li><b><%HelpPageTestCase1(foobar)%></b>: 別のなにかをする</li></ul></p>
\r
2164 <h3>サポートとバグ報告</h3>
\r
2166 <p>さらなるサポートやバグ報告のために、次のフォーラムのスレッドを利用してください。
\r
2167 <a href="http://forum.nucleuscms.org/viewtopic.php?t=<トピックID>">
\r
2168 http://forum.nucleuscms.org/viewtopic.php?t=<トピックID></a></p>
\r
2170 <h3>バージョン履歴</h3>
\r
2172 <ul><li>Version 0.1: 最初のテストケースバージョン</li>
\r
2173 <li>Version 0.0: その前のバージョン ;-)</li></ul></code></pre>
\r
2175 <li>supportsFeature('HelpPage') で0より大きい数字を返すように設定します。
\r
2176 <pre><code>function supportsFeature($what) {
\r
2187 <h1>プラグイン依存チェック <a id="dependency" name="dependency" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2189 <p>v3.2から、他のプラグインとの依存関係を宣言する新しいプラグインインターフェイスが追加されました。
\r
2190 他のプラグインの機能を必要とするプラグインに利用できます。特に依存関係が成立しなくて正しく機能しない状態を検知するときに便利です。</p>
\r
2192 <h2>この機能を利用するプラグインの書き方</h2>
\r
2194 <p>現実世界での例からはじめましょう。</p>
\r
2196 <p>NP_PageLinkList は NP_BlogWithOffset の機能を利用するため、利用者には NP_BlogWithOffset のインストール後に NP_PageLinkList をインストールさせたいとします。
\r
2197 NucleusはこのAPIによって、インストール前に依存関係を検知させる方法をプラグインに提供します。</p>
\r
2199 <p>このケースでは、NP_PageLinkList 側に NP_BlogWithOffset が必要だということを認識させるコードを埋め込みます。
\r
2200 プラグインがインストールされる際に、Nucleusコアは <code>getPluginDep()</code> というファンクションを呼び出します。
\r
2201 このファンクションは必要なプラグインのリストを返し、コアはインストール済みのプラグインをチェックして、もし依存関係に欠如があればインストールを拒否します。</p>
\r
2203 <p>必要なことは NP_PageLinkList にこのファンクションを追加する、ただそれだけです。</p>
\r
2205 <pre><code>function getPluginDep() {
\r
2206 return array('NP_BlogWithOffset');
\r
2209 <p>このプラグイン依存チェックは、他のプラグインが依存しているプラグインがアンインストールされることも防ぎます。</p>
\r
2211 <h1>プラグインの多国語化<a name="internationalization" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2213 <h2>プラグインをより多くの人に使ってもらうために</h2>
\r
2215 <p>あなたと同じ言葉を話さない世界中の人達がプラグインをより使いやすくするために、プラグインを多国語化できます。
\r
2216 少し手間は増えますが、プラグインが出力する文章を翻訳するだけで可能です。
\r
2217 以下に Nucleus のコアで用意されている標準的な手順を記載します。
\r
2221 <li><strong>プラグインを作る</strong>
\r
2223 先ずはじめに、あなたが普段使っている言葉でプラグインを作ります。プラグインが安定して動作するようになってから、言語ファイルを作成することが推奨されます。</li>
\r
2224 <li><strong>プラグインディレクトリを作る</strong>
\r
2226 作ったプラグインの名前が NP_AbcDef なら、プラグインディレクトリの名前は abcdef になります(必ず小文字を使用すること)。</li>
\r
2227 <li><strong>言語ファイルを作る</strong>
\r
2229 プラグインディレクトリに言語ファイルを作成します。言語ファイルの名前は Nucleus コアが使用しているものと同じにします。例えば、英語なら english.php。日本語の UTF-8 なら japanese-utf8.phpになります(UTF がお勧めです。参考までに日本語の EUC の場合は japanese-euc.php になります)。</li>
\r
2230 <li><strong>文を定義する</strong>
\r
2232 次のように言語ファイル内で分を定義します。
\r
2234 <pre class="example"><code><?php
\r
2235 define('_ABCDEF_MESSAGENAME', '実際のメッセージ');
\r
2237 ?></code></pre>
\r
2239 全ての文を定義する必要があります。定数は一回しか定義できないので、既に定義されているものと重複しないようにプラグインの名前をはじめにつけることが推奨されます(この例だと _ABCDEF)。</li>
\r
2240 <li><strong>文の置き換え</strong>
\r
2242 全ての文を、言語ファイルで定義した定数と置き換えます</li>
\r
2243 <li><strong>init() メソッドの編集</strong>
\r
2245 プラグイン内の init() メソッドを、次のように編集します(既に init() メソッドを定義している場合は init() メソッド内にコードを追記します)。
\r
2247 <pre class="example"><code> function init() {
\r
2248 // include language file for this plugin
\r
2249 $language = preg_replace( '#\\\\|/#', '', getLanguageName());
\r
2250 if (file_exists($this->getDirectory().$language.'.php'))
\r
2251 include_once($this->getDirectory().$language.'.php');
\r
2253 include_once($this->getDirectory().'english.php');
\r
2255 このコードは Nucleus のコアで使用されているものと同一です。</li>
\r
2257 <li><strong>言語ファイルの追加</strong>
\r
2259 「英語」が基本の言語になっていますので、「英語」の言語ファイルも追加することが望まれます。</li>
\r
2264 <h1>スキン変数の出力の書式 <a name="skinvar-formatting" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2266 <p>偉大なプラグインのいくつかは、様々なスキンや URL の生成において、必ずしもそのまま使用できるとはいえません。なぜなら、doSkinVar() メソッドによって出力されるものが、
\r
2267 ユーザーのニーズに十二分に合致するものであるとは言いがたいからです。Nucleus では、出力をここのユーザーによっておのおののニーズに沿ったものにする為に、いくつかのツールを用意しています。</p>
\r
2269 <!--<h2>URLの出力</h2>-->
\r
2271 <p>各ブログ・カテゴリー・アイテム・メンバー、それから action.php や管理エリア、または各プラグインの管理エリアなどの URL を出力する為に、Nucleus はコアの機能として
\r
2272 いくつかのファンクションとグローバル変数を用意しています。:</p>
\r
2274 <table summary="Nucleus の各ページへのリンクを生成する為に便利な変数とファンクション">
\r
2275 <caption>Nucleus の各ページへのリンクを生成する為に便利な変数とファンクション</caption>
\r
2277 <th>名前</th><th>種類</th><th>引数</th><th>説明</th>
\r
2280 <td><code>$CONF['AdminURL']</code></td>
\r
2283 <td>Nucleus の管理領域への絶対 URL</td>
\r
2286 <td><code>$CONF['PluginURL']</code></td>
\r
2289 <td>Nucleus のプラグインディレクトリへの絶対 URL。<code>$CONF['PluginURL'].'pluginname/'</code> の様にして、プラグインの管理エリアへのリンク生成に使用する。</td>
\r
2292 <td><code>$CONF['ActionURL']</code></td>
\r
2295 <td>Nucleus の action.php への絶対 URL。</td>
\r
2298 <td><code>$CONF['MediaURL']</code></td>
\r
2301 <td>Nucleus のメディアディレクトリへの絶対 URL。</td>
\r
2304 <td><code>$CONF['SkinsURL']</code></td>
\r
2307 <td>Nucleus のスキンディレクトリへの絶対 URL。</td>
\r
2310 <td><code>$CONF['IndexURL']</code></td>
\r
2313 <td>Nucleus のメインディレクトリへの絶対 URL。</td>
\r
2316 <td><code>$DIR_NUCLEUS</code></td>
\r
2319 <td>Nucleus のメインディレクトリへのシステムルートからのフルパス。</td>
\r
2322 <td><code>$DIR_SKINS</code></td>
\r
2325 <td>Nucleus のスキンディレクトリへのシステムルートからのフルパス。</td>
\r
2328 <td><code>$DIR_MEDIA</code></td>
\r
2331 <td>Nucleus のメディアディレクトリへのシステムルートからのフルパス。</td>
\r
2334 <td><code>$DIR_PLUGINS</code></td>
\r
2337 <td>Nucleus のプラグインディレクトリへのシステムルートからのフルパス。</td>
\r
2340 <td><code>$DIR_LANG</code></td>
\r
2343 <td>Nucleus の言語ファイルディレクトリへのシステムルートからのフルパス。</td>
\r
2346 <td><code>$DIR_LIBS</code></td>
\r
2349 <td>Nucleus のコアディレクトリへのシステムルートからのフルパス。</td>
\r
2352 <td><code>getAdminURL()</code></td>
\r
2353 <td>PLUGIN クラス内メソッド</td>
\r
2355 <td>プラグインの管理エリアディレクトリが存在すればその URL を返す(存在しない場合は無効)。</td>
\r
2358 <td><code>getDirectory()</code></td>
\r
2359 <td>PLUGIN クラス内メソッド</td>
\r
2361 <td>プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(存在しない場合は無効)。結果は".../nucleus/plugins/plugname/"のようになります。</td>
\r
2364 <td><code>createItemLink($itemid, $extra = '')</code></td>
\r
2365 <td>グローバルファンクション</td>
\r
2366 <td><code>$itemid</code> 整数。リンクしたいアイテムの ID。<br />
\r
2367 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2369 <td>ユーザーによって選択されたスキームにより、 <code>$itemid</code> に対応したアイテムへのリンクが生成されます。</td>
\r
2372 <td><code>createMemberLink($memberid, $extra = '')</code></td>
\r
2373 <td>グローバルファンクション</td>
\r
2374 <td><code>$memberid</code> 整数。リンクしたい存在するメンバーの ID。<br />
\r
2375 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2377 <td>ユーザーによって選択されたスキームにより、 <code>$memberid</code> に対応したメンバーへのリンクが生成されます。</td>
\r
2380 <td><code>createCategoryLink($catid, $extra = '')</code></td>
\r
2381 <td>グローバルファンクション</td>
\r
2382 <td><code>$catid</code> 整数。リンクしたいカテゴリーの ID。<br />
\r
2383 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2385 <td>ユーザーによって選択されたスキームにより、 <code>$catid</code> に対応したカテゴリーへのリンクが生成されます。</td>
\r
2388 <td><code>createArchiveListLink($blogid = '', $extra = '')</code></td>
\r
2389 <td>グローバルファンクション</td>
\r
2390 <td><code>$blogid</code> 整数。リンクしたいアーカイブ一覧が存在ブログの ID。<br />
\r
2391 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2393 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応したアーカイブ一覧へのリンクが生成されます。</td>
\r
2396 <td><code>createArchiveLink($blogid, $archive, $extra = '')</code></td>
\r
2397 <td>グローバルファンクション</td>
\r
2398 <td><code>$blogid</code> 整数。リンクしたい月別アーカイブが存在するブログの ID。<br />
\r
2399 <code>$archive</code> 文字列。アーカイブのパラメータとして、渡した「日(または年、月)」のものが存在するもの。<br />
\r
2400 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2402 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応した月別アーカイブへのリンクが生成されます。</td>
\r
2405 <td><code>createBlogidLink($blogid, $extra = '')</code></td>
\r
2406 <td>グローバルファンクション</td>
\r
2407 <td><code>$blogid</code> 整数。リンクしたいブログの ID。<br />
\r
2408 <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
\r
2410 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応したブログへのリンクが生成されます。</td>
\r
2414 <!--<h2>スキンへの出力にテンプレートを使う</h2>-->
\r
2416 <p>出力する文字列をテンプレートを使って整形出来るようにしましょう。あなたが順不同のリストで出力したいと考えていたとしても、別のユーザーは同じデータを
\r
2417 記号で区切ったり、特別な形で出力したいと考えるかもしれません。Nucleus にはテンプレートデータを作ったり定義したりする2種類の方法があります。
\r
2418 次に上げるれいの両方において、<code><%foo%></code> と <code><%bar%></code> のふたつのテンプレート変数を使用します。</p>
\r
2421 <li><strong>プラグインのオプションを使う方法。</strong>この方法は v3.2 以降で使用でき、次のように <code>install()</code> メソッド
\r
2422 に記述する事によって簡単に作成する事が出来ますが、アップグレードのためにプラグインを削除した時に、ユーザーは同時にカスタマイズした
\r
2423 テンプレートを失ってしまうという大きなデメリットがあります。
\r
2424 <pre class="example"><code>$this->createOption('my_template',
\r
2425 'プラグインの出力の為のテンプレート',
\r
2427 '<li><%foo%> loves <%bar%></li>');</code></pre>
\r
2428 <code>doSkinVar()</code> メソッドで、<code>foo</code> と <code>bar</code> を次のように定義して、テンプレートを埋めます。
\r
2429 <pre class="example"><code>$mytemplate = $this->getOption('my_template');
\r
2432 'foo'=>'Ricky',
\r
2433 'bar'=>'Lucy'),
\r
2436 'bar'=>'Nancy'),
\r
2438 'foo'=>'Mickey',
\r
2439 'bar'=>'Minnie')
\r
2441 foreach ($couples as $values) {
\r
2442 echo TEMPLATE::fill($mytemplate,$values);
\r
2444 これでプラグインのスキン変数 <code><%TemplateTest%></code> を書いたところに、次のように出力されます。
\r
2445 <pre class="example"><code><li>Ricky loves Lucy</li>
\r
2446 <li>Sid loves Nancy</li>
\r
2447 <li>Mickey loves Minnie</li></code></pre>
\r
2450 <li><strong>Nucleus コアのテンプレートシステムを使う方法。</strong>この方法は v3.4以降で使用できます。この方法の利点は、他のテンプレートと
\r
2451 同じようにデータベースに格納され、配布用にテンプレートをエクスポートできるところにあります。この API を使用したプラグインのサンプルが、
\r
2452 フォーラムの<a href="http://japan.nucleuscms.org/bb/viewtopic.php?p=24401#24401" title="Sample">新API「TemplateExtraFields」を使ったプラグインの見本</a>に
\r
2453 (本家フォーラムのスレッドは <a href="http://forum.nucleuscms.org/viewtopic.php?p=87672#87672" title="Sample">Skin specific values for Plugins</a>)
\r
2454 にあります。細かな点は本家フォーラムの <a href="http://forum.nucleuscms.org/viewtopic.php?p=87672#87672" title="Sample">Skin specific values for Plugins</a> スレッド
\r
2455 を参照してください。ここでは要約のみ書いてあります。
\r
2456 まず、<code>install()</code> メソッド中でプラグインオプションを作成し、ここでテンプレートのデフォルトの内容を定義します。
\r
2457 <pre class="example"><code>$this->createOption('my_template',
\r
2458 'Template used to format output of plugin.',
\r
2460 '<li><%foo%> loves <%bar%></li>');</code></pre>
\r
2461 次に割り込みをかけるイベントのリストに <code>TemplateExtraFields</code> を登録します。
\r
2462 <pre class="example"><code>function getEventList() { return array('TemplateExtraFields'); }</code></pre>
\r
2463 そして、<code>event_TemplateExtraFields</code> メソッドを作成します。
\r
2464 <pre class="example"><code>function event_TemplateExtraFields(&$data) {
\r
2465 /* Add an element in the $data['fields'] array using your plugin name as the key
\r
2466 and an associative array containing the field name and field label*/
\r
2467 /* note that your field names should be lowercase and include the name
\r
2468 of your template as shown below. This will ensure that all template field names are unique. */
\r
2469 $data['fields']['NP_TemplateTest'] = array(
\r
2470 'templatetest_body'=>'TemplateTest Body'
\r
2473 最後に <code>doSkinVar()</code> メソッドで、テンプレートを埋めます。この時、スキン変数の引数に使用するテンプレート名が必要です。
\r
2474 <pre class="example"><code>function doSkinVar($skinType,$template = '') {
\r
2475 global $blog, $CONF, $manager,$member;
\r
2477 $template =& $manager->getTemplate($template);
\r
2478 if (trim($template['templatetest_body']) == '')
\r
2479 $template['templatetest_body'] = $this->getOption('my_template');
\r
2483 'foo'=>'Ricky',
\r
2484 'bar'=>'Lucy'),
\r
2487 'bar'=>'Nancy'),
\r
2489 'foo'=>'Mickey',
\r
2490 'bar'=>'Minnie')
\r
2492 foreach ($couples as $values) {
\r
2493 echo TEMPLATE::fill($template['templatetest_body'],$values);
\r
2496 ユーザーは『テンプレート編集』画面で、「TemplateTest Body」フィールドに出力したい形式でテンプレートを編集します。
\r
2497 例えば「default/index」テンプレートを使って、こんな風にテンプレートを編集します。
\r
2498 <pre class="example"><code><li><%foo%> loves <%bar%>!!!</li></code></pre>
\r
2499 そしてスキンに <code><%TemplateTest(default/index)%></code> と書くと、そこに
\r
2500 <pre class="example"><code><li>Ricky loves Lucy!!!</li>
\r
2501 <li>Sid loves Nancy!!!</li>
\r
2502 <li>Mickey loves Minnie!!!</li></code></pre>と表示されます。<br />
\r
2505 <li><strong>通常のテンプレートを使って書式化。</strong>この方法は v3.4 以降で、アイテムを出力するプラグインで使用できます。
\r
2506 この方法にはコアのテンプレートシステムの既存の「アイテム」フィールドを使うというアドバンテージがあり、スキン変数の <code><%blog%></code>
\r
2507 の様に使用します。スキン変数の引数として、一つ以上のアイテムの ID と使用するテンプレート名を、また、BLOG クラスの <code>readLogFromList()</code>
\r
2508 メソッドを呼び出せることが条件です。テンプレート変数として使用したい場合は、<code>doTemplateVar()</code> メソッドで使用することも出来ます。
\r
2509 例として <code>doSkinVar()</code> メソッドでこのテクニックを使う方法を示しておきます。
\r
2510 4つのアイテムの ID を引数として受け取り、「default/index」テンプレートを使って出力します。
\r
2511 <pre class="example"><code>function doSkinVar($skinType,$item1 = 0,$item2 = 0,$item3 = 0,$item4 = 0) {
\r
2514 $template = 'default/index';
\r
2515 $item_array = array($item1,$item2,$item3,$item4);
\r
2516 $blog->readLogFromList($item_array, $template);
\r
2523 <h1>この他にも…… <a name="additional-reading" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>
\r
2525 <h2>役立つドキュメントがたくさん!</h2>
\r
2527 <p>このドキュメント以外にもあなたがプラグインを開発するにあたって、リンク先のページもきっと役立つことと思います。</p>
\r
2529 <li><a href="http://wiki.nucleuscms.org/plugindev:index" title="Development Wiki">Development Wiki(公式サイト(英語))</a></li>
\r
2530 <li><a href="http://japan.nucleuscms.org/wiki/plugindev" title="Development Wiki">Nucleusプラグインの技術情報(日本公式サイト)</a></li>
\r
2531 <li><a href="sqltables.html" title="Database Tables">Nucleus - SQL テーブル構造</a></li>
\r
2532 <!-- <li><a href="" title=""></a></li> -->
\r
2536 <pre class="example"><code></code></pre>
\r
2537 <pre class="example"><code></code></pre>
\r
2538 <pre class="example"><code></code></pre>
\r
2539 <pre class="example"><code></code></pre>
\r