OSDN Git Service

翻訳終り!
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / documentation / devdocs / plugins.html
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
4 <head>\r
5         <!-- $Id: plugins.html,v 1.10 2007-04-25 19:51:32 andy Exp $ -->
6         <!-- $NucleusJP: plugins.html,v 1.9 2007/02/04 06:28:45 kimitake Exp $ -->
7     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
8     <meta http-equiv="Content-Style-Type" content="text/css" />\r
9     <meta http-equiv="Content-Script-Type" content="text/javascript" />\r
10     <link rel="index" href="./index.html" />\r
11     <title>Nucleus - プラグイン API</title>\r
12     <link rel="stylesheet" type="text/css" href="styles/manual.css" />\r
13     <style type="text/css">\r
14         /* refence parameters (greenish) */\r
15         .ref {\r
16             background-color: #c9f2d4;\r
17             color: #444;\r
18             padding-left:5px;\r
19             letter-spacing:1px;\r
20         }\r
21 \r
22         /* object parameters */\r
23         .obj {\r
24             color: #230bb7;\r
25             font-style: italic;\r
26             padding-left:5px;\r
27             letter-spacing:1px;\r
28         }\r
29         .obj:after {\r
30             content: " (object)";\r
31         }\r
32 \r
33         /* read-only parameters (non-ref; reddish) */\r
34         .ro {\r
35             background-color: #ffddce;\r
36             color: #444;\r
37             padding-left:5px;\r
38             letter-spacing:1px;\r
39         }\r
40         td ul {\r
41             list-style-image:none;\r
42             list-style-type:none;\r
43             padding:0;\r
44             margin:0;\r
45         }\r
46     </style>\r
47 </head>\r
48 <body>\r
49 <div id="body">\r
50 \r
51 <div class="heading">\r
52 <a id="top" name="top">プラグイン API</a>\r
53 <em>2009年2月6日</em>\r
54 </div>\r
55 \r
56 <div class="note-trans"><strong>訳者注:</strong> \r
57     <ul>\r
58         <li>このドキュメントの原文は以下のURLにあります。<br />\r
59          <a href="http://nucleuscms.org/documentation/devdocs/plugins.html">http://nucleuscms.org/documentation/devdocs/plugins.html</a></li>\r
60         <li>誤訳にお気づきの方は<a href="http://japan.nucleuscms.org/bb/viewforum.php?f=7">NucleusCMS日本語フォーラム</a>までご連絡いただけると助かります。</li>\r
61     </ul>\r
62 </div>\r
63 \r
64 <div class="note"><strong>注:</strong> \r
65     <ul>\r
66         <li>このドキュメントは基本的なプラグインの書き方についての情報を提供しています。さらに質問がある方は <a href="http://forum.nucleuscms.org/viewforum.php?f=10">Plugin\r
67       Development Forum</a> (<a href="http://japan.nucleuscms.org/bb/viewforum.php?f=5">日本語フォーラム</a>)をご覧ください。</li>\r
68         <li>Nucleusバージョン1.5以降に導入されたメソッドとイベントには、導入時のバージョン情報を付記しています。それらの機能を利用するときは、<code>getMinNucleusVersion</code> を適切に設定するのを忘れないでください。</li>\r
69     </ul>\r
70 </div>\r
71 \r
72 <h1>はじめに</h1>\r
73 \r
74 <p>\r
75 <a href="./index.html">開発者向けドキュメントの目次へ戻る</a>\r
76 </p>\r
77 \r
78 <p>\r
79 このドキュメントはNucleusプラグインの作り方についての解説です。 \r
80 </p>\r
81 \r
82 <h1><a id="toc" name="toc">目次</a></h1>\r
83 \r
84 <ul>\r
85     <li><a href="#introduction">イントロダクション</a></li>\r
86     <li><a href="#firstplug">はじめてプラグインを書いてみる</a></li>\r
87     <li><a href="#nucleusplugin"><code>NucleusPlugin</code> クラスの概要</a></li>\r
88     <li><a href="#skinvars"><code>&lt;%plugin(...)%&gt;</code> スキン変数</a></li>\r
89     <li><a href="#templatevars"><code>&lt;%plugin(...)%&gt;</code> テンプレート変数</a></li>    \r
90     <li><a href="#actions"><code>action.php</code> を使ったアクション</a></li>\r
91     <li><a href="#events">イベントとイベント登録の仕方</a></li>\r
92     <li><a href="#options">オプションを保存する</a></li>\r
93     <li><a href="#tables">データベース・テーブル</a></li>\r
94     <li><a href="#admin">プラグイン管理エリアの提供</a></li>\r
95     <li><a href="#help">ヘルプページの提供</a></li>\r
96     <li><a href="#dependency">プラグイン依存チェック</a></li>\r
97         <li><a href="#internationalization">プラグインの国際化</a></li>\r
98         <li><a href="#skinvar-formatting">スキン変数の出力の書式</a></li>\r
99         <li><a href="#additional-reading">追記事項</a></li>\r
100 <!--    <li><a href="#parser">Using the <code>PARSER</code> class</a></li>\r
101     <li><a href="#"></a></li>\r
102     <li><a href="#"></a></li>\r
103     <li><a href="#"></a></li>\r
104     <li><a href="#"></a></li>-->\r
105 </ul>\r
106 \r
107 <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
108 \r
109 <p>\r
110 Nucleusプラグインによって、誰もがNucleusの提供する機能を、Nucleus内部のPHPコードを変更することなく拡張することができます。プラグインはあるメソッドを実装したシンプルなPHPスクリプトで、Nucleusユーザー同士で簡単に交換することができます。インストールは簡単で、プラグインディレクトリにファイルをアップし、Nucleusにそれを認識させるだけです。\r
111 </p>\r
112 \r
113 <p>\r
114 プラグインの利点は以下のとおりです。\r
115 </p>\r
116 \r
117 <ul>\r
118     <li>実装について詳しくしらなくてもNucleusフレームワークに簡単に機能を追加できる</li>\r
119     <li>必要なプラグインだけをインストールでき、ページ生成にかかる時間を節約できる</li>\r
120 </ul>\r
121 \r
122 <p>\r
123 すべてのプラグインファイルは <code>config.php</code> に記述されたディレクトリに置く必要があります。一般的に、それは <code>/your/path/nucleus/plugins/</code>  になるでしょう。プラグインファイル名は <code>NP<em>_name</em>.php</code> という形式を用いることにより認識されます。プラグインによっては、追加ファイルを格納する同名のサブディレクトリや、管理エリアを必要とします。\r
124 </p>\r
125 \r
126 <div class="note">\r
127 <strong>注:</strong> プラグイン名は大文字・小文字を識別しますので、<code>Np_</code> や <code>np_</code> ではなく、<code>NP_</code> で始まることに気をつけてください。またプラグインがサブディレクトリを使用する場合は、サブディレクトリの名称は<em>すべて小文字にします</em>。\r
128 </div>\r
129 \r
130 \r
131 \r
132 \r
133 <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
134 \r
135 <p>\r
136 では、シンプルなプラグインを書いてみましょう。基本的にプラグインは、あらかじめ定義された <code>NucleusPlugin</code> クラスを継承したPHPクラスです。以下は<code>HelloWorld</code>プラグインの例です。\r
137 </p>\r
138 \r
139 <pre class="example"><code>&lt;?php\r
140 \r
141 class NP_HelloWorld extends NucleusPlugin\r
142 {\r
143     // プラグインの名前\r
144     function getName()\r
145     {\r
146         return 'Hello World';\r
147     }\r
148 \r
149     // プラグインの作者\r
150     function getAuthor()\r
151     {\r
152         return 'Wouter Demuynck';\r
153     }\r
154 \r
155     // プラグインのサイトURL\r
156     // mailto:foo@bar.com の形式も可\r
157     function getURL()\r
158     {\r
159         return 'http://nucleuscms.org/';\r
160     }\r
161 \r
162     // プラグインのバージョン\r
163     function getVersion()\r
164     {\r
165         return '1.0';\r
166     }\r
167 \r
168     // インストール済みのプラグインリストに表示される説明文\r
169     function getDescription()\r
170     {\r
171         return 'Just a sample plugin.';\r
172     }\r
173 \r
174     function doSkinVar($skinType)\r
175     {\r
176         echo 'Hello World!';\r
177     }\r
178 \r
179     function supportsFeature ($what)\r
180     {\r
181         switch ($what)\r
182         {\r
183             case 'SqlTablePrefix':\r
184                 return 1;\r
185             default:\r
186                 return 0;\r
187         }\r
188     }\r
189 \r
190 }\r
191 ?&gt;</code></pre>\r
192 \r
193 <ol>\r
194     <li>\r
195         このコードをコピーし、 <code>NP_HelloWorld.php</code> と名づけて保存し、プラグインディレクトリに置きます。<em>最後の <code>?&gt;</code> の後や、最初の <code>&lt;?php</code> の前にスペースがないことを確認しましょう</em>。ところでNP は &quot;Nucleus Plugin&quot; って意味ですよ :-) 念のため。\r
196     </li>\r
197     <li>Nucleusの管理画面を開き、<em>Nucleusの管理>プラグインの管理</em>にいきます。</li>\r
198     <li><em>HelloWorld</em> プラグインがインストール可能な状態になっているはずですので、インストールします。すべてがうまくいけば、インストール済みプラグインリストに追加されます。</li>\r
199     <li>\r
200         あなたのスキンの1つを編集し、実際のページに表示する箇所に次の文を挿入します。\r
201 <pre class="example"><code>&lt;%HelloWorld%&gt;</code></pre>\r
202         注意:カッコ内の名称 (<code>HelloWorld</code>) は大文字小文字を識別します!\r
203     </li>\r
204     <li>さて、編集したスキンから生成されるページを見てみましょう。プラグイン変数を追加した場所に &quot;Hello World&quot; と見えますね?</li>\r
205 </ol>\r
206 \r
207 <p>\r
208 ここまではそれほど難しくなかったと思います。さらに読み進めて理解してください。\r
209 </p>\r
210 \r
211 \r
212 \r
213 \r
214 \r
215 \r
216 \r
217 <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
218 \r
219 <p>すべてのプラグインは、<code>NucleusPlugin</code> というPHPクラスを継承しなければなりません。難しそうに聞こえても心配ご無用、大丈夫です。このPHPクラスの継承によって、プラグインに必要なメソッドだけを実装でき、いくつかの補助ファンクションにアクセスでき、つまりはあなたの人生はよりラクになります。</p>\r
220 \r
221 <p>下記は <code>NucleusPlugin</code> が提供する、再実装可能なメソッドの概要です。このクラス自身のソースコードを見たければ、<code>nucleus/libs/PLUGIN.php</code>にあります。</p>\r
222 \r
223 <table summary="An overview of the redefinable methods in the class NucleusPlugin">\r
224     <caption><code>NucleusPlugin</code> クラスの概要(再定義可能なメソッド)</caption>\r
225     <tr>\r
226         <th abbr="method">メソッド名</th><th abbr="desc">説明</th>\r
227     </tr>\r
228     <tr>\r
229         <td><code>getName()</code></td>\r
230         <td>プラグイン名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>       \r
231     </tr>\r
232     <tr>\r
233         <td><code>getAuthor()</code></td>\r
234         <td>プラグインの作者名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>     \r
235     </tr>\r
236     <tr>\r
237         <td><code>getURL()</code></td>\r
238         <td>プラグインをダウンロード可能な、またはプラグインの追加情報のあるサイトのURLを返します。そのようなサイトがない場合は作者のメールアドレスへの mailto:リンクが適切です。デフォルトの実装では <code>Undefined</code> を返すため、必ず再定義されないといけません。</td>      \r
239     </tr>\r
240     <tr>\r
241         <td><code>getDescription()</code></td>\r
242         <td>プラグインに関する説明文(長文)を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では <code>Undefined</code> を返します。</td>       \r
243     </tr>\r
244     <tr>\r
245         <td><code>getVersion()</code></td>\r
246         <td>プラグインの現在のバージョンを返します。デフォルトは <code>0.0</code> を返します。</td>     \r
247     </tr>\r
248     <tr>\r
249         <td><code>getMinNucleusVersion()</code></td>\r
250         <td>(v2.0b) 最低限必要なNucleusのバージョンを返します。デフォルトは <code>155</code> (v1.55)を返します。後に導入されたプラグイン関連機能を利用している場合は、このファンクションを実装するようお願いします(例: v2.0 =&gt; 200)。ただし、Nucleus v1.55 はこのファンクションを使用しないため、新機能を利用したプラグインが(対応する前のシステムに)インストールされる可能性が残っています。</td>\r
251     </tr>\r
252     <tr>\r
253         <td><code>getMinNucleusPatchLevel()</code></td>\r
254         <td>(v3.1) 最低限必要なNucleusのバージョン(<code>getMinNucleusVersion</code>)での、最低限必要なパッチレベルを返します。デフォルトは <code>0</code> を返します。このファンクションは主に新しいプラグインの機能がNucleusの最新版のパッチによって可能になる場合に用いられます。</td>\r
255     </tr>\r
256     <tr>\r
257         <td><code>init()</code></td>\r
258         <td>プラグインを初期化します。このメソッドはプラグインオブジェクトが生成された直後に呼び出され、<code>plugid</code>属性がセットされます。デフォルトではこのメソッドは何もしません。</td>\r
259     </tr>\r
260     <tr>\r
261         <td><code>doSkinVar($skinType)</code></td>\r
262         <td><code>&lt;%plugin(...)%&gt;</code> スキン変数によってプラグインが呼び出されたときにこのメソッドが呼ばれます。<code>$skinType</code> パラメータはプラグインが呼ばれた場所のスキンタイプに該当します(<code>item</code>, <code>archive</code>, ...)。パラメータが一つしかないことに混乱しないでください。複数パラメータを渡すことも<strong>可能</strong>です。<a href="#skinvars"><code>doSkinVar</code> メソッドの実装に関する詳細情報はこちら</a>。デフォルトではこのメソッドはなにも出力しません。</td>       \r
263     </tr>\r
264     <tr>\r
265         <td><code>doTemplateVar(&amp;$item)</code></td>\r
266         <td>基本的に <code>doSkinVar</code> と同じですが、今度は<em>テンプレート</em>内(<code>item header/body/footer</code> と <code>dateheader/footer</code>)での<code>&lt;%plugin(...)%&gt;</code> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなして<code>doSkinVar</code> メソッドに処理を渡します。<a href="#templatevars"><code>doTemplateVar</code> メソッドの実装に関する詳細情報はこちら</a></td>       \r
267     </tr>\r
268     <tr>\r
269         <td><code>doTemplateCommentsVar(&amp;$item, &amp;$comment)</code></td>\r
270         <td>(v2.0b) 基本的に <code>doSkinVar</code> と同じですが、今度は<em>テンプレート</em>内(コメント部分)での<code>&lt;%plugin(...)%&gt;</code> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなして<code>doSkinVar</code> メソッドに処理を渡します。<a href="#templatevars"><code>doTemplateCommentsVar</code>メソッドの実装に関する詳細情報はこちら</a></td>\r
271     </tr>\r
272     <tr>\r
273         <td><code>doItemVar(&amp;$item, &amp;$param)</code></td>\r
274         <td>(v3.30) 基本的に <code>doSkinVar</code> と同じですが、今度は<em>投稿した記事</em>内での<code>&lt;%plugin(...)%&gt;</code> 変数からの呼び出しになります。渡される引数のうち<code>&amp;$item</code>は変数が記述されているアイテムのフルオブジェクトを、<code>&amp;$param</code>はプラグインごとの関数のパラメータになります。</td>\r
275     </tr>\r
276     <tr>\r
277         <td><code>doIf($key, $value)</code></td>\r
278         <td>(v3.30) スキン変数 <code>if/ifnot/elseif/elseifnot</code> に対して、プラグイン独自の判断をする事が出来るメソッドです。通常は、<code>$key</code> 変数が <code>$value</code> の値を持っているかを調べて、 <code>true</code> か <code>false</code> を返すことになります。このメソッドをプラグインに実装する場合は、作者は使用方法のドキュメントを書くようにしてください。</td>\r
279     </tr>\r
280     <tr>\r
281         <td><code>doAction($type)</code></td>\r
282         <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
283     </tr>\r
284     <tr>\r
285         <td><code>install()</code></td>\r
286         <td>このメソッドはプラグインがインストールされた際に呼ばれます。データベース・テーブルの生成やプラグインオプションの生成などの初期化作業を行うことができます。デフォルトではこのメソッドは何もしません。</td>\r
287     </tr>\r
288     <tr>\r
289         <td><code>unInstall()</code></td>\r
290         <td>プラグインがアンインストールされた際に呼ばれます。この時点でデータベースに作られたプラグイン情報を消去すると良いです。デフォルトではこのメソッドは何もしません。</td>\r
291     </tr>\r
292     <tr>\r
293         <td><code>getEventList()</code></td>\r
294         <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
295     </tr>\r
296     <tr>\r
297         <td><code>getTableList()</code></td>\r
298         <td>このメソッドはプラグインが生成したデータベース・テーブルの配列を返します。これはNucleusが提供するバックアップ機能で利用されるので、プラグインテーブルをバックアップに含めることができます。デフォルトでは空の配列を返します。</td>\r
299     </tr>\r
300     <tr>\r
301         <td><code>hasAdminArea()</code></td>\r
302         <td>プラグインが独自の管理エリアをもつ場合 1 を、そうでない場合 0 を返します。デフォルトでは <code>0</code> を返します。</td>\r
303     </tr>\r
304     <tr>\r
305         <td><code>getPluginDep()</code></td>\r
306         <td>(v3.2) プラグイン名の配列を返します。Nucleusはこれらのプラグインが前もってインストールされてない場合、プラグインのインストールを拒否します。デフォルトでは空の配列が返されます。<a href="#dependency">プラグイン依存に関する詳細情報はこちら</a></td>\r
307     </tr>\r
308 </table>\r
309 \r
310 <p>実装可能なメソッドの次は、<code>NucleusPlugin</code> クラスが提供する、再実装<strong>すべきでない</strong>幾つかの特殊メソッドです。これらはプラグイン内で、<code>$this-&gt;functionName()</code>シンタックスを利用して呼び出します。</p>\r
311 \r
312 <table summary="An overview of the auxiliary methods in the class NucleusPlugin. You should NOT redefine these">\r
313     <caption><code>NucleusPlugin</code> クラスの概要(再定義不可能なメソッド)</caption>\r
314     <tr>\r
315         <th abbr="method">メソッド名</th><th abbr="desc">説明</th>\r
316     </tr>\r
317     <tr>\r
318         <td>\r
319             <ul>\r
320                 <li><code>createOption(...)</code></li>\r
321                 <li><code>createBlogOption(...)</code>(v2.2)</li>\r
322                 <li><code>createCategoryOption(...)</code>(v2.2)</li>\r
323                 <li><code>createMemberOption(...)</code>(v2.2)</li>\r
324                 <li><code>createItemOption(...)</code>(v3.2)</li>\r
325             </ul>\r
326         </td>\r
327         <td><a href="#options" title="More info on options">新しいオプションを生成します。</a></td>     \r
328     </tr>\r
329     <tr>\r
330         <td>\r
331             <ul>\r
332                 <li><code>deleteOption(...)</code></li>\r
333                 <li><code>deleteBlogOption(...)</code>(v2.2)</li>\r
334                 <li><code>deleteCategoryOption(...)</code>(v2.2)</li>\r
335                 <li><code>deleteMemberOption(...)</code>(v2.2)</li>\r
336                 <li><code>deleteItemOption(...)</code>(v3.2)</li>\r
337             </ul>\r
338         </td>\r
339         <td><a href="#options" title="More info on options">オプションを削除します。</a></td>       \r
340     </tr>\r
341     <tr>\r
342         <td>\r
343             <ul>\r
344                 <li><code>setOption(...)</code></li>\r
345                 <li><code>setBlogOption(...)</code>(v2.2)</li>\r
346                 <li><code>setCategoryOption(...)</code>(v2.2)</li>\r
347                 <li><code>setMemberOption(...)</code>(v2.2)</li>\r
348                 <li><code>setItemOption(...)</code>(v3.2)</li>\r
349             </ul>\r
350         </td>\r
351         <td><a href="#options" title="More info on options">オプションに値をセットします。</a></td>     \r
352     </tr>\r
353     <tr>\r
354         <td>\r
355             <ul>\r
356                 <li><code>getOption(...)</code></li>\r
357                 <li><code>getBlogOption(...)</code>(v2.2)</li>\r
358                 <li><code>getCategoryOption(...)</code>(v2.2)</li>\r
359                 <li><code>getMemberOption(...)</code>(v2.2)</li>\r
360                 <li><code>getItemOption(...)</code>(v3.2)</li>\r
361             </ul>\r
362         </td>\r
363         <td><a href="#options" title="More info on options">オプションの値を取得します。</a></td>       \r
364     </tr>\r
365     <tr>\r
366         <td>\r
367             <ul>\r
368                 <li><code>getAllBlogOptions(...)</code>(v2.2)</li>\r
369                 <li><code>getAllCategoryOptions(...)</code>(v2.2)</li>\r
370                 <li><code>getAllMemberOptions(...)</code>(v2.2)</li>\r
371                 <li><code>getAllItemOptions(...)</code>(v3.2)</li>\r
372             </ul>\r
373         </td>\r
374         <td><a href="#options" title="More info on options">与えられたオプションにより、すべての値(コンテクストごとの一つの値)の連想配列を返します。</a></td>     \r
375     </tr>\r
376 \r
377     <tr>\r
378         <td>\r
379             <ul>\r
380                 <li><code>getBlogOptionTop(...)</code>(v3.2)</li>\r
381                 <li><code>getMemberOptionTop(...)</code>(v3.2)</li>\r
382                 <li><code>getCategoryOptionTop(...)</code>(v3.2)</li>\r
383                 <li><code>getItemOptionTop(...)</code>(v3.2)</li>\r
384             </ul>\r
385         </td>\r
386         <td><a href="#options" title="More info on options">与えられたオプションにより、すべての値のうちの最初の値を返します。</a></td>\r
387     </tr>\r
388     <tr>\r
389         <td><code>getID()</code></td>\r
390         <td>このプラグインのIDを返します(このIDはNucleus内部で利用されるものです)。</td>      \r
391     </tr>\r
392     <tr>\r
393         <td><code>getAdminURL()</code></td>\r
394         <td>プラグインの管理エリアが置かれたURLを返します(そのような管理エリアがない場合は、この情報は無効です)。</td>        \r
395     </tr>\r
396     <tr>\r
397         <td><code>getDirectory()</code></td>\r
398         <td>プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(そのようなファイルがない場合は、この情報は無効です)。結果は&quot;<code>.../nucleus/plugins/<em>plugname</em>/</code>&quot;のようになります。</td>      \r
399     </tr>\r
400     <tr>\r
401         <td><code>getShortName()</code></td>\r
402         <td>"NP_"部分を省き、全てを小文字にしたプラグインのクラス名を返します。この情報は <code>getAdminURL</code> と <code>getDirectory</code> で使用されます。</td>       \r
403     </tr>\r
404 \r
405 </table>\r
406 \r
407 <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
408 \r
409 <h2>解説</h2>\r
410 \r
411 <p>\r
412 独自のスキン変数を生成し、<code>&lt;%plugin(<em>PlugName,parameters</em>)%&gt;</code> または <code>&lt;%PlugName(parameters)%&gt;</code>で呼び出すことが出来ます(すでに存在するスキン変数とかぶらない場合)。パラメータはカンマ区切りです。\r
413 </p>\r
414 \r
415 <p>\r
416 スキン変数を扱うには、<code>doSkinVar</code> メソッドを実装する必要があります。いくつかの例を以下に示します。\r
417 </p>\r
418 \r
419 <pre class="example"><code>function doSkinVar($skinType)\r
420 function doSkinVar($skinType, $param1, $param2)\r
421 function doSkinVar($skinType, $skinVar, $param1, $param2)\r
422 function doSkinVar($skinType, $skinVar, $param1 = 'default value')</code></pre>\r
423 \r
424 <ul>\r
425     <li><code>$skinType</code> パラメータは、'index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup',  <a href="#templatevars" title="Information on templatevars">'template'</a>のうちの一つを取ります</li>\r
426     <li><code>$skinVar</code> は、スキン変数のタイプとして解釈される実質的に最初のパラメータになります(例:<code>&lt;%plugin(PlugName,VarType)%&gt;</code>)。</li>\r
427     <li><code>doSkinVar()</code>(パラメータ無し)を使い、PHPファンクションの<code>func_get_args()</code>を用いてパラメータを取得することができます。引数の数の異なる、タイプの違うスキン変数を扱うときに便利です。</li>\r
428 </ul>\r
429 \r
430 <h2>ノート</h2>\r
431 \r
432 <ul>\r
433     <li>(v2.0b) グローバル変数としてパースされている <code>$currentSkinName</code> を使ってスキンの名前を取得できます。</li>\r
434 </ul>\r
435 \r
436 \r
437 \r
438 \r
439 <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
440 \r
441 <h2>解説</h2>\r
442 \r
443 <p>\r
444 テンプレートプラグイン変数はスキンプラグイン変数と同様に働きますが以下の2点が異なります。</p>\r
445 \r
446 <ol>\r
447     <li>スキン内ではなくテンプレート内から呼ばれます。</li>\r
448     <li>$skinTypeパラメータを取りません。代わりに現在パースされているアイテムやコメントの情報付きの追加パラメータを取ります。\r
449     <ul>\r
450             <li><code>doTemplateVar</code> メソッドは <code>&amp;$item</code> パラメータを取ります。</li>\r
451             <li><code>doTemplateCommentsVar</code> メソッドは <code>&amp;$item</code> と <code>&amp;$comment</code> パラメータを取ります。</li>\r
452       </ul>\r
453         <strong>&amp;マークに注意!</strong>\r
454     </li>\r
455 </ol>\r
456     \r
457 <p>テンプレート変数はスキン変数と同じ要領で呼ばれます(<code>&lt;%plugin(PlugName,parameters)%&gt;</code> または <code>&lt;%PlugName(parameters)%&gt;</code>)。\r
458 </p>\r
459 \r
460 <p>\r
461 デフォルトでは、全てのテンプレート変数は'<code>template</code>'を<code>skintype</code>パラメータとして、<code>doSkinVar</code> メソッドに渡ります。\r
462 </p>\r
463 \r
464 <p>\r
465 独自の実装を提供したい場合は、<code>doTemplateVar</code> メソッドや <code>doTemplateCommentsVar</code> メソッドを再定義する必要があります。<code>skintype</code>パラメータが無くなる以外はdoSkinVarと同様に働きます。\r
466 </p>\r
467 \r
468 <pre class="example"><code>function doTemplateVar(&amp;$item)\r
469 function doTemplateVar(&amp;$item, $param1, $param2)\r
470 function doTemplateVar(&amp;$item, $type, $param1, $param2)\r
471 function doTemplateVar(&amp;$item, $type, $param1 = 'default value')\r
472 function doTemplateCommentsVar(&amp;$item, &amp;$comment)\r
473 function doTemplateCommentsVar(&amp;$item, &amp;$comment, $param1, $param2)\r
474 function doTemplateCommentsVar(&amp;$item, &amp;$comment, $type, $param1, $param2)\r
475 function doTemplateCommentsVar(&amp;$item, &amp;$comment, $type, $param1 = 'default value')</code></pre>\r
476 \r
477 <h2>ノート</h2>\r
478 \r
479 <ul>\r
480     <li>(v2.0b) グローバル変数として内部で利用される <code>$currentSkinName</code> を使ってテンプレートの名前を取得できます。</li>\r
481 </ul>\r
482 \r
483 \r
484 \r
485 \r
486 <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
487 \r
488 <p>プラグインは <code>action.php</code> を通してアクションを行うことができ、同様のスクリプトがコメントや投票の受け取りにも使用されてます。GETまたはPOSTのどちらかを通して呼び出せます。必要なパラメータは<code>action</code>('plugin'と指定)、<code>name</code>(プラグイン名)、<code>type</code>(リクエストされたアクションの種類)です。</p>\r
489 \r
490 <p>これらのアクションを有効にするために、<code>doAction($actionType)</code> メソッドをプラグイン内で実装する必要があります。リクエストからの追加パラメータは<code>requestVar('<em>name</em>')</code> で取得できます(<code>requestVar</code> はPHPが付加する magic_quotes_gpc に配慮しています)。</p>\r
491 \r
492 <p>\r
493 <code>doAction</code> メソッドが文字列を返すとき、エラーとして解釈され、エラーメッセージが表示されます。\r
494 </p>\r
495 \r
496 \r
497 \r
498 \r
499 \r
500 \r
501 <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
502 \r
503 <p>\r
504 Nucleusプラグインはなにか重要なことが起きたときに発生するイベントに登録可能です。プラグインはイベント発生の際にアクションを実行したり、テキストを出力したりできます。\r
505 </p>\r
506 \r
507 <h2>例</h2>\r
508 \r
509 <p>\r
510 下記は <code>PreAddComment</code> イベント(blogにコメントが追加される直前に生成されるイベント)にプラグインが登録する例です。\r
511 </p>\r
512 \r
513 <pre class="example"><code>class NP_Acronyms extends NucleusPlugin {\r
514   ...\r
515   function getEventList() { return array('PreAddComment'); }\r
516   ...\r
517   function event_PreAddComment(&amp;$data) {\r
518     // 頭字語 HTML を置き換え\r
519     $data['comment']['body'] = \r
520         strreplace('HTML',\r
521                    '&lt;acronym title="HyperText Markup Language"&gt;HTML&lt;/acronym&gt;',\r
522                    $data['comment']['body']);\r
523   }\r
524 }\r
525 </code></pre>\r
526 \r
527 <p>このプラグインはコメント中の'HTML'というテキストを'<code>&lt;acronym title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/acronym&gt;</code>'に置き換えます。acronymタグはHTMLタグで、頭字語についての追加情報を提供します。</p>\r
528 \r
529 <h2>イベント登録の仕方</h2>\r
530 \r
531 <p>イベント登録に必要なステップは以下になります。</p>\r
532 \r
533 <ol>\r
534     <li><code>getEventList</code> メソッドから返る配列にイベント名を追加します。</li>\r
535     <li><code>event_EventName($data)</code> という形でメソッドを生成し、この中でイベントを処理します。</li>\r
536 </ol>\r
537 \r
538 <p>複数のプラグインが同じイベントに登録できます。管理エリアのプラグインリストの順序に従ってプラグインに通知が行きます。リストの上にあるプラグインほど早く通知されます。</p>\r
539 \r
540 <h2>パラメータ</h2>\r
541 \r
542 <p><code>event_EventName</code> メソッドはひとつだけ <code>$data</code> パラメータを持ち、それはイベントごとに内容が異なります。これは連想配列です。この連想配列に渡されたオブジェクトや配列は<strong>参照形式</strong>で渡されるため、これらに加えた変更は記憶されます。</p>\r
543 \r
544 <p>以下のイベントリストは、パラメータ変更がNucleusに知られるかどうかを示すために色を使い分けています。</p>\r
545 \r
546 <ul>\r
547     <li><var class="ref">参照渡し(緑)</var>: この種のパラメータに変更を加えるとNucleusに知られます。</li>\r
548     <li><var class="ro">値渡し(赤)</var>: プラグインイベントハンドラに渡される前に値がコピーされます。これらの変数への変更は自動的に破棄されます。.</li>\r
549 </ul>\r
550 \r
551 <p>パラメータとして渡されるオブジェクトは<var class="obj">object</var>.として示されます。ほとんどのオブジェクトは参照渡しで、<var class="obj ref">object by ref</var>のように示されます。</p>\r
552 \r
553 <h2>イベントリスト</h2>\r
554 \r
555 <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
556     <caption>プラグインが登録できるイベント</caption>\r
557     <tr>\r
558         <th abbr="name">イベントの名前</th><th abbr="timing">イベントが発生するタイミング</th><th abbr="param">プラグインに渡されるパラメータ</th>\r
559     </tr>\r
560     <tr>\r
561         <td>InitSkinParse</td>\r
562         <td>スキンの初期化の直前</td>\r
563         <td><dl>\r
564             <dt class="obj ref">skin</dt>\r
565             <dd>パースする<code>SKIN</code>オブジェクト</dd>\r
566             <dt class="ro">type</dt>\r
567             <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>\r
568         </dl></td>\r
569     </tr>\r
570     <tr>\r
571         <td>PreSkinParse</td>\r
572         <td>スキンのパースの直前</td>\r
573         <td><dl>\r
574             <dt class="obj ref">skin</dt>\r
575             <dd>パースする<code>SKIN</code>オブジェクト</dd>\r
576             <dt class="ro">type</dt>\r
577             <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>\r
578             <dt class="ref">contents</dt>\r
579             <dd>スキンの内容</dd>\r
580         </dl></td>      \r
581     </tr>\r
582     <tr>\r
583         <td>PostSkinParse</td>\r
584         <td>スキンのパースの直後</td>\r
585         <td><dl>\r
586             <dt class="obj ref">skin</dt>\r
587             <dd>パースする<code>SKIN</code>オブジェクト</dd>\r
588             <dt class="ro">type</dt>\r
589             <dd>スキンタイプ('index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'fileparser'のいずれか)</dd>\r
590         </dl></td>\r
591     </tr>\r
592     <tr>\r
593         <td>PreItem</td>\r
594         <td>アイテムのパース前、ただしアイテムヘッダーのパース後</td>\r
595         <td><dl>\r
596             <dt class="ref obj">blog</dt>\r
597             <dd><code>BLOG</code> オブジェクト</dd>\r
598             <dt class="ref obj">item</dt>\r
599             <dd>アイテムデータを持つオブジェクト</dd>\r
600         </dl></td>      \r
601     </tr>\r
602     <tr>\r
603         <td>PostItem</td>\r
604         <td>アイテムのパース後、ただしアイテムフッターのパース前</td>\r
605         <td><dl>\r
606             <dt class="ref obj">blog</dt>\r
607             <dd><code>BLOG</code> オブジェクト</dd>\r
608             <dt class="ref obj">item</dt>\r
609             <dd>アイテムデータを持つオブジェクト</dd>\r
610         </dl></td>      \r
611     </tr>\r
612     <tr>\r
613         <td>PreComment</td>\r
614         <td>コメントの表示前</td>\r
615         <td><dl>\r
616             <dt class="ref">comment</dt>\r
617             <dd>コメントデータを持つ連想配列</dd>\r
618         </dl></td>      \r
619     </tr>\r
620     <tr>\r
621         <td>PostComment</td>\r
622         <td>コメントの表示後</td>\r
623         <td><dl>\r
624             <dt class="ref">comment</dt>\r
625             <dd>コメントデータを持つ連想配列</dd>\r
626         </dl></td>      \r
627     </tr>\r
628     <tr>\r
629         <td>PreDateHead</td>\r
630         <td>日付ヘッダーのパース前</td>\r
631         <td><dl>\r
632             <dt class="obj ref">blog</dt>\r
633             <dd><code>BLOG</code> オブジェクト</dd>\r
634             <dt class="ro">timestamp</dt>\r
635             <dd>日付ヘッダーのタイムスタンプ</dd>\r
636         </dl></td>      \r
637     </tr>\r
638     <tr>\r
639         <td>PostDateHead</td>\r
640         <td>日付ヘッダーのパース後</td>\r
641         <td><dl>\r
642             <dt class="obj ref">blog</dt>\r
643             <dd><code>BLOG</code> オブジェクト</dd>\r
644             <dt class="ro">timestamp</dt>\r
645             <dd>日付ヘッダーのタイムスタンプ</dd>\r
646         </dl></td>      \r
647     </tr>\r
648     <tr>\r
649         <td>PreDateFoot</td>\r
650         <td>日付フッターのパース前</td>\r
651         <td><dl>\r
652             <dt class="ref obj">blog</dt>\r
653             <dd><code>BLOG</code> オブジェクト</dd>\r
654             <dt class="ro">timestamp</dt>\r
655             <dd>日付フッターのタイムスタンプ</dd>\r
656         </dl></td>      \r
657     </tr>\r
658     <tr>\r
659         <td>PostDateFoot</td>\r
660         <td>日付フッターのパース後</td>\r
661         <td><dl>\r
662             <dt class="ref obj">blog</dt>\r
663             <dd><code>BLOG</code> オブジェクト</dd>\r
664             <dt class="ro">timestamp</dt>\r
665             <dd>日付フッターのタイムスタンプ</dd>\r
666         </dl></td>      \r
667     </tr>   \r
668     <tr>\r
669         <td>LoginSuccess</td>\r
670         <td>ログイン成功後</td>\r
671         <td><dl>\r
672             <dt class="obj ref">member</dt>\r
673             <dd><code>MEMBER</code> オブジェクト</dd>\r
674         </dl></td>      \r
675     </tr>\r
676     <tr>\r
677         <td>LoginFailed</td>\r
678         <td>ログイン失敗後</td>\r
679         <td><dl>\r
680             <dt class="ro">username</dt>\r
681             <dd>ログイン時に使われたユーザー名</dd>\r
682         </dl></td>      \r
683     </tr>\r
684     <tr>\r
685         <td>Logout</td>\r
686         <td>ログアウト後</td>\r
687         <td><dl>\r
688             <dt class="ro">username</dt>\r
689             <dd>ログアウト時のユーザー名</dd>\r
690         </dl></td>      \r
691     </tr>\r
692     <tr>\r
693         <td>PreBlogContent</td>\r
694         <td>blogの内容がスキン変数を通して挿入される前</td>\r
695         <td><dl>\r
696             <dt class="obj ref">blog</dt>\r
697             <dd><code>BLOG</code> オブジェクト</dd>\r
698             <dt class="ro">type</dt>\r
699             <dd>呼び出されたスキン変数 ('blog', 'otherblog', 'archive', 'archivelist', 'item', 'searchresults', 'othersearchresults', 'categorylist', 'otherarchive', 'otherarchivelist')</dd>\r
700         </dl></td>      \r
701     </tr>\r
702     <tr>\r
703         <td>PostBlogContent</td>\r
704         <td>blogの内容がスキン変数を通して挿入された後</td>\r
705         <td><dl>\r
706             <dt class="obj ref">blog</dt>\r
707             <dd><code>BLOG</code> オブジェクト</dd>\r
708             <dt class="ro">type</dt>\r
709             <dd>呼び出されたスキン変数 ('blog', 'otherblog', 'archive', 'archivelist', 'item', 'searchresults', 'othersearchresults', 'categorylist', 'otherarchive', 'otherarchivelist')</dd>\r
710         </dl></td>      \r
711     </tr>\r
712     <tr>\r
713         <td>PreAddComment</td>\r
714         <td>コメントがデータベースに追加される前</td>\r
715         <td><dl>\r
716             <dt class="ref">comment</dt>\r
717             <dd>コメントデータ(連想配列)</dd>\r
718             <dt class="ref">spamcheck</dt>\r
719             <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返されるデータ構造(連想配列)</dd>\r
720         </dl></td>      \r
721     </tr>\r
722     <tr>\r
723         <td>PostAddComment</td>\r
724         <td>コメントがデータベースに追加された後</td>\r
725         <td><dl>\r
726             <dt class="ref">comment</dt>\r
727             <dd>コメントデータ(連想配列)</dd>\r
728             <dt class="ref">commentid</dt>\r
729             <dd>コメントのID</dd>\r
730             <dt class="ref">spamcheck</dt>\r
731             <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返されるデータ構造(連想配列)</dd>\r
732         </dl></td>      \r
733     </tr>\r
734     <tr>\r
735         <td>PostRegister</td>\r
736         <td>新規ユーザーの登録後</td>\r
737         <td><dl>\r
738             <dt class="obj ref">member</dt>\r
739             <dd>新しい<code>MEMBER</code> オブジェクト</dd>\r
740         </dl></td>      \r
741     </tr>\r
742     <tr>\r
743         <td>PostAddItem</td>\r
744         <td>アイテムがデータベースに追加された後</td>\r
745         <td><dl>\r
746             <dt class="ro">itemid</dt>\r
747             <dd>データベースに出来た新しい itemid</dd>\r
748         </dl></td>      \r
749     </tr>\r
750     <tr>\r
751         <td>PostUpdateItem</td>\r
752         <td>アイテムがデータベースにアップデートされた直後</td>\r
753         <td><dl>\r
754             <dt class="ro">itemid</dt>\r
755             <dd>アイテムのID</dd>\r
756         </dl></td>\r
757     </tr>\r
758     <tr>\r
759         <td>PreAddItem</td>\r
760         <td>アイテムがデータベースに追加される直前</td>\r
761         <td><dl>\r
762             <dt class="ref">title</dt>\r
763             <dd>タイトル</dd>\r
764             <dt class="ref">body</dt>\r
765             <dd>本文</dd>\r
766             <dt class="ref">more</dt>\r
767             <dd>拡張テキスト</dd>\r
768             <dt class="ref obj">blog</dt>\r
769             <dd><code>BLOG</code> オブジェクト</dd>\r
770             <dt class="ref">authorid</dt>\r
771             <dd>執筆者ID</dd>\r
772             <dt class="ref">timestamp</dt>\r
773             <dd>UNIX タイムスタンプ</dd>\r
774             <dt class="ref">closed</dt>\r
775             <dd>1 (コメント不可) or 0 (コメント可)</dd>\r
776             <dt class="ref">draft</dt>\r
777             <dd>1 (ドラフト) or 0 (非ドラフト)</dd>\r
778             <dt class="ref">catid</dt>\r
779             <dd>カテゴリーID</dd>\r
780         </dl></td>      \r
781     </tr>   \r
782     <tr>\r
783         <td>PreUpdateItem</td>\r
784         <td>データベースにあるアイテムが更新される直前</td>\r
785         <td><dl>\r
786             <dt class="ro">itemid</dt>\r
787             <dd>アイテム ID</dd>\r
788             <dt class="ref">title</dt>\r
789             <dd>タイトル</dd>\r
790             <dt class="ref">body</dt>\r
791             <dd>本文</dd>\r
792             <dt class="ref">more</dt>\r
793             <dd>拡張テキスト</dd>\r
794             <dt class="ref obj">blog</dt>\r
795             <dd><code>BLOG オブジェクト</code> object</dd>\r
796             <dt class="ref">closed</dt>\r
797             <dd>1 (コメント不可) or 0 (コメント可)</dd>\r
798             <dt class="ref">catid</dt>\r
799             <dd>カテゴリーID</dd>\r
800         </dl></td>      \r
801     </tr>\r
802     <tr>\r
803         <td>PrepareItemForEdit</td>\r
804         <td>アイテムをデータベースから取得した直後で、編集のためにユーザーに表示される前</td>\r
805         <td><dl>\r
806             <dt class="ref">item</dt>\r
807             <dd>アイテムデータを持つ連想配列</dd>\r
808         </dl></td>      \r
809     </tr>\r
810     <tr>\r
811         <td>PreUpdateComment</td>\r
812         <td>コメントが更新され、データベースに保存される直前</td>\r
813         <td><dl>\r
814             <dt class="ref">body</dt>\r
815             <dd>コメント本文</dd>\r
816         </dl></td>      \r
817     </tr>\r
818     <tr>\r
819         <td>PrepareCommentForEdit</td>\r
820         <td>コメントをデータベースから取得した直後で、編集のためにユーザーに表示される前</td>\r
821         <td><dl>\r
822             <dt class="ref">comment</dt>\r
823             <dd>コメントデータ(連想配列)</dd>\r
824         </dl></td>      \r
825     </tr>\r
826     <tr>\r
827         <td>PrePluginOptionsEdit</td>\r
828         <td>\r
829             <ul>\r
830                 <li>(v2.0b) 'プラグインオプションの編集'フォームが生成される前</li>\r
831                 <li>(v2.2) パラメータ追加</li>\r
832                 <li>(v3.2) 各オプションにパラメータ追加</li>\r
833             </ul>\r
834         </td>\r
835         <td><dl>\r
836             <dt class="ro">context</dt>\r
837             <dd>(v2.2) <code>global</code>, <code>blog</code>, <code>member</code>, <code>item</code>, <code>category</code>のいずれか</dd>\r
838             <dt class="ref">options</dt>\r
839             <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
840             <code>extra</code>フィールドを用いて、オプションに追加HTML(たとえばフォームのコントロール)を追加できます。もしそうする場合、 <code>extra</code> に追加する前に <code>pid</code> と <code>getID()</code> を比較し、さらに <code>name</code> をチェックすべきです。</dd>\r
841             <dt class="ro">plugid</dt>\r
842             <dd>プラグイン ID (これが気になるなら、<code>GetID()</code>を見ると理解できる)(コンテクストがglobalのときのみ存在)</dd>\r
843             <dt class="ro">contextid</dt>\r
844             <dd>コンテクスト ID (blogid, memberid, catid, itemid コンテクストによる)</dd>\r
845 \r
846         </dl></td>      \r
847     </tr>   \r
848     <tr>\r
849         <td>PrePluginOptionsUpdate</td>\r
850         <td>\r
851             (v3.2) プラグインオプションが更新される前。(このイベントを使ってオプションの新しい値を評価したり変更したりできます)\r
852         </td>\r
853         <td><dl>\r
854             <dt class="ro">context</dt>\r
855             <dd>(v2.2) <code>global</code>, <code>member</code>, <code>blog</code>, <code>item</code>, <code>category</code>のいずれか</dd>\r
856             <dt class="ro">plugid</dt>\r
857             <dd>プラグイン ID (これが気になるなら、<code>GetID()</code>を見ると理解できる)</dd>\r
858             <dt class="ro">optionname</dt>\r
859             <dd>オプション名</dd>\r
860             <dt class="ro">contextid</dt>\r
861             <dd>コンテクスト ID (blogid, memberid, catid, itemid コンテクストによる)</dd>\r
862             <dt class="ref">value</dt>\r
863             <dd>そのオプションの新しい値</dd>\r
864         </dl></td>\r
865 \r
866     </tr>\r
867 \r
868     <tr>\r
869         <td>PostPluginOptionsUpdate</td>\r
870         <td>\r
871             <ul>\r
872                 <li>(v2.0b) プラグインオプションの更新後</li>\r
873                 <li>(v2.2) コンテクストによって異なるパラメータ</li>\r
874             </ul>\r
875         </td>\r
876         <td><dl>\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>を見ると理解できる)(globalコンテクスト)</dd>\r
881             <dt class="ro">blogid</dt>\r
882             <dd>(v2.2) blog ID (blog コンテクスト)</dd>         \r
883             <dt class="ref obj">blog</dt>\r
884             <dd>(v2.2) BLOG オブジェクト (blog コンテクスト)</dd>           \r
885             <dt class="ro">memberid</dt>\r
886             <dd>(v2.2) member ID (member コンテクスト)</dd>         \r
887             <dt class="ref obj">member</dt>\r
888             <dd>(v2.2) MEMBER オブジェクト (member コンテクスト)</dd>           \r
889             <dt class="ro">catid</dt>\r
890             <dd>(v2.2) category ID (category コンテクスト)</dd>         \r
891             <dt class="ro">itemid</dt>\r
892             <dd>(v2.2) item ID (item コンテクスト)</dd>\r
893             <dt class="ref obj">member</dt>\r
894             <dd>(v2.2) ITEM オブジェクト (item コンテクスト)</dd>\r
895         </dl></td>      \r
896         \r
897     </tr>   \r
898     <tr>\r
899         <td>PostAuthentication</td>\r
900         <td>(v2.0b) ログイン処理の完了後。ページリクエストごとに発生</td>\r
901         <td><dl>\r
902             <dt class="ro">loggedIn</dt>\r
903             <dd><code>$member-&gt;isLoggedIn()</code>の戻り値</dd>\r
904         </dl></td>      \r
905     </tr>       \r
906     <tr>\r
907         <td>PreAddItemForm</td>\r
908         <td>(v2.0b) アイテム追加フォーム(ブックマークレットまたは管理エリア)が生成される直前</td>\r
909         <td><dl>\r
910             <dt class="ref">contents</dt>\r
911             <dd>連想配列への参照。そのうちの'title', 'body', 'more'にはフォームフィールドへの初期値を与えることができます。複数のプラグイン間でこれらの値の変更を避けるには、処理後に'hasBeenSet'の値を1にセットします(かつ処理前にこの値をチェックするようにします)</dd>\r
912             <dt class="ref obj">blog</dt>\r
913             <dd><code>BLOG</code> オブジェクトへの参照</dd>\r
914         </dl></td>      \r
915     </tr>       \r
916     <tr>\r
917         <td>AddItemFormExtras</td>\r
918         <td>(v2.0b) アイテム追加ページまたはブックマークレット内部のどこか。<code>template</code> ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。</td>\r
919         <td><dl>\r
920             <dt class="ref obj">blog</dt>\r
921             <dd><code>BLOG</code> オブジェクトへの参照</dd>\r
922         </dl></td>      \r
923     </tr>           \r
924     <tr>\r
925         <td>EditItemFormExtras</td>\r
926         <td>\r
927             (v2.0b) アイテム編集ページまたはブックマークレット内部のどこか。<code>template</code> ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。<br style="margin-bottom:1.5em;" />\r
928 \r
929             あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。\r
930 <pre class="example"><code>&lt;h3&gt;プラグイン名&lt;/h3&gt;\r
931 &lt;p&gt;追加フォームの内容&lt;/p&gt;</code></pre>\r
932         このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。\r
933         </td>\r
934         <td><dl>\r
935             <dt class="ref obj">blog</dt>\r
936             <dd><code>BLOG</code> オブジェクトへの参照</dd>\r
937             <dt class="ro">variables</dt>\r
938             <dd>\r
939                 (read-only) 編集されるアイテムに関する全ての情報を持つ連想配列: 'itemid', 'draft', 'closed', 'title', 'body', 'more', 'author', 'authorid', 'timestamp', 'karmapos', 'karmaneg', 'catid'\r
940             </dd>           \r
941             <dt class="ro">itemid</dt>\r
942             <dd>アイテム IDへのショートカット</dd>\r
943         </dl></td>      \r
944     </tr>               \r
945     <tr>\r
946         <td>BlogSettingsFormExtras</td>\r
947         <td>(v2.0) blog設定ページにフォームを追加可能\r
948             <br style="margin-bottom:1.5em;" />\r
949             あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。\r
950 <pre class="example"><code>&lt;h4&gt;プラグイン名&lt;/h4&gt;\r
951 &lt;form method="post" action="..."&gt;&lt;p&gt;\r
952 追加フォームの内容\r
953 &lt;/p&gt;&lt;/form&gt;</code></pre>\r
954             このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。\r
955         \r
956         </td>\r
957         <td><dl>\r
958             <dt class="obj ref">blog</dt>\r
959             <dd><code>BLOG</code> オブジェクトへの参照</dd>\r
960         </dl></td>      \r
961     </tr>\r
962     <tr>\r
963         <td>PreDeleteItem</td>\r
964         <td>(v2.0) アイテムがデータベースから削除される直前</td>\r
965         <td><dl>\r
966             <dt class="ro">itemid</dt>\r
967             <dd>削除されるアイテムID</dd>\r
968         </dl></td>      \r
969     </tr>\r
970     <tr>\r
971         <td>PostDeleteItem</td>\r
972         <td>(v2.0) アイテムがデータベースから削除された直後</td>\r
973         <td><dl>\r
974             <dt class="ro">itemid</dt>\r
975             <dd>削除されたアイテムID</dd>\r
976         </dl></td>      \r
977     </tr>\r
978     <tr>\r
979         <td>PreDeleteCategory</td>\r
980         <td>(v2.0) カテゴリーがデータベースから削除される直前</td>\r
981         <td><dl>\r
982             <dt class="ro">catid</dt>\r
983             <dd>削除されるカテゴリー ID</dd>\r
984         </dl></td>      \r
985     </tr>\r
986     <tr>\r
987         <td>PostDeleteCategory</td>\r
988         <td>(v2.0) カテゴリーがデータベースから削除された直後</td>\r
989         <td><dl>\r
990             <dt class="ro">catid</dt>\r
991             <dd>削除されたカテゴリー ID</dd>\r
992         </dl></td>      \r
993     </tr>   \r
994     <tr>\r
995         <td>PreDeleteBlog</td>\r
996         <td>(v2.0) blogがデータベースから削除される直前</td>\r
997         <td><dl>\r
998             <dt class="ro">blogid</dt>\r
999             <dd>削除されるblogID</dd>\r
1000         </dl></td>      \r
1001     </tr>\r
1002     <tr>\r
1003         <td>PostDeleteBlog</td>\r
1004         <td>(v2.0) blogがデータベースから削除された直後</td>\r
1005         <td><dl>\r
1006             <dt class="ro">blogid</dt>\r
1007             <dd>削除されたblogID</dd>\r
1008         </dl></td>      \r
1009     </tr>   \r
1010     <tr>\r
1011         <td>PreDeleteMember</td>\r
1012         <td>(v2.0) メンバーがデータベースから削除される直前</td>\r
1013         <td><dl>\r
1014             <dt class="ref obj">member</dt>\r
1015             <dd><code>削除されるメンバーに関するMEMBER</code> オブジェクトへの参照</dd>\r
1016         </dl></td>      \r
1017     </tr>\r
1018     <tr>\r
1019         <td>PostDeleteMember</td>\r
1020         <td>(v2.0) メンバーがデータベースから削除された直後</td>\r
1021         <td><dl>\r
1022             <dt class="ref obj">member</dt>\r
1023             <dd><code>削除されるメンバーに関するMEMBER</code> オブジェクトへの参照</dd>\r
1024         </dl></td>      \r
1025     </tr>   \r
1026     <tr>\r
1027         <td>PreDeleteTeamMember</td>\r
1028         <td>(v2.0) メンバーがweblogチームから削除される直前</td>\r
1029         <td><dl>\r
1030             <dt class="ref obj">member</dt>\r
1031             <dd><code>MEMBER</code> オブジェクトへの参照</dd>\r
1032             <dt class="ro">blogid</dt>\r
1033             <dd>blogID</dd>\r
1034         </dl></td>      \r
1035     </tr>\r
1036     <tr>\r
1037         <td>PostDeleteTeamMember</td>\r
1038         <td>(v2.0) メンバーがweblogチームから削除された直後</td>\r
1039         <td><dl>\r
1040             <dt class="ref obj">member</dt>\r
1041             <dd><code>MEMBER</code> オブジェクトへの参照</dd>\r
1042             <dt class="ro">blogid</dt>\r
1043             <dd>blogID</dd>\r
1044         </dl></td>      \r
1045     </tr>\r
1046     <tr>\r
1047         <td>PreDeleteComment</td>\r
1048         <td>(v2.0) コメントがデータベースから削除される直前</td>\r
1049         <td><dl>\r
1050             <dt class="ro">commentid</dt>\r
1051             <dd>削除されるコメントID</dd>\r
1052         </dl></td>      \r
1053     </tr>\r
1054     <tr>\r
1055         <td>PostDeleteComment</td>\r
1056         <td>(v2.0) コメントがデータベースから削除された直後</td>\r
1057         <td><dl>\r
1058             <dt class="ro">commentid</dt>\r
1059             <dd>削除されたコメントID</dd>\r
1060         </dl></td>      \r
1061     </tr>       \r
1062     <tr>\r
1063         <td>ActionLogCleared</td>\r
1064         <td>(v2.0) アクションログが消去された後</td>\r
1065         <td>なし</td>       \r
1066     </tr>\r
1067     <tr>\r
1068         <td>PreDeleteTemplate</td>\r
1069         <td>(v2.0) テンプレートがデータベースから削除される直前</td>\r
1070         <td><dl>\r
1071             <dt class="ro">templateid</dt>\r
1072             <dd>削除されるテンプレートID</dd>\r
1073         </dl></td>      \r
1074     </tr>\r
1075     <tr>\r
1076         <td>PostDeleteTemplate</td>\r
1077         <td>(v2.0) テンプレートがデータベースから削除された直後</td>\r
1078         <td><dl>\r
1079             <dt class="ro">templateid</dt>\r
1080             <dd>削除されたテンプレートID</dd>\r
1081         </dl></td>      \r
1082     </tr>       \r
1083     <tr>\r
1084         <td>PreDeleteSkin</td>\r
1085         <td>(v2.0) スキンがデータベースから削除される直前</td>\r
1086         <td><dl>\r
1087             <dt class="ro">skinid</dt>\r
1088             <dd>削除されるスキンID</dd>\r
1089         </dl></td>      \r
1090     </tr>\r
1091     <tr>\r
1092         <td>PostDeleteSkin</td>\r
1093         <td>(v2.0) スキンがデータベースから削除された直後</td>\r
1094         <td><dl>\r
1095             <dt class="ro">skinid</dt>\r
1096             <dd>削除されたスキンID</dd>\r
1097         </dl></td>      \r
1098     </tr>   \r
1099     <tr>\r
1100         <td>PreDeletePlugin</td>\r
1101         <td>(v2.0) プラグインがデータベースから削除される直前</td>\r
1102         <td><dl>\r
1103             <dt class="ro">plugid</dt>\r
1104             <dd>削除されるプラグインID</dd>\r
1105         </dl></td>      \r
1106     </tr>\r
1107     <tr>\r
1108         <td>PostDeletePlugin</td>\r
1109         <td>(v2.0) プラグインがデータベースから削除された直後</td>\r
1110         <td><dl>\r
1111             <dt class="ro">plugid</dt>\r
1112             <dd>削除されたプラグインID</dd>\r
1113         </dl></td>      \r
1114     </tr>       \r
1115     <tr>\r
1116         <td>PreDeleteBan</td>\r
1117         <td>(v2.0) 禁止IPがデータベースから削除される直前</td>\r
1118         <td><dl>\r
1119             <dt class="ro">blogid</dt>\r
1120             <dd>禁止IPが削除されるblogのID</dd>\r
1121             <dt class="ro">iprange</dt>\r
1122             <dd>禁止されたIPレンジ</dd>         \r
1123         </dl></td>      \r
1124     </tr>\r
1125     <tr>\r
1126         <td>PostDeleteBan</td>\r
1127         <td>(v2.0) 禁止IPがデータベースから削除された直後</td>\r
1128         <td><dl>\r
1129             <dt class="ro">blogid</dt>\r
1130             <dd>禁止IPが削除されたblogのID</dd>\r
1131             <dt class="ro">iprange</dt>\r
1132             <dd>禁止されたIPレンジ</dd>         \r
1133         </dl></td>      \r
1134     </tr>           \r
1135     <tr>\r
1136         <td>PreAddCategory</td>\r
1137         <td>(v2.0) 新しいカテゴリーがデータベースに生成される直前</td>\r
1138         <td><dl>\r
1139             <dt class="ref obj">blog</dt>\r
1140             <dd><code>BLOG</code> オブジェクトの参照</dd>\r
1141             <dt class="ref">name</dt>\r
1142             <dd>新しいカテゴリー名</dd>         \r
1143             <dt class="ref">description</dt>\r
1144             <dd>新しいカテゴリーの説明</dd>\r
1145         </dl></td>      \r
1146     </tr>\r
1147     <tr>\r
1148         <td>PostAddCategory</td>\r
1149         <td>(v2.0) 新しいカテゴリーがデータベースに生成された直後</td>\r
1150         <td><dl>\r
1151             <dt class="ref obj">blog</dt>\r
1152             <dd><code>BLOG</code> オブジェクトへの参照</dd>\r
1153             <dt class="ro">name</dt>\r
1154             <dd>新しいカテゴリー名</dd>         \r
1155             <dt class="ro">description</dt>\r
1156             <dd>新しいカテゴリーの説明</dd>\r
1157             <dt class="ro">catid</dt>\r
1158             <dd>新しいカテゴリー ID</dd>            \r
1159         </dl></td>      \r
1160     </tr>\r
1161     <tr>\r
1162         <td>PreAddBlog</td>\r
1163         <td>(v2.0) 新しいblogが生成される直前</td>\r
1164         <td><dl>\r
1165             <dt class="ref">name</dt>\r
1166             <dd>新しい blog名</dd>\r
1167             <dt class="ref">shortname</dt>\r
1168             <dd>新しい blogの短縮名</dd>\r
1169             <dt class="ref">timeoffset</dt>\r
1170             <dd>新しい blogのタイムオフセット</dd>\r
1171             <dt class="ref">description</dt>\r
1172             <dd>新しい blogの説明</dd>\r
1173             <dt class="ref">defaultskin</dt>\r
1174             <dd>新しいblogのデフォルトスキンのID</dd>\r
1175         </dl></td>      \r
1176     </tr>\r
1177     <tr>\r
1178         <td>PostAddBlog</td>\r
1179         <td>(v2.0) 新しいblogが生成された直後</td>\r
1180         <td><dl>\r
1181             <dt class="ref obj">blog</dt>\r
1182             <dd>新しい<code>BLOG</code> オブジェクト</dd>\r
1183         </dl></td>      \r
1184     </tr>\r
1185     <tr>\r
1186         <td>PreAddPlugin</td>\r
1187         <td>(v2.0) プラグインが追加される直前</td>\r
1188         <td><dl>\r
1189             <dt class="ref">file</dt>\r
1190             <dd>新しいプラグインのファイル名</dd>\r
1191         </dl></td>      \r
1192     </tr>\r
1193     <tr>\r
1194         <td>PostAddPlugin</td>\r
1195         <td>(v2.0) プラグインが追加された直後</td>\r
1196         <td><dl>\r
1197             <dt class="ref obj">plugin</dt>\r
1198             <dd>新しく追加されたプラグインのオブジェクト</dd>\r
1199         </dl></td>      \r
1200     </tr>\r
1201     <tr>\r
1202         <td>PreAddTeamMember</td>\r
1203         <td>(v2.0) メンバーがblogチームに追加される直前</td>\r
1204         <td><dl>\r
1205             <dt class="ref obj">blog</dt>\r
1206             <dd><code>BLOG</code> オブジェクト</dd>\r
1207             <dt class="ref obj">member</dt>\r
1208             <dd><code>MEMBER</code> オブジェクト</dd>\r
1209             <dt class="ref">admin</dt>\r
1210             <dd>新しく追加されたメンバーが管理権限を持っているかどうかを示すブール値</dd>\r
1211         </dl></td>      \r
1212     </tr>\r
1213     <tr>\r
1214         <td>PostAddTeamMember</td>\r
1215         <td>(v2.0) メンバーがblogチームに追加された直後</td>\r
1216         <td><dl>\r
1217             <dt class="ref obj">blog</dt>\r
1218             <dd><code>BLOG</code> オブジェクト</dd>\r
1219             <dt class="ref obj">member</dt>\r
1220             <dd><code>MEMBER</code> オブジェクト</dd>\r
1221             <dt class="ro">admin</dt>\r
1222             <dd>新しく追加されたメンバーが管理権限を持っているかどうかを示すブール値</dd>\r
1223         </dl></td>      \r
1224     </tr>\r
1225     <tr>\r
1226         <td>PreAddTemplate</td>\r
1227         <td>(v2.0) 新しいテンプレートが生成される直前(注:テンプレートが複製されたときも呼ばれる)</td>\r
1228         <td><dl>\r
1229             <dt class="ref">name</dt>\r
1230             <dd>新しいテンプレート名</dd>\r
1231             <dt class="ref">description</dt>\r
1232             <dd>新しいテンプレートの説明</dd>\r
1233         </dl></td>      \r
1234     </tr>\r
1235     <tr>\r
1236         <td>PostAddTemplate</td>\r
1237         <td>(v2.0) 新しいテンプレートが生成された直後</td>\r
1238         <td><dl>\r
1239             <dt class="ro">name</dt>\r
1240             <dd>新しいテンプレート名</dd>\r
1241             <dt class="ro">description</dt>\r
1242             <dd>新しいテンプレートの説明</dd>\r
1243             <dt class="ro">templateid</dt>\r
1244             <dd>新しいテンプレートID</dd>\r
1245         </dl></td>      \r
1246     </tr>   \r
1247     <tr>\r
1248         <td>PreAddSkin</td>\r
1249         <td>(v2.0) 新しいスキンが生成される直前(注:スキンが複製されたときも呼ばれる)</td>\r
1250         <td><dl>\r
1251             <dt class="ref">name</dt>\r
1252             <dd>新しいスキン名</dd>\r
1253             <dt class="ref">description</dt>\r
1254             <dd>新しいスキン名の説明</dd>\r
1255             <dt class="ref">type</dt>\r
1256             <dd>スキンのコンテントタイプ</dd>\r
1257             <dt class="ref">includeMode</dt>\r
1258             <dd>新しいスキンのインクルードモード</dd>\r
1259             <dt class="ref">includePrefix</dt>\r
1260             <dd>新しいスキンのインクルードプレフィックス</dd>\r
1261         </dl></td>      \r
1262     </tr>\r
1263     <tr>\r
1264         <td>PostAddSkin</td>\r
1265         <td>(v2.0) 新しいスキンが生成された直後</td>\r
1266         <td><dl>\r
1267             <dt class="ro">name</dt>\r
1268             <dd>新しいスキン名</dd>\r
1269             <dt class="ro">description</dt>\r
1270             <dd>新しいスキンの説明</dd>\r
1271             <dt class="ro">type</dt>\r
1272             <dd>スキンのコンテントタイプ</dd>\r
1273             <dt class="ro">includeMode</dt>\r
1274             <dd>新しいスキンのインクルードモード</dd>\r
1275             <dt class="ro">includePrefix</dt>\r
1276             <dd>新しいスキンのインクルードプレフィックス</dd>\r
1277             <dt class="ro">skinid</dt>\r
1278             <dd>新しいスキンID</dd>\r
1279         </dl></td>      \r
1280     </tr>       \r
1281     <tr>\r
1282         <td>PreAddBan</td>\r
1283         <td>(v2.0) 新しい禁止IPが追加される直前</td>\r
1284         <td><dl>\r
1285             <dt class="ref">blogid</dt>\r
1286             <dd>blogID</dd>\r
1287             <dt class="ref">iprange</dt>\r
1288             <dd>禁止されたIPレンジ</dd>\r
1289             <dt class="ref">reason</dt>\r
1290             <dd>禁止された理由を記述したテキストメッセージ</dd>\r
1291         </dl></td>      \r
1292     </tr>\r
1293     <tr>\r
1294         <td>PostAddBan</td>\r
1295         <td>(v2.0) 新しい禁止IPが追加された直後</td>\r
1296         <td><dl>\r
1297             <dt class="ro">blogid</dt>\r
1298             <dd>blogID</dd>\r
1299             <dt class="ro">iprange</dt>\r
1300             <dd>禁止されたIPレンジ</dd>\r
1301             <dt class="ro">reason</dt>\r
1302             <dd>禁止された理由を記述したテキストメッセージ</dd>\r
1303         </dl></td>      \r
1304     </tr>       \r
1305 \r
1306     <tr>\r
1307         <td>PreMoveItem</td>\r
1308         <td>(v2.0) アイテムが他のblog/カテゴリーに移される直前</td>\r
1309         <td><dl>\r
1310             <dt class="ref">itemid</dt>\r
1311             <dd>アイテムID</dd>\r
1312             <dt class="ref">destblogid</dt>\r
1313             <dd>移動先のblogID</dd>\r
1314             <dt class="ref">destcatid</dt>\r
1315             <dd>移動先のカテゴリーID</dd>           \r
1316         </dl></td>      \r
1317     </tr>\r
1318     <tr>\r
1319         <td>PostMoveItem</td>\r
1320         <td>(v2.0) アイテムが他のblog/カテゴリーに移された直後</td>\r
1321         <td><dl>\r
1322             <dt class="ro">itemid</dt>\r
1323             <dd>アイテムID</dd>\r
1324             <dt class="ro">destblogid</dt>\r
1325             <dd>新しいblogID</dd>\r
1326             <dt class="ro">destcatid</dt>\r
1327             <dd>新しいカテゴリーID</dd> \r
1328         </dl></td>      \r
1329     </tr>\r
1330     <tr>\r
1331         <td>PreMoveCategory</td>\r
1332         <td>(v2.0) カテゴリーが他のblogに移される直前</td>\r
1333         <td><dl>\r
1334             <dt class="ref">catid</dt>\r
1335             <dd>カテゴリーID</dd>\r
1336             <dt class="ref obj">sourceblog</dt>\r
1337             <dd>移動元の<code>BLOG</code> オブジェクト</dd>\r
1338             <dt class="ref obj">destblog</dt>\r
1339             <dd>移動先の<code>BLOG</code> オブジェクト</dd>         \r
1340         </dl></td>      \r
1341     </tr>\r
1342     <tr>\r
1343         <td>PostMoveCategory</td>\r
1344         <td>(v2.0) カテゴリーが他のblogに移された直後</td>\r
1345         <td><dl>\r
1346             <dt class="ro">catid</dt>\r
1347             <dd>カテゴリーID</dd>\r
1348             <dt class="ref obj">sourceblog</dt>\r
1349             <dd>移動元の<code>BLOG</code> オブジェクト</dd>\r
1350             <dt class="ref obj">destblog</dt>\r
1351             <dd>移動先の<code>BLOG</code> オブジェクト</dd>         \r
1352         </dl></td>      \r
1353     </tr>   \r
1354     <tr>\r
1355         <td>MemberSettingsFormExtras</td>\r
1356         <td><span style="display:block;margin-bottom:1.5em;">(v2.0) メンバー設定ページにフォームを追加可能</span>            \r
1357             あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。\r
1358 <pre class="example"><code>&lt;h4&gt;プラグイン名&lt;/h4&gt;\r
1359 &lt;form method="post" action="..."&gt;&lt;p&gt;\r
1360 追加フォームの内容\r
1361 &lt;/p&gt;&lt;/form&gt;</code></pre>\r
1362             このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。\r
1363         \r
1364         </td>\r
1365         <td><dl>\r
1366             <dt class="ref obj">member</dt>\r
1367             <dd><code>MEMBER</code> オブジェクトへの参照</dd>\r
1368         </dl></td>      \r
1369     </tr>\r
1370     <tr>\r
1371         <td>GeneralSettingsFormExtras</td>\r
1372         <td><span style="display:block;margin-bottom:1.5em;">(v2.0) 一般設定ページにフォームを追加可能</span>\r
1373             あまり多くのデータを追加しないこと。また以下のように<strong>正しいXHTML</strong>を生成してください。\r
1374 <pre class="example"><code>&lt;h4&gt;プラグイン名&lt;/h4&gt;\r
1375 &lt;form method="post" action="..."&gt;&lt;p&gt;\r
1376 追加フォームの内容\r
1377 &lt;/p&gt;&lt;/form&gt;</code></pre>\r
1378             このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 <code>plug_tb_url</code>)。\r
1379             \r
1380         </td>\r
1381         <td>なし</td>       \r
1382     </tr>\r
1383     <tr>\r
1384         <td>AdminPrePageHead</td>\r
1385         <td>(v2.5) 管理画面で、ページヘッドを出力する直前。このイベントはヘッド領域にスクリプトやCSSを追加するのに用いられます。</td>\r
1386         <td><dl>\r
1387             <dt class="ref">extrahead</dt>\r
1388             <dd>HTMLページのヘッド領域に埋め込まれる追加情報。ここに追加したいものを入れてください。</dd>\r
1389             <dt class="ro">action</dt>\r
1390             <dd>現在実行されているアクション、またはページタイプ</dd>\r
1391         </dl></td>\r
1392     </tr>\r
1393     <tr>\r
1394         <td>AdminPrePageFoot</td>\r
1395         <td>(v2.5) 管理画面で、ページフッターを出力する直前。</td>\r
1396       <td><dl>\r
1397             <dt class="ro">action</dt>\r
1398             <dd>現在実行されているアクション、またはページタイプ</dd>\r
1399         </dl></td>\r
1400     </tr>\r
1401     <tr>\r
1402         <td>PreSendContentType</td>\r
1403         <td>(v2.5) HTTPヘッダーにコンテントタイプがセットされる直前</td>\r
1404         <td><dl>\r
1405             <dt class="ref">contentType</dt>\r
1406             <dd>コンテントタイプ(<code>application/xhtml+xml</code>など)</dd>\r
1407             <dt class="ref">charset</dt>\r
1408             <dd>キャラクターセット</dd>\r
1409             <dt class="ro">pageType</dt>\r
1410             <dd>表示するページの種類を示す文字列:<code>skin</code> (スキンタイプ), <code>media</code> (メディアライブラリ), <code>admin-<em>action</em></code> (管理エリア), <code>bookmarklet-<em>action</em></code> (ブックマークレット)</dd>\r
1411         </dl></td>\r
1412     </tr>\r
1413     <tr>\r
1414         <td>QuickMenu</td>\r
1415         <td>(v2.5) 管理エリアのクイックメニューの一番下。そこへのプラグイン登録に利用されます。登録するにはoptionsに連想配列を入れます。実装例が<a href="#admin">プラグイン管理エリアを作る</a>のセクションにあります。</td>\r
1416         <td><dl>\r
1417             <dt class="ref">options</dt>\r
1418             <dd>配列</dd>\r
1419         </dl></td>\r
1420     </tr>\r
1421     <tr>\r
1422         <td>BookmarkletExtraHead</td>\r
1423         <td>(v2.5) ブックマークレット XHTMLコードのヘッド領域内。</td>\r
1424         <td><dl>\r
1425             <dt class="ref">extrahead</dt>\r
1426             <dd>XHTMLコードのヘッド領域に埋め込まれる追加情報。ここに追加したいものを入れてください。</dd>\r
1427         </dl></td>\r
1428     </tr>\r
1429     <tr>\r
1430         <td>FormExtra</td>\r
1431         <td>(v3.2) このイベントは、プラグインがコメント、メンバー間メール、認証フォームのいずれかのフォーム内に追加フィールドを挿入するときに使います。フォーム処理の際に発生する <code>ValidateForm</code> イベントに対応します。</td>\r
1432         <td><dl>\r
1433             <dt class="ro">type</dt>\r
1434             <dd>イベントを発生させるフォームタイプ\r
1435                 <ul>\r
1436                     <li><code>activation</code></li>\r
1437                     <li><code>additemform</code> (注:これは管理画面のアイテム追加フォームではない)</li>\r
1438                     <li><code>commentform-loggedin</code></li>\r
1439                     <li><code>commentform-notloggedin</code></li>\r
1440                     <li><code>membermailform-loggedin</code></li>\r
1441                     <li><code>membermailform-notloggedin</code></li>\r
1442                 </ul>\r
1443             </dd>\r
1444             <dt class="ro obj">member</dt>\r
1445             <dd><code>type</code> が <code>activation</code>のとき、このフィールドは認証メンバーの詳細情報を含みます</dd>\r
1446         </dl></td>\r
1447     </tr>\r
1448     <tr>\r
1449         <td>ValidateForm</td>\r
1450         <td>(v3.2) コメント、メンバー間メール、アカウント認証のいずれかが処理されるときに呼ばれます。プラグインはこれで各データの評価を実行でき、もし不具合があれば処理を中断できます。<code>FormExtra</code> と共に使うとフォームにフィールドを追加できます。</td>\r
1451         <td><dl>\r
1452             <dt class="ro">type</dt>\r
1453             <dd>処理されるフォームタイプ\r
1454                 <ul>\r
1455                     <li><code>membermail</code></li>\r
1456                     <li><code>comment</code></li>\r
1457                     <li><code>activation</code></li>\r
1458                 </ul>\r
1459             </dd>\r
1460             <dt class="ref">error</dt>\r
1461             <dd>フォーム処理をストップするときに、<code>error</code> フィールドに空でないエラーメッセージを記入します。このエラーメッセージはユーザー側に表示されます。</dd>\r
1462             <dt class="ref">comment</dt>\r
1463             <dd>コメントデータの連想配列(コメントフォームのときのみ)</dd>\r
1464             <dt class="ref">spamcheck</dt>\r
1465             <dd>(v3.3) <em>SpamCheck</em>イベントの結果として返される連想配列(コメントフォームのときのみ)</dd>\r
1466             <dt class="ro obj">member</dt>\r
1467             <dd>認証フォームのとき、認証中のメンバー情報を含みます。</dd>\r
1468         </dl></td>\r
1469     </tr>\r
1470     <tr>\r
1471         <td>ParseURL</td>\r
1472         <td>(v3.22)NucleusのコアでURLからアイテムやカテゴリのIDを読み取る前。プラグインはこのイベントを使ってURLを解釈します</td>\r
1473         <td><dl>\r
1474             <dt class="ro">type</dt>\r
1475             <dd>FancyURLの仮想ディレクトリ(拡張子無しファイル)のファイル名(item, blog, ...)</dd>\r
1476             <dt class="ro">info</dt>\r
1477             <dd>解決される前のURL(この名前は以前の変数名である<code>pathinfo</code>から来ています).</dd>\r
1478             <dt class="ref">complete</dt>\r
1479             <dd>プラグインがURLを解釈し終わるとこれが<strong>true</strong>にセットされます。<strong>false</strong>の場合はプラグインはURLを解釈していません。</dd>\r
1480         </dl></td>\r
1481     </tr>\r
1482     <tr>\r
1483         <td>GenerateURL</td>\r
1484         <td>(v3.22)URLが自動生成される前。このイベントを使って独自のURLを生成する事が出来ます。</td>\r
1485         <td><dl>\r
1486             <dt class="ro">type</dt>\r
1487             <dd>生成するURLのタイプ(item, blog, ...)</dd>\r
1488             <dt class="ro">params</dt>\r
1489             <dd>生成するURLに付加するパラメータ</dd>\r
1490             <dt class="ref">completed</dt>\r
1491             <dd>プラグインはURLを生成し終わるとこれを<strong>true</strong>にセットしてURLを返します。<strong>false</strong>の場合はプラグインはURLを生成していません。</dd>\r
1492             <dt class="ref">url</dt>\r
1493             <dd>プラグインが生成したURLを格納する為の空の変数</dd>\r
1494         </dl></td>\r
1495     </tr>\r
1496     <tr>\r
1497         <td>SpamCheck</td>\r
1498         <td>(v3.3) 新しいコメントが追加されるときに呼ばれます。アンチスパムのプラグインはこのイベントを使ってコメントがスパムかどうかマークを付けられます。<code>SpamCheck</code>イベントの詳しい説明は別の文書を参照のこと(<a href='http://wakka.xiffy.nl/spamcheck_api'>SpamCheck API 2.0</a>)</td>\r
1499         <td><dl>\r
1500             <dt class="ref">spamcheck</dt>\r
1501             <dd>spamcheckのデータ構造(連想配列)</dd>\r
1502         </dl></td>\r
1503     </tr>\r
1504     <tr>\r
1505         <td>PreMediaUpload</td>\r
1506         <td>(v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれる前。</td>\r
1507         <td><dl>\r
1508             <dt class="ref">collection</dt>\r
1509             <dd>アップロードされたファイルが格納されるべき「コレクション」</dd>\r
1510             <dt class="ro">uploadfile</dt>\r
1511             <dd>テンポラリディレクトリに狩り沖されているアップロードされたファイルのファイル名</dd>\r
1512             <dt class="ref">filename</dt>\r
1513             <dd>最終的に保存されるファイル名</dd>\r
1514         </dl></td>\r
1515     </tr>\r
1516     <tr>\r
1517         <td>PostMediaUpload</td>\r
1518         <td>(v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれた後。</td>\r
1519         <td><dl>\r
1520             <dt class="ro">collection</dt>\r
1521             <dd>アップロードされたファイルが格納された「コレクション」</dd>\r
1522             <dt class="ro">mediadir</dt>\r
1523             <dd>アップロードされたファイルが保存されたメディアディレクトリ</dd>\r
1524             <dt class="ro">filename</dt>\r
1525             <dd>保存されたファイル名</dd>\r
1526         </dl></td>\r
1527     </tr>\r
1528     <tr>\r
1529         <td>SendPing</td>\r
1530         <td>(v3.3)「ブログの設定」で「更新時にweblogsアップデート通知サービスへPingを送りますか?」が「はい」に設定されている時に限り、新しいアイテムを追加した時に呼び出されます(このイベントに対応しているプラグインがインストールされている時に限る)。このイベントはPing送信プラグインで各種「ブログ検索サービス」へ更新pingを送信します(例えば<a href="http://blogsearch.google.co.jp/">Googleブログ検索</a>など)</td>\r
1531         <td><dl>\r
1532             <dt class="ref">blogid</dt>\r
1533             <dd>アイテムが追加されたブログのID</dd>\r
1534         </dl></td>\r
1535     </tr>\r
1536     <tr>\r
1537         <td>JustPosted</td>\r
1538         <td>(v3.3)投稿された未来の日付のアイテムの設定時刻が来た時。このイベントはページの表示が完了した後に発生条件をチェックします。</td>\r
1539         <td><dl>\r
1540             <dt class="ref">blogid</dt>\r
1541             <dd>未来の日付のアイテムの設定時刻が来たブログのID</dd>\r
1542         </dl></td>\r
1543     </tr>\r
1544         <tr>\r
1545                 <td>RegistrationFormExtraFields</td>\r
1546                 <td>(v3.33) createaccount.php からビジターに表示されるアカウント作成フォームが表示され、FormExtra イベントが起きる前。プラグインはこのイベントによって、アカウント作成フォームに独自のフィールドを付け加える事が出来ます。PostRegister イベントに同時に登録すると、付け加えたフィールドの値を評価する事が出来る様になります。渡されるパラメータは、付け加えられたフィールドを、元々のフィールドと違和感無く表示させる為に使用されます。</td>\r
1547                 <td><dl>\r
1548                         <dt class="ro">type</dt>\r
1549                         <dd>アカウント作成フォームのタイプ。通常は <code>createaccount.php</code>。</dd>\r
1550                         <dt class="ro">prelabel</dt>\r
1551                         <dd>追加フィールドの「ラベル」の<strong>前に</strong>挿入される HTML コード</dd>\r
1552                         <dt class="ro">postlabel</dt>\r
1553                         <dd>追加フィールドの「ラベル」の<strong>後に</strong>挿入される HTML コード</dd>\r
1554                         <dt class="ro">prefield</dt>\r
1555                         <dd>追加フィールドの「入力フィールド」の<strong>前に</strong>挿入される HTML コード</dd>\r
1556                         <dt class="ro">postfield</dt>\r
1557                         <dd>追加フィールドの「入力フィールド」の<strong>後に</strong>挿入される HTML コード</dd>\r
1558                 </dl></td>\r
1559         </tr>\r
1560         <tr>\r
1561                 <td>TemplateExtraFields</td>\r
1562                 <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
1563                 <td><dl>\r
1564                         <dt class="ref">fields</dt>\r
1565                         <dd>プラグイン名をキーにした連想配列。配列の内容は、テンプレートのフィールド名をキーにした連想配列で、その値はフォームのフィールドに表示されるラベル。フィールド名は全て英数小文字で、フィールド名の重複を避けるためにプラグイン名を含んでいる事が好ましい。</dd>\r
1566                 </dl></td>\r
1567         </tr>\r
1568         <tr>\r
1569                 <td>PreArchiveListItem</td>\r
1570                 <td>(v3.40) アーカイブリストが表示される前。アーカイブリストを表示するために使われたテンプレートのアーカイブリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>\r
1571                 <td><dl>\r
1572                         <dt class="ref">listitem</dt>\r
1573                         <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>\r
1574                 </dl></td>\r
1575         </tr>\r
1576         <tr>\r
1577                 <td>PreCategoryListItem</td>\r
1578                 <td>(v3.40) カテゴリーリストが表示される前。カテゴリーリストを表示するために使われたテンプレートのカテゴリーリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>\r
1579                 <td><dl>\r
1580                         <dt class="ref">listitem</dt>\r
1581                         <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>\r
1582                 </dl></td>\r
1583         </tr>\r
1584         <tr>\r
1585                 <td>PreBlogListItem</td>\r
1586                 <td>(v3.40) ブログリストが表示される前。ブログリストを表示するために使われたテンプレートのブログリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。</td>\r
1587                 <td><dl>\r
1588                         <dt class="ref">listitem</dt>\r
1589                         <dd>テンプレート変数をキーにした連想配列。値はテンプレート変数に置き換えられる内容。この配列にキーと値のペアを追加する事で、新しい変数が追加できます。</dd>\r
1590                 </dl></td>\r
1591         </tr>\r
1592         <tr>\r
1593                 <td>PreTemplateRead</td>\r
1594                 <td>(v3.40) テンプレートが読み込まれる直前。読み込むテンプレートを変更する事が出来ます。NP_MultiLanguage はこのイベントを使用しています。</td>\r
1595                 <td><dl>\r
1596                         <dt class="ref">name</dt>\r
1597                         <dd>呼び出されるテンプレートの名前</dd>\r
1598                 </dl></td>\r
1599         </tr>\r
1600         <tr>\r
1601                 <td>CustomLogin</td>\r
1602                 <td>(v3.40) Nucleus にログインする直前。ログインの手順をカスタマイズできます。外部認証を簡素化し、ログイン ID にメールアドレス等を使用出来る様になります。</td>\r
1603                 <td><dl>\r
1604                         <dt class="ref">login</dt>\r
1605                         <dd>ユーザーが「ログインID」フィールドに入力した文字列。Nucleus のメンバーとして登録されているなら、プラグイン側で外部認証された「ログインID」と Nucleus のそれを紐つけるべきです。そうでないとクッキーがセットされず、ページを移動するごとにログアウトしてしまいます。</dd>\r
1606                         <dt class="ref">password</dt>\r
1607                         <dd>ユーザーが「パスワード」フィールドに入力した文字列。</dd>\r
1608                         <dt class="ref">success</dt>\r
1609                         <dd>認証が成功したかどうかのフラグ。「1」が成功。失敗だと「0」。初期値は「0」。プラグイン側でセットします。</dd>\r
1610                         <dt class="ref">allowlocal</dt>\r
1611                         <dd>整数値。プラグイン側で外部認証に失敗した後に、Nucleus のログインを試すかどうかのフラグ。「1」が試す「0」が試さない。初期値は「1」プラグイン側でセットします。</dd>\r
1612                 </dl></td>\r
1613         </tr>\r
1614 <!--\r
1615     <tr>\r
1616         <td></td>\r
1617         <td></td>\r
1618         <td><dl>\r
1619             <dt></dt>\r
1620             <dd></dd>\r
1621         </dl></td>\r
1622     </tr>\r
1623     <tr>\r
1624         <td></td>\r
1625         <td></td>\r
1626         <td><dl>\r
1627             <dt></dt>\r
1628             <dd></dd>\r
1629         </dl></td>\r
1630     </tr>\r
1631     <tr>\r
1632         <td></td>\r
1633         <td></td>\r
1634         <td><dl>\r
1635             <dt></dt>\r
1636             <dd></dd>\r
1637         </dl></td>\r
1638     </tr>\r
1639     <tr>\r
1640         <td></td>\r
1641         <td></td>\r
1642         <td><dl>\r
1643             <dt></dt>\r
1644             <dd></dd>\r
1645         </dl></td>\r
1646     </tr>\r
1647     <tr>\r
1648         <td></td>\r
1649         <td></td>\r
1650         <td><dl>\r
1651             <dt></dt>\r
1652             <dd></dd>\r
1653         </dl></td>\r
1654     </tr>\r
1655     <tr>\r
1656         <td></td>\r
1657         <td></td>\r
1658         <td><dl>\r
1659             <dt></dt>\r
1660             <dd></dd>\r
1661         </dl></td>\r
1662     </tr>\r
1663     <tr>\r
1664         <td></td>\r
1665         <td></td>\r
1666         <td><dl>\r
1667             <dt></dt>\r
1668             <dd></dd>\r
1669         </dl></td>\r
1670     </tr>\r
1671     <tr>\r
1672         <td></td>\r
1673         <td></td>\r
1674         <td><dl>\r
1675             <dt></dt>\r
1676             <dd></dd>\r
1677         </dl></td>\r
1678     </tr> -->\r
1679 </table>\r
1680 \r
1681 \r
1682 \r
1683 <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
1684 \r
1685 <p>プラグインに簡単にオプションを登録・取得できるように一連のメソッドが用意されています。これらのオプションは直接Nucleusの管理エリアで編集でき、プラグイン自身の管理エリアを用意する必要もなく、PHPファイルそのものの中にオプションの値を書き込まずにすみます。</p>\r
1686 \r
1687 <p>オプションは異なったコンテクストで利用可能です。</p>\r
1688 \r
1689 <ol>\r
1690     <li><strong>グローバルオプション</strong>:管理エリアのプラグインセクションで編集可能</li>\r
1691     <li><strong>blogオプション</strong>:blog設定ページで編集可能</li>\r
1692     <li><strong>カテゴリーオプション</strong>:blog設定ページ(のカテゴリー編集ページ)で編集可能</li>  \r
1693     <li><strong>メンバーオプション</strong>:メンバー編集ページで編集可能</li>\r
1694     <li><strong>アイテムオプション</strong>:アイテムの追加、およびアイテムの編集ページで編集可能</li>\r
1695 </ol>\r
1696 \r
1697 <h2>オプションの種類</h2>\r
1698 \r
1699 <p>オプションにはいくつかのタイプが提供されています。</p>\r
1700 \r
1701 <dl>\r
1702     <dt>text</dt>\r
1703     <dd>シンプルなテキスト</dd>\r
1704     <dt>yesno</dt>\r
1705     <dd>'yes'か'no'どちらか(編集画面ではラジオボタンとして表示されます)</dd>\r
1706     <dt>password</dt>\r
1707     <dd>テキストフィールド (編集画面では伏字で表示されます)</dd>\r
1708     <dt>textarea (v2.2)</dt>\r
1709     <dd>複数行のテキストフィールド</dd>\r
1710     <dt>select (v2.2)</dt>\r
1711     <dd>ドロップダウンメニュー。次のような形式の追加情報が必要です: Option 1|value1|Option 2|value2|Option 3|value3 \r
1712     </dd>\r
1713 </dl>\r
1714 \r
1715 <h2>オプション・メタ</h2>\r
1716 \r
1717 <p>Nucleus v3.2よりオプション・メタデータを用いて、オプションタイプを正しい値を受け取れるように制限できるようになりました。このメタデータは <code>$typeExtras</code>フィールドにセミコロン区切りのリストで保存されます。注:selectオプションでは、selectリストは<code>$typeExtras</code>のなかで一番最初でなければいけません。</p>\r
1718 \r
1719 <table summary="メタデータ"><tr>\r
1720     <th abbr="key">キー</th>\r
1721     <th abbr="desc">説明</th>\r
1722 </tr><tr>\r
1723     <td><code>datatype</code></td>\r
1724     <td>Nucleus本体に、どのデータ型を使いたいかという追加情報を与えます。現在は '<code>numerical</code>' のみ利用できます。 '<code>numerical</code>' を指定することでNucleusは数値情報のみを受け付けます(クライアントサイド・サーバサイド両方でチェック) ('<code>select</code>' と '<code>text</code>'のオプションタイプで利用できます)</td>\r
1725 </tr><tr>\r
1726     <td><code>access</code></td>\r
1727     <td>'<code>readonly</code>'にセットすることで、オプションを編集不可能にします('<code>text</code>' と '<code>textarea</code>'のオプションタイプで利用できます)<br />\r
1728     '<code>hidden</code>'を使うと、利用者側にそのオプションの存在を完全に隠蔽します('<code>text</code>'のオプションタイプで利用できます)</td>\r
1729 </tr></table>\r
1730 \r
1731 <p>設定例</p>\r
1732 <pre class="example"><code>// 数値のみを受け付けるテキストオプションを作成\r
1733 $this-&gt;createBlogOption('FooBar', 'foobar', 'text', '0', 'datatype=numerical');\r
1734 // 数値のみを受け付けるセレクトオプションを作成\r
1735 $this-&gt;createItemOption('FooBar', 'foobar', 'select', '0', '0|0|1|1|2|2;datatype=numerical');\r
1736 // 編集不可能なテキストエリアオプションを作成\r
1737 $this-&gt;createOption('FooBar', 'foobar', 'textarea', 'This textarea is readonly', 'access=readonly');\r
1738 </code></pre>\r
1739 \r
1740 <h2>制限</h2>\r
1741 \r
1742 <ol>\r
1743     <li>オプション名は最大20文字です。</li>\r
1744     <li>オプションの説明文は最大255文字です。</li>\r
1745     <li>オプションの値は制限ありません(v2.2より前のバージョンでは128文字の制限がありました)</li>\r
1746     <li>'=', '|', ';' のキャラクターはセレクトオプション用のセレクトリストやオプション・メタデータ中で使用することはできません。</li>\r
1747 </ol>\r
1748 \r
1749 <h2>メソッド</h2>\r
1750 \r
1751 <h3>createOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>\r
1752 \r
1753 <p><strong>グローバル</strong>なコンテクストで新しいオプションを生成します。</p>\r
1754 \r
1755 <table summary="createOption"><tr>\r
1756     <th abbr="param">パラメータ</th>\r
1757     <th abbr="value">値</th>\r
1758 </tr><tr>\r
1759     <td>$name</td>\r
1760     <td>オプション名</td>\r
1761 </tr><tr>\r
1762     <td>$desc</td>\r
1763     <td>オプション編集画面で表示される説明文</td>\r
1764 </tr><tr>\r
1765     <td>$type</td>\r
1766     <td>オプションタイプ(前出)</td>\r
1767 </tr><tr>\r
1768     <td>$defValue</td>\r
1769     <td>初期値</td>\r
1770 </tr><tr>\r
1771     <td>$typeExtras</td>\r
1772     <td>オプションタイプの追加情報(前出)</td>\r
1773 </tr></table>\r
1774 \r
1775 <h3>[v2.2] createBlogOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>\r
1776 \r
1777 <p><strong>blog</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>\r
1778 \r
1779 <h3>[v2.2] createCategoryOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>\r
1780 \r
1781 <p><strong>カテゴリー</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>\r
1782 \r
1783 <h3>[v2.2] createMemberOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>\r
1784 \r
1785 <p><strong>メンバー</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>\r
1786 \r
1787 <h3>[v3.2] createItemOption($name, $desc, $type, $defValue = '', $typeExtras = '')</h3>\r
1788 \r
1789 <p><strong>アイテム</strong>のコンテクストで新しいオプションを生成します(<code>createOption</code>を参照)。</p>\r
1790 \r
1791 <h3>setOption($name, $value)</h3>\r
1792 \r
1793 <p>すでにデータベースに存在するオプションの値を変更します。</p>\r
1794 \r
1795 <table summary="setOption"><tr>\r
1796     <th abbr="param">パラメータ</th>\r
1797     <th abbr="value">値</th>\r
1798 </tr><tr>       \r
1799     <td>$name</td>\r
1800     <td>オプション名</td>\r
1801 </tr><tr>\r
1802     <td>$value</td>\r
1803     <td>新しい値</td>\r
1804 </tr></table>\r
1805 \r
1806 <h3>[v2.2] setBlogOption($blogid, $name, $value)</h3>\r
1807 \r
1808 <p>blogオプションの値を変更します。<code>blogid</code>属性はどのblogでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>\r
1809 \r
1810 <h3>[v2.2] setCategoryOption($catid, $name, $value)</h3>\r
1811 \r
1812 <p>カテゴリーオプションの値を変更します。<code>catid</code>属性はどのカテゴリーでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>\r
1813 \r
1814 <h3>[v2.2] setMemberOption($memberid, $name, $value)</h3>\r
1815 \r
1816 <p>メンバーオプションの値を変更します。<code>memberid</code>属性はどのメンバーでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>\r
1817 \r
1818 <h3>[v3.2] setItemOption($itemid, $name, $value)</h3>\r
1819 \r
1820 <p>アイテムオプションの値を変更します。<code>itemid</code>属性はどのアイテムでそのオプションが有効かを示します(その他のオプション:<code>setOption</code>を参照)。</p>\r
1821 \r
1822 <h3>getOption($name)</h3>\r
1823 \r
1824 <p>データベース内のオプションの値を返します。</p>\r
1825 \r
1826 <table summary="getOption"><tr>\r
1827     <th abbr="param">パラメータ</th>\r
1828     <th abbr="value">値</th>\r
1829 </tr><tr>       \r
1830     <td>$name</td>\r
1831     <td>オプション名</td>\r
1832 </tr></table>\r
1833 \r
1834 <h3>[v2.2] getBlogOption($blogid, $name)</h3>\r
1835 \r
1836 <p>blogオプションの値を返します。<code>blogid</code>属性は値がリスエストされたblogを示します(その他のオプション:<code>getOption</code>を参照)。</p>\r
1837 \r
1838 <h3>[v2.2] getCategoryOption($catid, $name)</h3>\r
1839 \r
1840 <p>カテゴリーオプションの値を返します。<code>catid</code>属性は値がリスエストされたカテゴリーを示します(その他のオプション:<code>getOption</code>を参照)。</p>\r
1841 \r
1842 <h3>[v2.2] getMemberOption($memberid, $name)</h3>\r
1843 \r
1844 <p>メンバーオプションの値を返します。<code>memberid</code>属性は値がリスエストされたメンバーを示します(その他のオプション:<code>getOption</code>を参照)。</p>\r
1845 \r
1846 <h3>[v3.2] getItemOption($itemid, $name)</h3>\r
1847 \r
1848 <p>アイテムオプションの値を返します。<code>itemid</code>属性は値がリスエストされたアイテムを示します(その他のオプション:<code>getOption</code>を参照)。</p>\r
1849 \r
1850 <h3>deleteOption($name)</h3>\r
1851 \r
1852 <p>データベースからオプションを削除します。</p>\r
1853 \r
1854 <table summary="deleteOption"><tr>\r
1855     <th abbr="param">パラメータ</th>\r
1856     <th abbr="value">値</th>\r
1857 </tr><tr>       \r
1858     <td>$name</td>\r
1859     <td>オプション名</td>\r
1860 </tr></table>\r
1861 \r
1862 <h3>[v2.2] deleteBlogOption($name)</h3>\r
1863 \r
1864 <p>blogオプションを削除します(<code>deleteOption</code>を参照)。</p>\r
1865 \r
1866 <h3>[v2.2] deleteCategoryOption($name)</h3>\r
1867 \r
1868 <p>カテゴリーオプションを削除します(<code>deleteOption</code>を参照)。</p>\r
1869 \r
1870 <h3>[v2.2] deleteMemberOption($name)</h3>\r
1871 \r
1872 <p>メンバーオプションを削除します(<code>deleteOption</code>を参照)。</p>\r
1873 \r
1874 <h3>[v3.2] deleteItemOption($name)</h3>\r
1875 \r
1876 <p>アイテムオプションを削除します(<code>deleteOption</code>を参照)。</p>\r
1877 \r
1878 <h3>[v2.2] getAllBlogOptions($name)</h3>\r
1879 \r
1880 <p>与えられたblogオプションの全ての値を返します。結果は存在するblogidごとの連想配列です。</p>\r
1881 \r
1882 <h3>[v2.2] getAllCategoryOptions($name)</h3>\r
1883 \r
1884 <p>与えられたカテゴリーオプションの全ての値を返します。結果は存在するcatidごとの連想配列です。</p>\r
1885 \r
1886 <h3>[v2.2] getAllMemberOptions($name)</h3>\r
1887 \r
1888 <p>与えられたメンバーオプションの全ての値を返します。結果は存在するmemberidごとの連想配列です。</p>\r
1889 \r
1890 <h3>[v3.2] getAllItemOptions($name)</h3>\r
1891 \r
1892 <p>与えられたアイテムオプションの全ての値を返します。結果は存在するitemidごとの連想配列です。</p>\r
1893 \r
1894 <h3>[v3.2] getBlogOptionTop($name, $amount = 10, $sort = 'desc')</h3>\r
1895 \r
1896 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのblogid ('id') の値 ('value') を持つ配列になっています。</p>\r
1897 \r
1898 <table summary="getOption"><tr>\r
1899     <th abbr="param">パラメータ</th>\r
1900     <th abbr="value">値</th>\r
1901 </tr><tr>\r
1902     <td>$name</td>\r
1903     <td>オプション名</td>\r
1904 </tr><tr>\r
1905     <td>$amount</td>\r
1906     <td>必要なオプション数</td>\r
1907 </tr><tr>\r
1908     <td>$sort</td>\r
1909     <td>昇順 ('asc') か降順 ('desc') で並べ替え</td>\r
1910 </tr></table>\r
1911 \r
1912 <h3>[v3.2] getMemberOptionTop($name, $amount = 10, $sort = 'desc')</h3>\r
1913 \r
1914 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのメンバーID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>\r
1915 \r
1916 <h3>[v3.2] getCategoryOptionTop($name, $amount = 10, $sort = 'desc')</h3>\r
1917 \r
1918 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのカテゴリーID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>\r
1919 \r
1920 <h3>[v3.2] getItemOptionTop($name, $amount = 10, $sort = 'desc')</h3>\r
1921 \r
1922 <p>与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのアイテムID ('id') の値 ('value') を持つ配列になっています(パラメータは<code>getBlogOptionTop</code>を参照)。</p>\r
1923 \r
1924 <div class="note">\r
1925 <strong>注:</strong> プラグインクラス内のコンストラクタから、これらのファンクションを呼ぶことはできません。プラグインがロードされた後にこれらを実行したいときは、かわりに<code>init()</code>メソッド内に置きます。\r
1926 </div>\r
1927 \r
1928 <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
1929 \r
1930 <h2>Nucleusテーブルへのアクセス</h2>\r
1931 \r
1932 <p>v2.0まで、Nucleusテーブルへのアクセスは単に<code>nucleus_</code>と名づけられたテーブルに対してSQL命令を実行するだけのものでした。Nucleusのバージョン2.2以降はカスタム・テーブル名を利用できるようになったため、プラグイン開発に若干注意する必要があります。</p>\r
1933 \r
1934 <ol>\r
1935     <li><code>nucleus_item</code> などの固定されたテーブル名の代わりに、テーブル名のプレフィックスを生成するために <code>sql_table('item') </code>というグローバルファンクションを利用します。</li>\r
1936     <li><code>supportsFeature('SqlTablePrefix')</code> が呼ばれたときにプラグインが1(真)を返すようにします。これがないと、カスタムプレフィックスがセットされている場合でバージョンが2.0より大きいNucleusではプラグインをロードできません(用心のため)。</li>\r
1937 </ol>\r
1938 \r
1939 <p class="note">v2.0までのNucleusではグローバルファンクション <code>sql_table</code> は利用できないことに注意してください。もしこのメソッドを用いつつ、プラグインをv2.0以下のNucleusで動作させたい場合は、以下のコードをプラグインクラスの前に追加してください。</p>\r
1940 \r
1941 <pre class="example"><code>&lt;?\r
1942 \r
1943 // プラグインがNucleusバージョン2.0以下と互換性を持つために必要\r
1944 if (!function_exists('sql_table'))\r
1945 {\r
1946     function sql_table($name) {\r
1947         return 'nucleus_' . $name;\r
1948     }\r
1949 }\r
1950 \r
1951 class NP_HelloWorld extends NucleusPlugin {\r
1952 ...\r
1953 }\r
1954 \r
1955 ?&gt;</code></pre>\r
1956 \r
1957 <h2>独自テーブル</h2>\r
1958 \r
1959 <p>もしプラグイン独自のテーブルが必要なら、<code>install</code>メソッドの中で独自テーブルを生成し、<code>unInstall</code>メソッドの中でそれを削除するようにします。</p>\r
1960 \r
1961 <p>いくつかの注意点</p>\r
1962 <ul>\r
1963     <li><code>nucleus_plug_<em>plugname</em></code> のように、他のプラグインと競合しないテーブル名を考えてください。カスタムプレフィックスに対応するため、テーブル名を<code>sql_table('plug_plugname')</code> で生成してください。</li>\r
1964     <li>自分自身でデータベース接続をする必要はありません。PHPコマンド <code>mysql_query()</code> を使ってSQL命令を実行できます。</li>\r
1965     <li>自分でデータベース接続をする場合、後でNucleusデータベースへの接続を復元するようにしてください。自前処理の後で <code>sql_connect()</code>  を呼ぶことで可能です。頻繁な再接続を避けるために、コンストラクタでそれを行うのも良いです。<code>$this- &gt;db</code>のリンクIDを保持でき、各クエリにそれを渡すことができます。</li>\r
1966     <li>バックアップ機能を使う時は、独自テーブルもバックアップに含めるよう、<code>getTableList()</code> を再定義してください。</li>\r
1967         <li>It's a good idea to make the removal of your database tables optional. This will allow your users to temporarily remove your plugin without losing the data. For instance, you may need to make changes to options or database tables requiring that the install() method be run to execute code neccessary to modify existing tables or options. This will require that your users uninstall the old version and then install the new version and losing their data in the process. To make the deletion of your tables optional, you can add an option like this in install():\r
1968         <pre class="example"><code>$this-&gt;createOption('del_uninstall', 'Delete NP_MyPlugin data tables on uninstall?', 'yesno','no');</code></pre>\r
1969         and this snippet in uninstall():\r
1970         <pre class="example"><code>if ($this-&gt;getOption('del_uninstall') == 'yes')   {\r
1971         foreach ($this-&gt;getTableList() as $table) {\r
1972                 sql_query("DROP TABLE $table");\r
1973         }\r
1974 }</code></pre></li>\r
1975 </ul>\r
1976 \r
1977 \r
1978 \r
1979 <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
1980 \r
1981 <p>Ver2.5から、Nucleusの管理エリアに統合されたプラグイン管理エリアを作成できます。これらのページは従来のプラグイン管理ページや左側のクイックメニューからアクセスできます。</p>\r
1982 \r
1983 <h2>基本</h2>\r
1984 \r
1985 <p>管理エリアを提供するには、次のステップが必要です。</p>\r
1986 \r
1987 <ol>\r
1988   <li>プラグインディレクトリに<strong>プラグイン名</strong>のサブディレクトリを作ります。たとえばプラグイン名が<code>NP_PluginName</code>なら、'pluginname'です。ディレクトリ名はすべて小文字で!</li>\r
1989   <li>\r
1990     そのディレクトリで、次のような<strong>index.php</strong>を用意します。\r
1991     <pre><code>&lt;?php\r
1992 \r
1993     // if your 'plugin' directory is not in the default location,\r
1994     // edit this variable to point to your site directory\r
1995     // (where config.php is)\r
1996     $strRel = '../../../';\r
1997 \r
1998     include($strRel . 'config.php');\r
1999     if (!$member-&gt;isLoggedIn())\r
2000         doError('You\'re not logged in.');\r
2001 \r
2002     include($DIR_LIBS . 'PLUGINADMIN.php');\r
2003 \r
2004     // create the admin area page\r
2005     $oPluginAdmin = new PluginAdmin('<strong>PluginName</strong>');\r
2006     $oPluginAdmin-&gt;start();\r
2007 \r
2008     echo '&lt;h2&gt;プラグイン名&lt;/h2&gt;';\r
2009 \r
2010     echo '&lt;p&gt;<strong>ページ内容</strong>&lt;p&gt;';\r
2011 \r
2012     $oPluginAdmin-&gt;end();\r
2013 \r
2014 ?&gt;</code></pre>\r
2015   </li>\r
2016   <li>\r
2017     プラグイン側に次のコードを挿入し、クイックメニューイベントに登録します。\r
2018     <pre><code>function event_QuickMenu(&amp;$data) {\r
2019         array_push(\r
2020             $data['options'],\r
2021             array(\r
2022                 'title'   =&gt; '<strong>プラグイン名</strong>',\r
2023                 'url'     =&gt; $this-%gt;getAdminURL(),\r
2024                 'tooltip' =&gt; '<strong>ツールチップテキスト</strong>'\r
2025             )\r
2026         );\r
2027     }</code></pre>\r
2028   </li>\r
2029   <li>\r
2030     プラグイン側に次の関数を記述します。\r
2031     <pre><code>function hasAdminArea()\r
2032 {\r
2033     return 1;\r
2034 }</code></pre>\r
2035   </li>\r
2036   <li> Optional. Make the <code>QuickMenu</code> entry optional, and restrict who sees it. The following assumes that an option, of type <code>yesno</code> and called <code>quickmenu</code>, exists in install(). It also will restrict viewing of the <code>QuickMenu</code> entry to super-admins and to blog-admins.\r
2037         <pre class="example"><code>function event_QuickMenu(&amp;$data) {\r
2038     // only show when option enabled\r
2039     if ($this-&gt;getOption('quickmenu') != 'yes') return;\r
2040     global $member;\r
2041     if (!$member-&gt;isAdmin() &amp;&amp; !count($member-&gt;getAdminBlogs())) return;\r
2042     array_push($data['options'],\r
2043         array('title' =&gt; 'PluginName',\r
2044         'url' =&gt; $this-&gt;getAdminURL(),\r
2045         'tooltip' =&gt; 'Administer NP_PluginName'));\r
2046 }</code></pre>\r
2047   </li>\r
2048 </ol>\r
2049 \r
2050 <h2>考慮すること</h2>\r
2051 \r
2052 <ul>\r
2053  <li>登録できるからといって安易にクイックメニューへ登録しないこと。クイックメニューにプラグインが100個並んだりしたらかなりウンザリするでしょう。ですので、クイックメニューに登録する場合でも、クイックメニュー登録を有効・無効化するプラグインオプションを(グローバルまたはメンバーオプションで)用意することを考えてください。</li>\r
2054  <li><code>プラグインディレクトリが nucleus/plugins/ ではない場合は、index.php内の $strRel</code> 変数は手動で書き換える必要があります。</li>\r
2055  <li>管理エリアのアウトプットが<strong>正しいXHTML</strong>になっているか確認してください。正しくないと、MozillaなどのGeckoベースのブラウザでページ表示が崩れます。</li>\r
2056 </ul>\r
2057 \r
2058 <h2>PluginAdmin クラス</h2>\r
2059 \r
2060 <p><code>PluginAdmin</code> クラスは助けになります。これを一度生成すれば、<code>$oPluginAdmin-&gt;plugin</code> でプラグインのインスタンスにアクセスできます。</p>\r
2061 \r
2062 <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
2063 \r
2064 <p>Nucleus v3.2から、プラグインの機能の概要、利用できるスキン・テンプレート変数、さらに詳細な情報のありかなどを示すヘルプページを提供可能になりました。</p>\r
2065 \r
2066 <p>ヘルプページは管理画面のプラグイン一覧からアクセス可能になります。</p>\r
2067 \r
2068 <h2>基本</h2>\r
2069 <p>ヘルプページを提供するために、次のステップが必要です。</p>\r
2070 <ol>\r
2071 <li>プラグインディレクトリに、プラグイン名をつけたサブディレクトリを作成します。ディレクトリ名は小文字であることに注意します。<a href="#admin">管理エリア</a>を作るときと同様です。</li>\r
2072 <li>そのディレクトリの中に help.html を作り、プラグインについての文章を記述します。次の雛型からはじめると良いでしょう。\r
2073 <pre><code>&lt;h3&gt;プラグインの概要&lt;/h3&gt;\r
2074 \r
2075 &lt;p&gt;このプラグインはヘルプページがいかに機能するかを示すためだけのものです&lt;/p&gt;\r
2076 \r
2077 &lt;h3&gt;インストール&lt;/h3&gt;\r
2078 \r
2079 &lt;p&gt;これを読めてるならインストールは正しく出来てます :-)&lt;/p&gt;\r
2080 \r
2081 &lt;h3&gt;スキン変数&lt;/h3&gt;\r
2082 \r
2083 &lt;p&gt;このプラグインはただのテストケースなのでスキン・テンプレート変数はありませんが、書くとすれば。\r
2084 \r
2085 &lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;%HelpPageTestCase1%&gt;&lt;/b&gt;: なにかをする&lt;/li&gt;\r
2086 &lt;li&gt;&lt;b&gt;&lt;%HelpPageTestCase1(foobar)%&gt;&lt;/b&gt;: 別のなにかをする&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;\r
2087 \r
2088 &lt;h3&gt;サポートとバグ報告&lt;/h3&gt;\r
2089 \r
2090 &lt;p&gt;さらなるサポートやバグ報告のために、次のフォーラムのスレッドを利用してください。\r
2091 &lt;a href="http://forum.nucleuscms.org/viewtopic.php?t=&lt;トピックID&gt;"&gt;\r
2092 http://forum.nucleuscms.org/viewtopic.php?t=&lt;トピックID&gt;&lt;/a&gt;&lt;/p&gt;\r
2093 \r
2094 &lt;h3&gt;バージョン履歴&lt;/h3&gt;\r
2095 \r
2096 &lt;ul&gt;&lt;li&gt;Version 0.1: 最初のテストケースバージョン&lt;/li&gt;\r
2097 &lt;li&gt;Version 0.0: その前のバージョン ;-)&lt;/li&gt;&lt;/ul&gt;</code></pre>\r
2098 </li>\r
2099 <li>supportsFeature('HelpPage') で0より大きい数字を返すように設定します。\r
2100 <pre><code>function supportsFeature($what) {\r
2101     switch($what) {\r
2102     case 'HelpPage':\r
2103         return 1;\r
2104       default:\r
2105         return 0;\r
2106     }\r
2107   }</code></pre>\r
2108 </li>\r
2109 </ol>\r
2110 \r
2111 <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
2112 \r
2113 <p>v3.2から、他のプラグインとの依存関係を宣言する新しいプラグインインターフェイスが追加されました。\r
2114 他のプラグインの機能を必要とするプラグインに利用できます。特に依存関係が成立しなくて正しく機能しない状態を検知するときに便利です。</p>\r
2115 \r
2116 <h2>この機能を利用するプラグインの書き方</h2>\r
2117 \r
2118 <p>現実世界での例からはじめましょう。</p>\r
2119 \r
2120 <p>NP_PageLinkList は NP_BlogWithOffset の機能を利用するため、利用者には NP_BlogWithOffset のインストール後に NP_PageLinkList をインストールさせたいとします。\r
2121 NucleusはこのAPIによって、インストール前に依存関係を検知させる方法をプラグインに提供します。</p>\r
2122 \r
2123 <p>このケースでは、NP_PageLinkList 側に NP_BlogWithOffset が必要だということを認識させるコードを埋め込みます。\r
2124 プラグインがインストールされる際に、Nucleusコアは <code>getPluginDep()</code> というファンクションを呼び出します。\r
2125 このファンクションは必要なプラグインのリストを返し、コアはインストール済みのプラグインをチェックして、もし依存関係に欠如があればインストールを拒否します。</p>\r
2126 \r
2127 <p>必要なことは NP_PageLinkList にこのファンクションを追加する、ただそれだけです。</p>\r
2128 \r
2129 <pre><code>function getPluginDep() {\r
2130      return array('NP_BlogWithOffset');\r
2131 }</code></pre>\r
2132 \r
2133 <p>このプラグイン依存チェックは、他のプラグインが依存しているプラグインがアンインストールされることも防ぎます。</p>\r
2134 \r
2135 </div>\r
2136 <h1>プラグインの多国語化<a name="internationalization" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>\r
2137 \r
2138 <p>あなたと同じ言葉を話さない世界中の人達がプラグインをより使いやすくするために、プラグインを多国語化できます。\r
2139 少し手間は増えますが、プラグインが出力する文章を翻訳するだけで可能です。\r
2140 以下に Nucleus のコアで用意されている標準的な手順を記載します。\r
2141 Andyさん、ありがとう!</p>\r
2142 \r
2143 <ol>\r
2144         <li><strong>プラグインを作る</strong>\r
2145 \r
2146 先ずはじめに、あなたが普段使っている言葉でプラグインを作ります。プラグインが安定して動作するようになってから、言語ファイルを作成することが推奨されます。</li>\r
2147         <li><strong>プラグインディレクトリを作る</strong>\r
2148 \r
2149 作ったプラグインの名前が NP_AbcDef なら、プラグインディレクトリの名前は abcdef になります(必ず小文字を使用すること)。</li>\r
2150         <li><strong>言語ファイルを作る</strong>\r
2151 \r
2152 プラグインディレクトリに言語ファイルを作成します。言語ファイルの名前は Nucleus コアが使用しているものと同じにします。例えば、英語なら english.php。日本語の UTF-8 なら japanese-utf8.phpになります(UTF がお勧めです。参考までに日本語の EUC の場合は japanese-euc.php になります)。</li>\r
2153         <li><strong>文を定義する</strong>\r
2154 \r
2155 次のように言語ファイル内で分を定義します。\r
2156 \r
2157 <pre class="example"><code>&lt;?php\r
2158 define('_ABCDEF_MESSAGENAME',                  '実際のメッセージ');\r
2159   . . .\r
2160 ?&gt;</code></pre>\r
2161 \r
2162 全ての文を定義する必要があります。定数は一回しか定義できないので、既に定義されているものと重複しないようにプラグインの名前をはじめにつけることが推奨されます(この例だと _ABCDEF)。</li>\r
2163         <li><strong>文の置き換え</strong>\r
2164 \r
2165 全ての文を、言語ファイルで定義した定数と置き換えます</li>\r
2166         <li><strong>init() メソッドの編集</strong>\r
2167 \r
2168 プラグイン内の init() メソッドを、次のように編集します(既に init() メソッドを定義している場合は init() メソッド内にコードを追記します)。\r
2169 \r
2170 <pre class="example"><code>   function init() {\r
2171       // include language file for this plugin\r
2172       $language = ereg_replace( '[\\|/]', '', getLanguageName());\r
2173       if (file_exists($this-&gt;getDirectory().$language.'.php'))\r
2174          include_once($this-&gt;getDirectory().$language.'.php');\r
2175       else\r
2176          include_once($this-&gt;getDirectory().'english.php');\r
2177    }</code></pre>\r
2178 このコードは Nucleus のコアで使用されているものと同一です。</li>\r
2179 \r
2180         <li><strong>言語ファイルの追加</strong>\r
2181 \r
2182 「英語」が基本の言語になっていますので、「英語」の言語ファイルも追加することが望まれます。</li>\r
2183 </ol>\r
2184 \r
2185 \r
2186 \r
2187 <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
2188 \r
2189 <p>偉大なプラグインのいくつかは、様々なスキンや URL の生成において、必ずしもそのまま使用できるとはいえません。なぜなら、doSkinVar() メソッドによって出力されるものが、\r
2190 ユーザーのニーズに十二分に合致するものであるとは言いがたいからです。Nucleus では、出力をここのユーザーによっておのおののニーズに沿ったものにする為に、いくつかのツールを用意しています。</p>\r
2191 \r
2192 <p>各ブログ・カテゴリー・アイテム・メンバー、それから action.php や管理エリア、または各プラグインの管理エリアなどの URL を出力する為に、Nucleus はコアの機能として\r
2193 いくつかのファンクションとグローバル変数を用意しています。:</p>\r
2194 \r
2195 <table summary="Nucleus の各ページへのリンクを生成する為に便利な変数とファンクション">\r
2196         <caption>Functions and variables useful in creating links to Nucleus pages</caption>\r
2197         <tr>\r
2198                 <th>名前</th><th>種類</th><th>引数</th><th>説明</th>\r
2199         </tr>\r
2200         <tr>\r
2201                 <td><code>$CONF['AdminURL']</code></td>\r
2202                 <td>グローバル変数</td>\r
2203                 <td>なし</td>\r
2204                 <td>Nucleus の管理領域への絶対 URL</td>\r
2205         </tr>\r
2206         <tr>\r
2207                 <td><code>$CONF['PluginURL']</code></td>\r
2208                 <td>グローバル変数</td>\r
2209                 <td>なし</td>\r
2210                 <td>Nucleus のプラグインディレクトリへの絶対 URL。<code>$CONF['PluginURL'].'pluginname/'</code> の様にして、プラグインの管理エリアへのリンク生成に使用する。</td>\r
2211         </tr>\r
2212         <tr>\r
2213                 <td><code>$CONF['ActionURL']</code></td>\r
2214                 <td>グローバル変数</td>\r
2215                 <td>なし</td>\r
2216                 <td>Nucleus の action.php への絶対 URL。</td>\r
2217         </tr>\r
2218         <tr>\r
2219                 <td><code>$CONF['MediaURL']</code></td>\r
2220                 <td>グローバル変数</td>\r
2221                 <td>なし</td>\r
2222                 <td>Nucleus のメディアディレクトリへの絶対 URL。</td>\r
2223         </tr>\r
2224         <tr>\r
2225                 <td><code>$CONF['SkinsURL']</code></td>\r
2226                 <td>グローバル変数</td>\r
2227                 <td>なし</td>\r
2228                 <td>Nucleus のスキンディレクトリへの絶対 URL。</td>\r
2229         </tr>\r
2230         <tr>\r
2231                 <td><code>$CONF['IndexURL']</code></td>\r
2232                 <td>グローバル変数</td>\r
2233                 <td>なし</td>\r
2234                 <td>Nucleus のメインディレクトリへの絶対 URL。</td>\r
2235         </tr>\r
2236         <tr>\r
2237                 <td><code>$DIR_NUCLEUS</code></td>\r
2238                 <td>グローバル変数</td>\r
2239                 <td>なし</td>\r
2240                 <td>Nucleus のメインディレクトリへのシステムルートからのフルパス。</td>\r
2241         </tr>\r
2242         <tr>\r
2243                 <td><code>$DIR_SKINS</code></td>\r
2244                 <td>グローバル変数</td>\r
2245                 <td>なし</td>\r
2246                 <td>Nucleus のスキンディレクトリへのシステムルートからのフルパス。</td>\r
2247         </tr>\r
2248         <tr>\r
2249                 <td><code>$DIR_MEDIA</code></td>\r
2250                 <td>グローバル変数</td>\r
2251                 <td>なし</td>\r
2252                 <td>Nucleus のメディアディレクトリへのシステムルートからのフルパス。</td>\r
2253         </tr>\r
2254         <tr>\r
2255                 <td><code>$DIR_PLUGINS</code></td>\r
2256                 <td>グローバル変数</td>\r
2257                 <td>なし</td>\r
2258                 <td>Nucleus のプラグインディレクトリへのシステムルートからのフルパス。</td>\r
2259         </tr>\r
2260         <tr>\r
2261                 <td><code>$DIR_LANG</code></td>\r
2262                 <td>グローバル変数</td>\r
2263                 <td>なし</td>\r
2264                 <td>Nucleus の言語ファイルディレクトリへのシステムルートからのフルパス。</td>\r
2265         </tr>\r
2266         <tr>\r
2267                 <td><code>$DIR_LIBS</code></td>\r
2268                 <td>グローバル変数</td>\r
2269                 <td>なし</td>\r
2270                 <td>Nucleus のコアディレクトリへのシステムルートからのフルパス。</td>\r
2271         </tr>\r
2272         <tr>\r
2273                 <td><code>getAdminURL()</code></td>\r
2274                 <td>PLUGIN クラス内メソッド</td>\r
2275                 <td>なし</td>\r
2276                 <td>プラグインの管理エリアディレクトリが存在すればその URL を返す(存在しない場合は無効)。</td>\r
2277         </tr>\r
2278         <tr>\r
2279                 <td><code>getDirectory()</code></td>\r
2280                 <td>PLUGIN クラス内メソッド</td>\r
2281                 <td>なし</td>\r
2282                 <td>プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(存在しない場合は無効)。結果は".../nucleus/plugins/plugname/"のようになります。</td>\r
2283         </tr>\r
2284         <tr>\r
2285                 <td><code>createItemLink($itemid, $extra = '')</code></td>\r
2286                 <td>グローバルファンクション</td>\r
2287                 <td><code>$itemid</code> 整数。リンクしたいアイテムの ID。<br />\r
2288                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2289                 </td>\r
2290                 <td>ユーザーによって選択されたスキームにより、 <code>$itemid</code> に対応したアイテムへのリンクが生成されます。</td>\r
2291         </tr>\r
2292         <tr>\r
2293                 <td><code>createMemberLink($memberid, $extra = '')</code></td>\r
2294                 <td>グローバルファンクション</td>\r
2295                 <td><code>$memberid</code> 整数。リンクしたい存在するメンバーの ID。<br />\r
2296                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2297                 </td>\r
2298                 <td>ユーザーによって選択されたスキームにより、 <code>$memberid</code> に対応したメンバーへのリンクが生成されます。</td>\r
2299         </tr>\r
2300         <tr>\r
2301                 <td><code>createCategoryLink($catid, $extra = '')</code></td>\r
2302                 <td>グローバルファンクション</td>\r
2303                 <td><code>$catid</code> 整数。リンクしたいカテゴリーの ID。<br />\r
2304                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2305                 </td>\r
2306                 <td>ユーザーによって選択されたスキームにより、 <code>$catid</code> に対応したカテゴリーへのリンクが生成されます。</td>\r
2307         </tr>\r
2308         <tr>\r
2309                 <td><code>createArchiveListLink($blogid = '', $extra = '')</code></td>\r
2310                 <td>グローバルファンクション</td>\r
2311                 <td><code>$blogid</code> 整数。リンクしたいアーカイブ一覧が存在ブログの ID。<br />\r
2312                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2313                 </td>\r
2314                 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応したアーカイブ一覧へのリンクが生成されます。</td>\r
2315         </tr>\r
2316         <tr>\r
2317                 <td><code>createArchiveLink($blogid, $archive, $extra = '')</code></td>\r
2318                 <td>グローバルファンクション</td>\r
2319                 <td><code>$blogid</code> 整数。リンクしたい月別アーカイブが存在するブログの ID。<br />\r
2320                         <code>$archive</code> 文字列。アーカイブのパラメータとして、渡した「日(または年、月)」のものが存在するもの。<br />\r
2321                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2322                 </td>\r
2323                 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応した月別アーカイブへのリンクが生成されます。</td>\r
2324         </tr>\r
2325         <tr>\r
2326                 <td><code>createBlogidLink($blogid, $extra = '')</code></td>\r
2327                 <td>グローバルファンクション</td>\r
2328                 <td><code>$blogid</code> 整数。リンクしたいブログの ID。<br />\r
2329                         <code>$extra</code> 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。\r
2330                 </td>\r
2331                 <td>ユーザーによって選択されたスキームにより、 <code>$blogid</code> に対応したブログへのリンクが生成されます。</td>\r
2332         </tr>\r
2333 </table>\r
2334 \r
2335 <p>常に出力する文字列をテンプレートを使って整形するのは良い考えです。あなたが順不同のリストで出力したいと考えていたとしても、別のユーザーは同じデータを\r
2336 記号で区切ったり、特別な形で出力したいと考えるかもしれません。Nucleus にはテンプレートデータを作ったり定義したりする2種類の方法があります。\r
2337 次に上げるれいの両方において、<code>&lt;%foo%&gt;</code> と <code>&lt;%bar%&gt;</code> のふたつのテンプレート変数を使用します。</p>\r
2338 \r
2339 <ol>\r
2340         <li><strong>プラグインのオプションを使う方法。</strong>この方法は v3.2 以降で使用でき、次のように <code>install()</code> メソッド\r
2341         に記述する事によって簡単に作成する事が出来ますが、アップグレードのためにプラグインを削除した時に、ユーザーは同時にカスタマイズした\r
2342         テンプレートを失ってしまうという大きなデメリットがあります。\r
2343         <pre class="example"><code>$this-&gt;createOption('my_template', \r
2344                 'プラグインの出力の為のテンプレート', \r
2345                 'textarea', \r
2346                 '&lt;li&gt;&lt;%foo%&gt; loves &lt;%bar%&gt;&lt;/li&gt;');</code></pre>\r
2347         <code>doSkinVar()</code> メソッドで、<code>foo</code> と <code>bar</code> を次のように定義して、テンプレートを埋めます。\r
2348         <pre class="example"><code>$mytemplate = $this-&gt;getOption('my_template');\r
2349 $couples = array(\r
2350                         array(\r
2351                                 'foo'=&gt;'Ricky',\r
2352                                 'bar'=&gt;'Lucy'),\r
2353                         array(\r
2354                                 'foo'=&gt;'Sid',\r
2355                                 'bar'=&gt;'Nancy'),\r
2356                         array(\r
2357                                 'foo'=&gt;'Mickey',\r
2358                                 'bar'=&gt;'Minnie')\r
2359                         );\r
2360 foreach ($couples as $values) {\r
2361         echo TEMPLATE::fill($mytemplate,$values);\r
2362 }</code></pre>\r
2363         これでプラグインのスキン変数 <code>&lt;%TemplateTest%&gt;</code> を書いたところに、次のように出力されます。\r
2364         <pre class="example"><code>&lt;li&gt;Ricky loves Lucy&lt;/li&gt;\r
2365 &lt;li&gt;Sid loves Nancy&lt;/li&gt;\r
2366 &lt;li&gt;Mickey loves Minnie&lt;/li&gt;</code></pre>\r
2367         </li>\r
2368         \r
2369         <li><strong>Nucleus コアのテンプレートシステムを使う方法。</strong>この方法は v3.4以降で使用できます。この方法の利点は、他のテンプレートと\r
2370         同じようにデータベースに格納され、配布用にテンプレートをエクスポートできるところにあります。この API を使用したプラグインのサンプルが、\r
2371         フォーラムの<a href="http://japan.nucleuscms.org/bb/viewtopic.php?p=24401#24401" title="Sample">新API「TemplateExtraFields」を使ったプラグインの見本</a>に\r
2372         (本家フォーラムのスレッドは <a href="http://forum.nucleuscms.org/viewtopic.php?p=87672#87672" title="Sample">Skin specific values for Plugins</a>)\r
2373         にあります。細かな点は本家フォーラムの <a href="http://forum.nucleuscms.org/viewtopic.php?p=87672#87672" title="Sample">Skin specific values for Plugins</a> スレッド\r
2374         を参照してください。ここでは要約のみ書いてあります。\r
2375         まず、<code>install()</code> メソッド中でプラグインオプションを作成し、ここでテンプレートのデフォルトの内容を定義します。\r
2376         <pre class="example"><code>$this-&gt;createOption('my_template', \r
2377                 'Template used to format output of plugin.', \r
2378                 'textarea', \r
2379                 '&lt;li&gt;&lt;%foo%&gt; loves &lt;%bar%&gt;&lt;/li&gt;');</code></pre>\r
2380         次に割り込みをかけるイベントのリストに <code>TemplateExtraFields</code> を登録します。\r
2381         <pre class="example"><code>function getEventList() { return array('TemplateExtraFields'); }</code></pre>\r
2382         そして、<code>event_TemplateExtraFields</code> メソッドを作成します。\r
2383         <pre class="example"><code>function event_TemplateExtraFields(&amp;$data) {\r
2384     /* Add an element in the $data['fields'] array using your plugin name as the key \r
2385         and an associative array containing the field name and field label*/\r
2386     /* note that your field names should be lowercase and include the name \r
2387         of your template as shown below. This will ensure that all template field names are unique. */\r
2388     $data['fields']['NP_TemplateTest'] = array(\r
2389         'templatetest_body'=&gt;'TemplateTest Body'\r
2390     );\r
2391 }</code></pre>\r
2392         最後に <code>doSkinVar()</code> メソッドで、テンプレートを埋めます。この時、スキン変数の引数に使用するテンプレート名が必要です。\r
2393         <pre class="example"><code>function doSkinVar($skinType,$template = '') {\r
2394         global $blog, $CONF, $manager,$member;\r
2395 \r
2396         $template =&amp; $manager-&gt;getTemplate($template);\r
2397         if (trim($template['templatetest_body']) == '')\r
2398                 $template['templatetest_body'] = $this-&gt;getOption('my_template');\r
2399                 \r
2400         $couples = array(\r
2401                         array(\r
2402                                 'foo'=&gt;'Ricky',\r
2403                                 'bar'=&gt;'Lucy'),\r
2404                         array(\r
2405                                 'foo'=&gt;'Sid',\r
2406                                 'bar'=&gt;'Nancy'),\r
2407                         array(\r
2408                                 'foo'=&gt;'Mickey',\r
2409                                 'bar'=&gt;'Minnie')\r
2410                         );\r
2411         foreach ($couples as $values) {\r
2412                 echo TEMPLATE::fill($template['templatetest_body'],$values);\r
2413         }       \r
2414 }</code></pre>\r
2415         ユーザーは『テンプレート編集』画面で、「TemplateTest Body」フィールドに出力したい形式でテンプレートを編集します。\r
2416         例えば「default/index」テンプレートを使って、こんな風にテンプレートを編集します。\r
2417         <pre class="example"><code>&lt;li&gt;&lt;%foo%&gt; loves &lt;%bar%&gt;!!!&lt;/li&gt;</code></pre>\r
2418         そしてスキンに <code>&lt;%TemplateTest(default/index)%&gt;</code> と書くと、そこに\r
2419         <pre class="example"><code>&lt;li&gt;Ricky loves Lucy!!!&lt;/li&gt;\r
2420 &lt;li&gt;Sid loves Nancy!!!&lt;/li&gt;\r
2421 &lt;li&gt;Mickey loves Minnie!!!&lt;/li&gt;</code></pre>と表示されます。<br />\r
2422         </li>\r
2423         \r
2424         <li><strong>通常のテンプレートを使って書式化。</strong>この方法は v3.4 以降で、アイテムを出力するプラグインで使用できます。\r
2425         この方法にはコアのテンプレートシステムの既存の「アイテム」フィールドを使うというアドバンテージがあり、スキン変数の <code>&lt;%blog%&gt;</code> \r
2426         の様に使用します。スキン変数の引数として、一つ以上のアイテムの ID と使用するテンプレート名を、また、BLOG クラスの <code>readLogFromList()</code> \r
2427         メソッドを呼び出せることが条件です。テンプレート変数として使用したい場合は、<code>doTemplateVar()</code> メソッドで使用することも出来ます。\r
2428         例として <code>doSkinVar()</code> メソッドでこのテクニックを使う方法を示しておきます。\r
2429         4つのアイテムの ID を引数として受け取り、「default/index」テンプレートを使って出力します。\r
2430         <pre class="example"><code>function doSkinVar($skinType,$item1 = 0,$item2 = 0,$item3 = 0,$item4 = 0) {\r
2431         global $blog;\r
2432         $highlight = '';\r
2433         $template = 'default/index';\r
2434         $item_array = array($item1,$item2,$item3,$item4);\r
2435         $blog-&gt;readLogFromList($item_array, $template);\r
2436 }</code></pre>\r
2437         \r
2438         </li>\r
2439 </ol>\r
2440 \r
2441 \r
2442 <h1>Additional Reading <a name="additional-reading" href="#top" class="toplink"><img src="../icon-up.gif" width="15" height="15" alt="back to top" /></a></h1>\r
2443 \r
2444 <p>このドキュメント以外にもあなたがプラグインを開発するにあたって、リンク先のページもきっと役立つことと思います。</p>\r
2445 <ul>\r
2446 <li><a href="http://wiki.nucleuscms.org/plugindev:index" title="Development Wiki">Development Wiki(公式サイト(英語))</a></li>\r
2447 <li><a href="http://japan.nucleuscms.org/wiki/plugindev" title="Development Wiki">Nucleusプラグインの技術情報(日本公式サイト)</a></li>\r
2448 <li><a href="sqltables.html" title="Database Tables">Nucleus - SQL テーブル構造</a></li>\r
2449 <!-- <li><a href="" title=""></a></li> -->\r
2450 </ul>\r
2451 \r
2452 <!--\r
2453 <pre class="example"><code></code></pre>\r
2454 <pre class="example"><code></code></pre>\r
2455 <pre class="example"><code></code></pre>\r
2456 <pre class="example"><code></code></pre>\r
2457 -->\r
2458 \r
2459 </body>\r
2460 </html>