getMinNucleusVersion
を適切に設定するのを忘れないでください。このドキュメントはNucleusプラグインの作り方についての解説です。
NucleusPlugin
クラスの概要<%plugin(...)%>
スキン変数<%plugin(...)%>
テンプレート変数action.php
を使ったアクションNucleusプラグインによって、誰もがNucleusの提供する機能を、Nucleus内部のPHPコードを変更することなく拡張することができます。プラグインはあるメソッドを実装したシンプルなPHPスクリプトで、Nucleusユーザー同士で簡単に交換することができます。インストールは簡単で、プラグインディレクトリにファイルをアップし、Nucleusにそれを認識させるだけです。
プラグインの利点は以下のとおりです。
すべてのプラグインファイルは config.php
に記述されたディレクトリに置く必要があります。一般的に、それは /your/path/nucleus/plugins/
になるでしょう。プラグインファイル名は NP_name.php
という形式を用いることにより認識されます。プラグインによっては、追加ファイルを格納する同名のサブディレクトリや、管理エリアを必要とします。
Np_
や np_
ではなく、NP_
で始まることに気をつけてください。またプラグインがサブディレクトリを使用する場合は、サブディレクトリの名称はすべて小文字にします。
では、シンプルなプラグインを書いてみましょう。基本的にプラグインは、あらかじめ定義された NucleusPlugin
クラスを継承したPHPクラスです。以下はHelloWorld
プラグインの例です。
<?php
class NP_HelloWorld extends NucleusPlugin
{
// プラグインの名前
function getName()
{
return 'Hello World';
}
// プラグインの作者
function getAuthor()
{
return 'Wouter Demuynck';
}
// プラグインのサイトURL
// mailto:foo@bar.com の形式も可
function getURL()
{
return 'http://nucleuscms.org/';
}
// プラグインのバージョン
function getVersion()
{
return '1.0';
}
// インストール済みのプラグインリストに表示される説明文
function getDescription()
{
return 'Just a sample plugin.';
}
function doSkinVar($skinType)
{
echo 'Hello World!';
}
function supportsFeature ($what)
{
switch ($what)
{
case 'SqlTablePrefix':
return 1;
default:
return 0;
}
}
}
?>
NP_HelloWorld.php
と名づけて保存し、プラグインディレクトリに置きます。最後の ?>
の後や、最初の <?php
の前にスペースがないことを確認しましょう。ところでNP は "Nucleus Plugin" って意味ですよ :-) 念のため。
<%HelloWorld%>
注意:カッコ内の名称 (HelloWorld
) は大文字小文字を識別します!
ここまではそれほど難しくなかったと思います。さらに読み進めて理解してください。
すべてのプラグインは、NucleusPlugin
というPHPクラスを継承しなければなりません。難しそうに聞こえても心配ご無用、大丈夫です。このPHPクラスの継承によって、プラグインに必要なメソッドだけを実装でき、いくつかの補助ファンクションにアクセスでき、つまりはあなたの人生はよりラクになります。
下記は NucleusPlugin
が提供する、再実装可能なメソッドの概要です。このクラス自身のソースコードを見たければ、nucleus/libs/PLUGIN.php
にあります。
メソッド名 | 説明 |
---|---|
getName() |
プラグイン名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では Undefined を返すため、必ず再定義されないといけません。 |
getAuthor() |
プラグインの作者名を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では Undefined を返すため、必ず再定義されないといけません。 |
getURL() |
プラグインをダウンロード可能な、またはプラグインの追加情報のあるサイトのURLを返します。そのようなサイトがない場合は作者のメールアドレスへの mailto:リンクが適切です。デフォルトの実装では Undefined を返すため、必ず再定義されないといけません。 |
getDescription() |
プラグインに関する説明文(長文)を返します。インストール済みプラグインリストに表示されます。デフォルトの実装では Undefined を返します。 |
getVersion() |
プラグインの現在のバージョンを返します。デフォルトは 0.0 を返します。 |
getMinNucleusVersion() |
(v2.0b) 最低限必要なNucleusのバージョンを返します。デフォルトは 155 (v1.55)を返します。後に導入されたプラグイン関連機能を利用している場合は、このファンクションを実装するようお願いします(例: v2.0 => 200)。ただし、Nucleus v1.55 はこのファンクションを使用しないため、新機能を利用したプラグインが(対応する前のシステムに)インストールされる可能性が残っています。 |
getMinNucleusPatchLevel() |
(v3.1) 最低限必要なNucleusのバージョン(getMinNucleusVersion )での、最低限必要なパッチレベルを返します。デフォルトは 0 を返します。このファンクションは主に新しいプラグインの機能がNucleusの最新版のパッチによって可能になる場合に用いられます。 |
init() |
プラグインを初期化します。このメソッドはプラグインオブジェクトが生成された直後に呼び出され、plugid 属性がセットされます。デフォルトではこのメソッドは何もしません。 |
doSkinVar($skinType) |
<%plugin(...)%> スキン変数によってプラグインが呼び出されたときにこのメソッドが呼ばれます。$skinType パラメータはプラグインが呼ばれた場所のスキンタイプに該当します(item , archive , ...)。パラメータが一つしかないことに混乱しないでください。複数パラメータを渡すことも可能です。doSkinVar メソッドの実装に関する詳細情報はこちら。デフォルトではこのメソッドはなにも出力しません。 |
doTemplateVar(&$item) |
基本的に doSkinVar と同じですが、今度はテンプレート内(item header/body/footer と dateheader/footer )での<%plugin(...)%> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなしてdoSkinVar メソッドに処理を渡します。doTemplateVar メソッドの実装に関する詳細情報はこちら |
doTemplateCommentsVar(&$item, &$comment) |
(v2.0b) 基本的に doSkinVar と同じですが、今度はテンプレート内(コメント部分)での<%plugin(...)%> 変数からの呼び出しになります。デフォルトではこのメソッドはテンプレートをスキンタイプとみなしてdoSkinVar メソッドに処理を渡します。doTemplateCommentsVar メソッドの実装に関する詳細情報はこちら |
doItemVar(&$item, &$param) |
(v3.30) 基本的に doSkinVar と同じですが、今度は投稿した記事内での<%plugin(...)%> 変数からの呼び出しになります。渡される引数のうち&$item は変数が記述されているアイテムのフルオブジェクトを、&$param はプラグインごとの関数のパラメータになります。 |
doIf($key, $value) |
(v3.30) スキン変数 if/ifnot/elseif/elseifnot に対して、プラグイン独自の判断をする事が出来るメソッドです。通常は、$key 変数が $value の値を持っているかを調べて、 true か false を返すことになります。このメソッドをプラグインに実装する場合は、作者は使用方法のドキュメントを書くようにしてください。 |
doAction($type) |
プラグインがユーザーインタラクションを求めたとき、 action.php を介してこのメソッドがそれを与えます。これはNucleus自身が新しいコメントや投票を処理するのに使用するスクリプトです。正しいパラメータを用いることで、プラグインからの doAction メソッドを呼び出せます。$type はオプションのメッセージタイプに該当します。doAction メソッド内で、リクエストからの追加の変数にアクセスできます。デフォルトではこのメソッドがエラーメッセージをトリガーすると'No Such Action' という文字列を返します。doAction に関する詳細情報はこちら |
install() |
このメソッドはプラグインがインストールされた際に呼ばれます。データベース・テーブルの生成やプラグインオプションの生成などの初期化作業を行うことができます。デフォルトではこのメソッドは何もしません。 |
unInstall() |
プラグインがアンインストールされた際に呼ばれます。この時点でデータベースに作られたプラグイン情報を消去すると良いです。デフォルトではこのメソッドは何もしません。 |
getEventList() |
プラグインはイベント登録が可能です。イベントはNucleusが何かアクションを起こすたびに生成されます。たとえば、AddItem イベントは、このイベントを登録しているすべてのプラグインを呼び出します。呼び出されるメソッドは event_AddItem($params) になります。 $params パラメータは、例えば AddItem の itemid のような、情報フィールドを複数持つ連想配列です。デフォルトではどのイベントにも登録されていないことを示す空の配列を返します。イベントに関する詳細情報はこちら |
getTableList() |
このメソッドはプラグインが生成したデータベース・テーブルの配列を返します。これはNucleusが提供するバックアップ機能で利用されるので、プラグインテーブルをバックアップに含めることができます。デフォルトでは空の配列を返します。 |
hasAdminArea() |
プラグインが独自の管理エリアをもつ場合 1 を、そうでない場合 0 を返します。デフォルトでは 0 を返します。 |
getPluginDep() |
(v3.2) プラグイン名の配列を返します。Nucleusはこれらのプラグインが前もってインストールされてない場合、プラグインのインストールを拒否します。デフォルトでは空の配列が返されます。プラグイン依存に関する詳細情報はこちら |
実装可能なメソッドの次は、NucleusPlugin
クラスが提供する、再実装すべきでない幾つかの特殊メソッドです。これらはプラグイン内で、$this->functionName()
シンタックスを利用して呼び出します。
メソッド名 | 説明 |
---|---|
|
新しいオプションを生成します。 |
|
オプションを削除します。 |
|
オプションに値をセットします。 |
|
オプションの値を取得します。 |
|
与えられたオプションにより、すべての値(コンテクストごとの一つの値)の連想配列を返します。 |
|
与えられたオプションにより、すべての値のうちの最初の値を返します。 |
getID() |
このプラグインのIDを返します(このIDはNucleus内部で利用されるものです)。 |
getAdminURL() |
プラグインの管理エリアが置かれたURLを返します(そのような管理エリアがない場合は、この情報は無効です)。 |
getDirectory() |
プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(そのようなファイルがない場合は、この情報は無効です)。結果は".../nucleus/plugins/plugname/ "のようになります。 |
getShortName() |
"NP_"部分を省き、全てを小文字にしたプラグインのクラス名を返します。この情報は getAdminURL と getDirectory で使用されます。 |
独自のスキン変数を生成し、<%plugin(PlugName,parameters)%>
または <%PlugName(parameters)%>
で呼び出すことが出来ます(すでに存在するスキン変数とかぶらない場合)。パラメータはカンマ区切りです。
スキン変数を扱うには、doSkinVar
メソッドを実装する必要があります。いくつかの例を以下に示します。
function doSkinVar($skinType)
function doSkinVar($skinType, $param1, $param2)
function doSkinVar($skinType, $skinVar, $param1, $param2)
function doSkinVar($skinType, $skinVar, $param1 = 'default value')
$skinType
パラメータは、'index', 'item', 'archive', 'archivelist', 'member', 'error', 'search', 'imagepopup', 'template'のうちの一つを取ります$skinVar
は、スキン変数のタイプとして解釈される実質的に最初のパラメータになります(例:<%plugin(PlugName,VarType)%>
)。doSkinVar()
(パラメータ無し)を使い、PHPファンクションのfunc_get_args()
を用いてパラメータを取得することができます。引数の数の異なる、タイプの違うスキン変数を扱うときに便利です。$currentSkinName
を使ってスキンの名前を取得できます。テンプレートプラグイン変数はスキンプラグイン変数と同様に働きますが以下の2点が異なります。
doTemplateVar
メソッドは &$item
パラメータを取ります。doTemplateCommentsVar
メソッドは &$item
と &$comment
パラメータを取ります。テンプレート変数はスキン変数と同じ要領で呼ばれます(<%plugin(PlugName,parameters)%>
または <%PlugName(parameters)%>
)。
デフォルトでは、全てのテンプレート変数は'template
'をskintype
パラメータとして、doSkinVar
メソッドに渡ります。
独自の実装を提供したい場合は、doTemplateVar
メソッドや doTemplateCommentsVar
メソッドを再定義する必要があります。skintype
パラメータが無くなる以外はdoSkinVarと同様に働きます。
function doTemplateVar(&$item)
function doTemplateVar(&$item, $param1, $param2)
function doTemplateVar(&$item, $type, $param1, $param2)
function doTemplateVar(&$item, $type, $param1 = 'default value')
function doTemplateCommentsVar(&$item, &$comment)
function doTemplateCommentsVar(&$item, &$comment, $param1, $param2)
function doTemplateCommentsVar(&$item, &$comment, $type, $param1, $param2)
function doTemplateCommentsVar(&$item, &$comment, $type, $param1 = 'default value')
$currentSkinName
を使ってテンプレートの名前を取得できます。プラグインは action.php
を通してアクションを行うことができ、同様のスクリプトがコメントや投票の受け取りにも使用されてます。GETまたはPOSTのどちらかを通して呼び出せます。必要なパラメータはaction
('plugin'と指定)、name
(プラグイン名)、type
(リクエストされたアクションの種類)です。
これらのアクションを有効にするために、doAction($actionType)
メソッドをプラグイン内で実装する必要があります。リクエストからの追加パラメータはrequestVar('name')
で取得できます(requestVar
はPHPが付加する magic_quotes_gpc に配慮しています)。
doAction
メソッドが文字列を返すとき、エラーとして解釈され、エラーメッセージが表示されます。
Nucleusプラグインはなにか重要なことが起きたときに発生するイベントに登録可能です。プラグインはイベント発生の際にアクションを実行したり、テキストを出力したりできます。
下記は PreAddComment
イベント(blogにコメントが追加される直前に生成されるイベント)にプラグインが登録する例です。
class NP_Acronyms extends NucleusPlugin {
...
function getEventList() { return array('PreAddComment'); }
...
function event_PreAddComment(&$data) {
// 頭字語 HTML を置き換え
$data['comment']['body'] =
strreplace('HTML',
'<acronym title="HyperText Markup Language">HTML</acronym>',
$data['comment']['body']);
}
}
このプラグインはコメント中の'HTML'というテキストを'<acronym title="HyperText Markup Language">HTML</acronym>
'に置き換えます。acronymタグはHTMLタグで、頭字語についての追加情報を提供します。
イベント登録に必要なステップは以下になります。
getEventList
メソッドから返る配列にイベント名を追加します。event_EventName($data)
という形でメソッドを生成し、この中でイベントを処理します。複数のプラグインが同じイベントに登録できます。管理エリアのプラグインリストの順序に従ってプラグインに通知が行きます。リストの上にあるプラグインほど早く通知されます。
event_EventName
メソッドはひとつだけ $data
パラメータを持ち、それはイベントごとに内容が異なります。これは連想配列です。この連想配列に渡されたオブジェクトや配列は参照形式で渡されるため、これらに加えた変更は記憶されます。
以下のイベントリストは、パラメータ変更がNucleusに知られるかどうかを示すために色を使い分けています。
パラメータとして渡されるオブジェクトはobject.として示されます。ほとんどのオブジェクトは参照渡しで、object by refのように示されます。
イベントの名前 | イベントが発生するタイミング | プラグインに渡されるパラメータ |
---|---|---|
InitSkinParse | スキンの初期化の直前 |
|
PreSkinParse | スキンのパースの直前 |
|
PostSkinParse | スキンのパースの直後 |
|
PreItem | アイテムのパース前、ただしアイテムヘッダーのパース後 |
|
PostItem | アイテムのパース後、ただしアイテムフッターのパース前 |
|
PreComment | コメントの表示前 |
|
PostComment | コメントの表示後 |
|
PreDateHead | 日付ヘッダーのパース前 |
|
PostDateHead | 日付ヘッダーのパース後 |
|
PreDateFoot | 日付フッターのパース前 |
|
PostDateFoot | 日付フッターのパース後 |
|
LoginSuccess | ログイン成功後 |
|
LoginFailed | ログイン失敗後 |
|
Logout | ログアウト後 |
|
PreBlogContent | blogの内容がスキン変数を通して挿入される前 |
|
PostBlogContent | blogの内容がスキン変数を通して挿入された後 |
|
PreAddComment | コメントがデータベースに追加される前 |
|
PostAddComment | コメントがデータベースに追加された後 |
|
PostRegister | 新規ユーザーの登録後 |
|
PostAddItem | アイテムがデータベースに追加された後 |
|
PostUpdateItem | アイテムがデータベースにアップデートされた直後 |
|
PreAddItem | アイテムがデータベースに追加される直前 |
|
PreUpdateItem | データベースにあるアイテムが更新される直前 |
|
PrepareItemForEdit | アイテムをデータベースから取得した直後で、編集のためにユーザーに表示される前 |
|
PreUpdateComment | コメントが更新され、データベースに保存される直前 |
|
PrepareCommentForEdit | コメントをデータベースから取得した直後で、編集のためにユーザーに表示される前 |
|
PrePluginOptionsEdit |
|
|
PrePluginOptionsUpdate | (v3.2) プラグインオプションが更新される前。(このイベントを使ってオプションの新しい値を評価したり変更したりできます) |
|
PostPluginOptionsUpdate |
|
|
PostAuthentication | (v2.0b) ログイン処理の完了後。ページリクエストごとに発生 |
|
PreAddItemForm | (v2.0b) アイテム追加フォーム(ブックマークレットまたは管理エリア)が生成される直前 |
|
AddItemFormExtras | (v2.0b) アイテム追加ページまたはブックマークレット内部のどこか。template ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。 |
|
EditItemFormExtras |
(v2.0b) アイテム編集ページまたはブックマークレット内部のどこか。template ファイルの類を別に用意しなくても、ここでプラグインがカスタムフィールドを追加できる。あまり多くのデータを追加しないこと。また以下のように正しいXHTMLを生成してください。
このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 plug_tb_url )。
|
|
BlogSettingsFormExtras | (v2.0) blog設定ページにフォームを追加可能
あまり多くのデータを追加しないこと。また以下のように正しいXHTMLを生成してください。
このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 plug_tb_url )。
|
|
PreDeleteItem | (v2.0) アイテムがデータベースから削除される直前 |
|
PostDeleteItem | (v2.0) アイテムがデータベースから削除された直後 |
|
PreDeleteCategory | (v2.0) カテゴリーがデータベースから削除される直前 |
|
PostDeleteCategory | (v2.0) カテゴリーがデータベースから削除された直後 |
|
PreDeleteBlog | (v2.0) blogがデータベースから削除される直前 |
|
PostDeleteBlog | (v2.0) blogがデータベースから削除された直後 |
|
PreDeleteMember | (v2.0) メンバーがデータベースから削除される直前 |
|
PostDeleteMember | (v2.0) メンバーがデータベースから削除された直後 |
|
PreDeleteTeamMember | (v2.0) メンバーがweblogチームから削除される直前 |
|
PostDeleteTeamMember | (v2.0) メンバーがweblogチームから削除された直後 |
|
PreDeleteComment | (v2.0) コメントがデータベースから削除される直前 |
|
PostDeleteComment | (v2.0) コメントがデータベースから削除された直後 |
|
ActionLogCleared | (v2.0) アクションログが消去された後 | なし |
PreDeleteTemplate | (v2.0) テンプレートがデータベースから削除される直前 |
|
PostDeleteTemplate | (v2.0) テンプレートがデータベースから削除された直後 |
|
PreDeleteSkin | (v2.0) スキンがデータベースから削除される直前 |
|
PostDeleteSkin | (v2.0) スキンがデータベースから削除された直後 |
|
PreDeleteSkinPart | スペシャルスキンパーツがデータベースから削除される直前 |
|
PostDeleteSkin | スペシャルスキンパーツがデータベースから削除された直後 |
|
PreDeletePlugin | (v2.0) プラグインがデータベースから削除される直前 |
|
PostDeletePlugin | (v2.0) プラグインがデータベースから削除された直後 |
|
PreDeleteBan | (v2.0) 禁止IPがデータベースから削除される直前 |
|
PostDeleteBan | (v2.0) 禁止IPがデータベースから削除された直後 |
|
PreAddCategory | (v2.0) 新しいカテゴリーがデータベースに生成される直前 |
|
PostAddCategory | (v2.0) 新しいカテゴリーがデータベースに生成された直後 |
|
PreAddBlog | (v2.0) 新しいblogが生成される直前 |
|
PostAddBlog | (v2.0) 新しいblogが生成された直後 |
|
PreAddPlugin | (v2.0) プラグインが追加される直前 |
|
PostAddPlugin | (v2.0) プラグインが追加された直後 |
|
PreAddTeamMember | (v2.0) メンバーがblogチームに追加される直前 |
|
PostAddTeamMember | (v2.0) メンバーがblogチームに追加された直後 |
|
PreAddTemplate | (v2.0) 新しいテンプレートが生成される直前(注:テンプレートが複製されたときも呼ばれる) |
|
PostAddTemplate | (v2.0) 新しいテンプレートが生成された直後 |
|
PreAddSkin | (v2.0) 新しいスキンが生成される直前(注:スキンが複製されたときも呼ばれる) |
|
PostAddSkin | (v2.0) 新しいスキンが生成された直後 |
|
PreAddBan | (v2.0) 新しい禁止IPが追加される直前 |
|
PostAddBan | (v2.0) 新しい禁止IPが追加された直後 |
|
PreMoveItem | (v2.0) アイテムが他のblog/カテゴリーに移される直前 |
|
PostMoveItem | (v2.0) アイテムが他のblog/カテゴリーに移された直後 |
|
PreMoveCategory | (v2.0) カテゴリーが他のblogに移される直前 |
|
PostMoveCategory | (v2.0) カテゴリーが他のblogに移された直後 |
|
MemberSettingsFormExtras | (v2.0) メンバー設定ページにフォームを追加可能
あまり多くのデータを追加しないこと。また以下のように正しいXHTMLを生成してください。
このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 plug_tb_url )。
|
|
GeneralSettingsFormExtras | (v2.0) 一般設定ページにフォームを追加可能
あまり多くのデータを追加しないこと。また以下のように正しいXHTMLを生成してください。
このようにして、正しい構造を保ちつつ複数のプラグインがオプションを保持できます。またフィールド名の重複を避けるためにプレフィックスを用いてください(例 plug_tb_url )。
|
なし |
AdminPrePageHead | (v2.5) 管理画面で、ページヘッドを出力する直前。このイベントはヘッド領域にスクリプトやCSSを追加するのに用いられます。 |
|
AdminPrePageFoot | (v2.5) 管理画面で、ページフッターを出力する直前。 |
|
PreSendContentType | (v2.5) HTTPヘッダーにコンテントタイプがセットされる直前 |
|
QuickMenu | (v2.5) 管理エリアのクイックメニューの一番下。そこへのプラグイン登録に利用されます。登録するにはoptionsに連想配列を入れます。実装例がプラグイン管理エリアを作るのセクションにあります。 |
|
BookmarkletExtraHead | (v2.5) ブックマークレット XHTMLコードのヘッド領域内。 |
|
FormExtra | (v3.2) このイベントは、プラグインがコメント、メンバー間メール、認証フォームのいずれかのフォーム内に追加フィールドを挿入するときに使います。フォーム処理の際に発生する ValidateForm イベントに対応します。 |
|
ValidateForm | (v3.2) コメント、メンバー間メール、アカウント認証のいずれかが処理されるときに呼ばれます。プラグインはこれで各データの評価を実行でき、もし不具合があれば処理を中断できます。FormExtra と共に使うとフォームにフィールドを追加できます。 |
|
ParseURL | (v3.22)NucleusのコアでURLからアイテムやカテゴリのIDを読み取る前。プラグインはこのイベントを使ってURLを解釈します |
|
GenerateURL | (v3.22)URLが自動生成される前。このイベントを使って独自のURLを生成する事が出来ます。 |
|
SpamCheck | (v3.3) 新しいコメントが追加されるときに呼ばれます。アンチスパムのプラグインはこのイベントを使ってコメントがスパムかどうかマークを付けられます。SpamCheck イベントの詳しい説明は別の文書を参照のこと(SpamCheck API 2.0) |
|
PreMediaUpload | (v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれる前。 |
|
PostMediaUpload | (v3.3)アップロードされたファイルが「media」ディレクトリに書き込まれた後。 |
|
SendPing | (v3.3)「ブログの設定」で「更新時にweblogsアップデート通知サービスへPingを送りますか?」が「はい」に設定されている時に限り、新しいアイテムを追加した時に呼び出されます(このイベントに対応しているプラグインがインストールされている時に限る)。このイベントはPing送信プラグインで各種「ブログ検索サービス」へ更新pingを送信します(例えばGoogleブログ検索など) |
|
JustPosted | (v3.3)投稿された未来の日付のアイテムの設定時刻が来た時。このイベントはページの表示が完了した後に発生条件をチェックします。 |
|
RegistrationFormExtraFields | (v3.33) createaccount.php からビジターに表示されるアカウント作成フォームが表示され、FormExtra イベントが起きる前。プラグインはこのイベントによって、アカウント作成フォームに独自のフィールドを付け加える事が出来ます。PostRegister イベントに同時に登録すると、付け加えたフィールドの値を評価する事が出来る様になります。渡されるパラメータは、付け加えられたフィールドを、元々のフィールドと違和感無く表示させる為に使用されます。 |
|
TemplateExtraFields | (v3.40) テンプレートが編集・更新される時。プラグイン製作者がコアのテンプレートシステムをより使いやすくするために、テンプレートにフィールドを追加する事が出来ます。プラグイン作者は追加するテンプレートフィールドの初期状態をプラグインオプションに保存し、そこで使用するテンプレート変数についてのドキュメントを書くことが要求されます。また、このイベントに関するサンプルプラグインが、フォーラムの新API「TemplateExtraFields」を使ったプラグインの見本(本家フォーラムのスレッドは Skin specific values for Plugins)にあります。 |
|
PreArchiveListItem | (v3.40) アーカイブリストが表示される前。アーカイブリストを表示するために使われたテンプレートのアーカイブリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。 |
|
PreCategoryListItem | (v3.40) カテゴリーリストが表示される前。カテゴリーリストを表示するために使われたテンプレートのカテゴリーリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。 |
|
PreBlogListItem | (v3.40) ブログリストが表示される前。ブログリストを表示するために使われたテンプレートのブログリスト本体フィールドのテンプレート変数を追加/修正することを可能にします。追加のテンプレート変数についてのドキュメントも整備すべきです。 |
|
PreTemplateRead | (v3.40) テンプレートが読み込まれる直前。読み込むテンプレートを変更する事が出来ます。NP_MultiLanguage はこのイベントを使用しています。 |
|
CustomLogin | (v3.40) Nucleus にログインする直前。ログインの手順をカスタマイズできます。外部認証を簡素化し、ログイン ID にメールアドレス等を使用出来る様になります。 |
|
プラグインに簡単にオプションを登録・取得できるように一連のメソッドが用意されています。これらのオプションは直接Nucleusの管理エリアで編集でき、プラグイン自身の管理エリアを用意する必要もなく、PHPファイルそのものの中にオプションの値を書き込まずにすみます。
オプションは異なったコンテクストで利用可能です。
オプションにはいくつかのタイプが提供されています。
Nucleus v3.2よりオプション・メタデータを用いて、オプションタイプを正しい値を受け取れるように制限できるようになりました。このメタデータは $typeExtras
フィールドにセミコロン区切りのリストで保存されます。注:selectオプションでは、selectリストは$typeExtras
のなかで一番最初でなければいけません。
キー | 説明 |
---|---|
datatype |
Nucleus本体に、どのデータ型を使いたいかという追加情報を与えます。現在は 'numerical ' のみ利用できます。 'numerical ' を指定することでNucleusは数値情報のみを受け付けます(クライアントサイド・サーバサイド両方でチェック) ('select ' と 'text 'のオプションタイプで利用できます) |
access |
'readonly 'にセットすることで、オプションを編集不可能にします('text ' と 'textarea 'のオプションタイプで利用できます)' hidden 'を使うと、利用者側にそのオプションの存在を完全に隠蔽します('text 'のオプションタイプで利用できます) |
設定例
// 数値のみを受け付けるテキストオプションを作成
$this->createBlogOption('FooBar', 'foobar', 'text', '0', 'datatype=numerical');
// 数値のみを受け付けるセレクトオプションを作成
$this->createItemOption('FooBar', 'foobar', 'select', '0', '0|0|1|1|2|2;datatype=numerical');
// 編集不可能なテキストエリアオプションを作成
$this->createOption('FooBar', 'foobar', 'textarea', 'This textarea is readonly', 'access=readonly');
グローバルなコンテクストで新しいオプションを生成します。
パラメータ | 値 |
---|---|
$name | オプション名 |
$desc | オプション編集画面で表示される説明文 |
$type | オプションタイプ(前出) |
$defValue | 初期値 |
$typeExtras | オプションタイプの追加情報(前出) |
blogのコンテクストで新しいオプションを生成します(createOption
を参照)。
カテゴリーのコンテクストで新しいオプションを生成します(createOption
を参照)。
メンバーのコンテクストで新しいオプションを生成します(createOption
を参照)。
アイテムのコンテクストで新しいオプションを生成します(createOption
を参照)。
すでにデータベースに存在するオプションの値を変更します。
パラメータ | 値 |
---|---|
$name | オプション名 |
$value | 新しい値 |
blogオプションの値を変更します。blogid
属性はどのblogでそのオプションが有効かを示します(その他のオプション:setOption
を参照)。
カテゴリーオプションの値を変更します。catid
属性はどのカテゴリーでそのオプションが有効かを示します(その他のオプション:setOption
を参照)。
メンバーオプションの値を変更します。memberid
属性はどのメンバーでそのオプションが有効かを示します(その他のオプション:setOption
を参照)。
アイテムオプションの値を変更します。itemid
属性はどのアイテムでそのオプションが有効かを示します(その他のオプション:setOption
を参照)。
データベース内のオプションの値を返します。
パラメータ | 値 |
---|---|
$name | オプション名 |
blogオプションの値を返します。blogid
属性は値がリスエストされたblogを示します(その他のオプション:getOption
を参照)。
カテゴリーオプションの値を返します。catid
属性は値がリスエストされたカテゴリーを示します(その他のオプション:getOption
を参照)。
メンバーオプションの値を返します。memberid
属性は値がリスエストされたメンバーを示します(その他のオプション:getOption
を参照)。
アイテムオプションの値を返します。itemid
属性は値がリスエストされたアイテムを示します(その他のオプション:getOption
を参照)。
データベースからオプションを削除します。
パラメータ | 値 |
---|---|
$name | オプション名 |
blogオプションを削除します(deleteOption
を参照)。
カテゴリーオプションを削除します(deleteOption
を参照)。
メンバーオプションを削除します(deleteOption
を参照)。
アイテムオプションを削除します(deleteOption
を参照)。
与えられたblogオプションの全ての値を返します。結果は存在するblogidごとの連想配列です。
与えられたカテゴリーオプションの全ての値を返します。結果は存在するcatidごとの連想配列です。
与えられたメンバーオプションの全ての値を返します。結果は存在するmemberidごとの連想配列です。
与えられたアイテムオプションの全ての値を返します。結果は存在するitemidごとの連想配列です。
与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのblogid ('id') の値 ('value') を持つ配列になっています。
パラメータ | 値 |
---|---|
$name | オプション名 |
$amount | 必要なオプション数 |
$sort | 昇順 ('asc') か降順 ('desc') で並べ替え |
与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのメンバーID ('id') の値 ('value') を持つ配列になっています(パラメータはgetBlogOptionTop
を参照)。
与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのカテゴリーID ('id') の値 ('value') を持つ配列になっています(パラメータはgetBlogOptionTop
を参照)。
与えられたオプションの最初の値を返します。結果は配列で、各要素がそれぞれのアイテムID ('id') の値 ('value') を持つ配列になっています(パラメータはgetBlogOptionTop
を参照)。
init()
メソッド内に置きます。
v2.0まで、Nucleusテーブルへのアクセスは単にnucleus_
と名づけられたテーブルに対してSQL命令を実行するだけのものでした。Nucleusのバージョン2.2以降はカスタム・テーブル名を利用できるようになったため、プラグイン開発に若干注意する必要があります。
nucleus_item
などの固定されたテーブル名の代わりに、テーブル名のプレフィックスを生成するために sql_table('item')
というグローバルファンクションを利用します。supportsFeature('SqlTablePrefix')
が呼ばれたときにプラグインが1(真)を返すようにします。これがないと、カスタムプレフィックスがセットされている場合でバージョンが2.0より大きいNucleusではプラグインをロードできません(用心のため)。v2.0までのNucleusではグローバルファンクション sql_table
は利用できないことに注意してください。もしこのメソッドを用いつつ、プラグインをv2.0以下のNucleusで動作させたい場合は、以下のコードをプラグインクラスの前に追加してください。
<?
// プラグインがNucleusバージョン2.0以下と互換性を持つために必要
if (!function_exists('sql_table'))
{
function sql_table($name) {
return 'nucleus_' . $name;
}
}
class NP_HelloWorld extends NucleusPlugin {
...
}
?>
もしプラグイン独自のテーブルが必要なら、install
メソッドの中で独自テーブルを生成し、unInstall
メソッドの中でそれを削除するようにします。
いくつかの注意点
nucleus_plug_plugname
のように、他のプラグインと競合しないテーブル名を考えてください。カスタムプレフィックスに対応するため、テーブル名をsql_table('plug_plugname')
で生成してください。mysql_query()
を使ってSQL命令を実行できます。sql_connect()
を呼ぶことで可能です。頻繁な再接続を避けるために、コンストラクタでそれを行うのも良いです。$this- >db
のリンクIDを保持でき、各クエリにそれを渡すことができます。getTableList()
を再定義してください。$this->createOption('del_uninstall', 'Delete NP_MyPlugin data tables on uninstall?', 'yesno','no');
そしてuninstall()メソッドで、次のようにします。
if ($this->getOption('del_uninstall') == 'yes') {
foreach ($this->getTableList() as $table) {
sql_query("DROP TABLE $table");
}
}
Ver2.5から、Nucleusの管理エリアに統合されたプラグイン管理エリアを作成できます。これらのページは従来のプラグイン管理ページや左側のクイックメニューからアクセスできます。
管理エリアを提供するには、次のステップが必要です。
NP_PluginName
なら、'pluginname'です。ディレクトリ名はすべて小文字で!<?php
// if your 'plugin' directory is not in the default location,
// edit this variable to point to your site directory
// (where config.php is)
$strRel = '../../../';
include($strRel . 'config.php');
if (!$member->isLoggedIn())
doError('You\'re not logged in.');
include($DIR_LIBS . 'PLUGINADMIN.php');
// create the admin area page
$oPluginAdmin = new PluginAdmin('PluginName');
$oPluginAdmin->start();
echo '<h2>プラグイン名</h2>';
echo '<p>ページ内容<p>';
$oPluginAdmin->end();
?>
function event_QuickMenu(&$data) {
array_push(
$data['options'],
array(
'title' => 'プラグイン名',
'url' => $this-%gt;getAdminURL(),
'tooltip' => 'ツールチップテキスト'
)
);
}
function hasAdminArea()
{
return 1;
}
quickmenu
というyesno
タイプのオプションがinstall()にあるとします。次のように、クイックメニュー登録の表示を最高管理者とブログ管理者に制限します。
function event_QuickMenu(&$data) {
// only show when option enabled
if ($this->getOption('quickmenu') != 'yes') return;
global $member;
if (!$member->isAdmin() && !count($member->getAdminBlogs())) return;
array_push($data['options'],
array('title' => 'PluginName',
'url' => $this->getAdminURL(),
'tooltip' => 'Administer NP_PluginName'));
}
プラグインディレクトリが nucleus/plugins/ ではない場合は、index.php内の $strRel
変数は手動で書き換える必要があります。PluginAdmin
クラスは助けになります。これを一度生成すれば、$oPluginAdmin->plugin
でプラグインのインスタンスにアクセスできます。
Nucleus v3.2から、プラグインの機能の概要、利用できるスキン・テンプレート変数、さらに詳細な情報のありかなどを示すヘルプページを提供可能になりました。
ヘルプページは管理画面のプラグイン一覧からアクセス可能になります。
ヘルプページを提供するために、次のステップが必要です。
<h3>プラグインの概要</h3>
<p>このプラグインはヘルプページがいかに機能するかを示すためだけのものです</p>
<h3>インストール</h3>
<p>これを読めてるならインストールは正しく出来てます :-)</p>
<h3>スキン変数</h3>
<p>このプラグインはただのテストケースなのでスキン・テンプレート変数はありませんが、書くとすれば。
<ul><li><b><%HelpPageTestCase1%></b>: なにかをする</li>
<li><b><%HelpPageTestCase1(foobar)%></b>: 別のなにかをする</li></ul></p>
<h3>サポートとバグ報告</h3>
<p>さらなるサポートやバグ報告のために、次のフォーラムのスレッドを利用してください。
<a href="http://forum.nucleuscms.org/viewtopic.php?t=<トピックID>">
http://forum.nucleuscms.org/viewtopic.php?t=<トピックID></a></p>
<h3>バージョン履歴</h3>
<ul><li>Version 0.1: 最初のテストケースバージョン</li>
<li>Version 0.0: その前のバージョン ;-)</li></ul>
function supportsFeature($what) {
switch($what) {
case 'HelpPage':
return 1;
default:
return 0;
}
}
v3.2から、他のプラグインとの依存関係を宣言する新しいプラグインインターフェイスが追加されました。 他のプラグインの機能を必要とするプラグインに利用できます。特に依存関係が成立しなくて正しく機能しない状態を検知するときに便利です。
現実世界での例からはじめましょう。
NP_PageLinkList は NP_BlogWithOffset の機能を利用するため、利用者には NP_BlogWithOffset のインストール後に NP_PageLinkList をインストールさせたいとします。 NucleusはこのAPIによって、インストール前に依存関係を検知させる方法をプラグインに提供します。
このケースでは、NP_PageLinkList 側に NP_BlogWithOffset が必要だということを認識させるコードを埋め込みます。
プラグインがインストールされる際に、Nucleusコアは getPluginDep()
というファンクションを呼び出します。
このファンクションは必要なプラグインのリストを返し、コアはインストール済みのプラグインをチェックして、もし依存関係に欠如があればインストールを拒否します。
必要なことは NP_PageLinkList にこのファンクションを追加する、ただそれだけです。
function getPluginDep() {
return array('NP_BlogWithOffset');
}
このプラグイン依存チェックは、他のプラグインが依存しているプラグインがアンインストールされることも防ぎます。
あなたと同じ言葉を話さない世界中の人達がプラグインをより使いやすくするために、プラグインを多国語化できます。 少し手間は増えますが、プラグインが出力する文章を翻訳するだけで可能です。 以下に Nucleus のコアで用意されている標準的な手順を記載します。 Andyさん、ありがとう!
<?php
define('_ABCDEF_MESSAGENAME', '実際のメッセージ');
. . .
?>
全ての文を定義する必要があります。定数は一回しか定義できないので、既に定義されているものと重複しないようにプラグインの名前をはじめにつけることが推奨されます(この例だと _ABCDEF)。 function init() {
// include language file for this plugin
$language = ereg_replace( '[\\|/]', '', getLanguageName());
if (file_exists($this->getDirectory().$language.'.php'))
include_once($this->getDirectory().$language.'.php');
else
include_once($this->getDirectory().'english.php');
}
このコードは Nucleus のコアで使用されているものと同一です。偉大なプラグインのいくつかは、様々なスキンや URL の生成において、必ずしもそのまま使用できるとはいえません。なぜなら、doSkinVar() メソッドによって出力されるものが、 ユーザーのニーズに十二分に合致するものであるとは言いがたいからです。Nucleus では、出力をここのユーザーによっておのおののニーズに沿ったものにする為に、いくつかのツールを用意しています。
各ブログ・カテゴリー・アイテム・メンバー、それから action.php や管理エリア、または各プラグインの管理エリアなどの URL を出力する為に、Nucleus はコアの機能として いくつかのファンクションとグローバル変数を用意しています。:
名前 | 種類 | 引数 | 説明 |
---|---|---|---|
$CONF['AdminURL'] |
グローバル変数 | なし | Nucleus の管理領域への絶対 URL |
$CONF['PluginURL'] |
グローバル変数 | なし | Nucleus のプラグインディレクトリへの絶対 URL。$CONF['PluginURL'].'pluginname/' の様にして、プラグインの管理エリアへのリンク生成に使用する。 |
$CONF['ActionURL'] |
グローバル変数 | なし | Nucleus の action.php への絶対 URL。 |
$CONF['MediaURL'] |
グローバル変数 | なし | Nucleus のメディアディレクトリへの絶対 URL。 |
$CONF['SkinsURL'] |
グローバル変数 | なし | Nucleus のスキンディレクトリへの絶対 URL。 |
$CONF['IndexURL'] |
グローバル変数 | なし | Nucleus のメインディレクトリへの絶対 URL。 |
$DIR_NUCLEUS |
グローバル変数 | なし | Nucleus のメインディレクトリへのシステムルートからのフルパス。 |
$DIR_SKINS |
グローバル変数 | なし | Nucleus のスキンディレクトリへのシステムルートからのフルパス。 |
$DIR_MEDIA |
グローバル変数 | なし | Nucleus のメディアディレクトリへのシステムルートからのフルパス。 |
$DIR_PLUGINS |
グローバル変数 | なし | Nucleus のプラグインディレクトリへのシステムルートからのフルパス。 |
$DIR_LANG |
グローバル変数 | なし | Nucleus の言語ファイルディレクトリへのシステムルートからのフルパス。 |
$DIR_LIBS |
グローバル変数 | なし | Nucleus のコアディレクトリへのシステムルートからのフルパス。 |
getAdminURL() |
PLUGIN クラス内メソッド | なし | プラグインの管理エリアディレクトリが存在すればその URL を返す(存在しない場合は無効)。 |
getDirectory() |
PLUGIN クラス内メソッド | なし | プラグインの追加ファイルが格納されたサーバーのファイルシステムのパスを返します(存在しない場合は無効)。結果は".../nucleus/plugins/plugname/"のようになります。 |
createItemLink($itemid, $extra = '') |
グローバルファンクション | $itemid 整数。リンクしたいアイテムの ID。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $itemid に対応したアイテムへのリンクが生成されます。 |
createMemberLink($memberid, $extra = '') |
グローバルファンクション | $memberid 整数。リンクしたい存在するメンバーの ID。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $memberid に対応したメンバーへのリンクが生成されます。 |
createCategoryLink($catid, $extra = '') |
グローバルファンクション | $catid 整数。リンクしたいカテゴリーの ID。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $catid に対応したカテゴリーへのリンクが生成されます。 |
createArchiveListLink($blogid = '', $extra = '') |
グローバルファンクション | $blogid 整数。リンクしたいアーカイブ一覧が存在ブログの ID。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $blogid に対応したアーカイブ一覧へのリンクが生成されます。 |
createArchiveLink($blogid, $archive, $extra = '') |
グローバルファンクション | $blogid 整数。リンクしたい月別アーカイブが存在するブログの ID。$archive 文字列。アーカイブのパラメータとして、渡した「日(または年、月)」のものが存在するもの。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $blogid に対応した月別アーカイブへのリンクが生成されます。 |
createBlogidLink($blogid, $extra = '') |
グローバルファンクション | $blogid 整数。リンクしたいブログの ID。$extra 連想配列。「キー」と「値」のペアが、URL の「パラメータ」と「値」に反映される。
|
ユーザーによって選択されたスキームにより、 $blogid に対応したブログへのリンクが生成されます。 |
出力する文字列をテンプレートを使って整形出来るようにしましょう。あなたが順不同のリストで出力したいと考えていたとしても、別のユーザーは同じデータを
記号で区切ったり、特別な形で出力したいと考えるかもしれません。Nucleus にはテンプレートデータを作ったり定義したりする2種類の方法があります。
次に上げるれいの両方において、<%foo%>
と <%bar%>
のふたつのテンプレート変数を使用します。
install()
メソッド
に記述する事によって簡単に作成する事が出来ますが、アップグレードのためにプラグインを削除した時に、ユーザーは同時にカスタマイズした
テンプレートを失ってしまうという大きなデメリットがあります。
$this->createOption('my_template',
'プラグインの出力の為のテンプレート',
'textarea',
'<li><%foo%> loves <%bar%></li>');
doSkinVar()
メソッドで、foo
と bar
を次のように定義して、テンプレートを埋めます。
$mytemplate = $this->getOption('my_template');
$couples = array(
array(
'foo'=>'Ricky',
'bar'=>'Lucy'),
array(
'foo'=>'Sid',
'bar'=>'Nancy'),
array(
'foo'=>'Mickey',
'bar'=>'Minnie')
);
foreach ($couples as $values) {
echo TEMPLATE::fill($mytemplate,$values);
}
これでプラグインのスキン変数 <%TemplateTest%>
を書いたところに、次のように出力されます。
<li>Ricky loves Lucy</li>
<li>Sid loves Nancy</li>
<li>Mickey loves Minnie</li>
install()
メソッド中でプラグインオプションを作成し、ここでテンプレートのデフォルトの内容を定義します。
$this->createOption('my_template',
'Template used to format output of plugin.',
'textarea',
'<li><%foo%> loves <%bar%></li>');
次に割り込みをかけるイベントのリストに TemplateExtraFields
を登録します。
function getEventList() { return array('TemplateExtraFields'); }
そして、event_TemplateExtraFields
メソッドを作成します。
function event_TemplateExtraFields(&$data) {
/* Add an element in the $data['fields'] array using your plugin name as the key
and an associative array containing the field name and field label*/
/* note that your field names should be lowercase and include the name
of your template as shown below. This will ensure that all template field names are unique. */
$data['fields']['NP_TemplateTest'] = array(
'templatetest_body'=>'TemplateTest Body'
);
}
最後に doSkinVar()
メソッドで、テンプレートを埋めます。この時、スキン変数の引数に使用するテンプレート名が必要です。
function doSkinVar($skinType,$template = '') {
global $blog, $CONF, $manager,$member;
$template =& $manager->getTemplate($template);
if (trim($template['templatetest_body']) == '')
$template['templatetest_body'] = $this->getOption('my_template');
$couples = array(
array(
'foo'=>'Ricky',
'bar'=>'Lucy'),
array(
'foo'=>'Sid',
'bar'=>'Nancy'),
array(
'foo'=>'Mickey',
'bar'=>'Minnie')
);
foreach ($couples as $values) {
echo TEMPLATE::fill($template['templatetest_body'],$values);
}
}
ユーザーは『テンプレート編集』画面で、「TemplateTest Body」フィールドに出力したい形式でテンプレートを編集します。
例えば「default/index」テンプレートを使って、こんな風にテンプレートを編集します。
<li><%foo%> loves <%bar%>!!!</li>
そしてスキンに <%TemplateTest(default/index)%>
と書くと、そこに
<li>Ricky loves Lucy!!!</li>
<li>Sid loves Nancy!!!</li>
<li>Mickey loves Minnie!!!</li>
と表示されます。<%blog%>
の様に使用します。スキン変数の引数として、一つ以上のアイテムの ID と使用するテンプレート名を、また、BLOG クラスの readLogFromList()
メソッドを呼び出せることが条件です。テンプレート変数として使用したい場合は、doTemplateVar()
メソッドで使用することも出来ます。
例として doSkinVar()
メソッドでこのテクニックを使う方法を示しておきます。
4つのアイテムの ID を引数として受け取り、「default/index」テンプレートを使って出力します。
function doSkinVar($skinType,$item1 = 0,$item2 = 0,$item3 = 0,$item4 = 0) {
global $blog;
$highlight = '';
$template = 'default/index';
$item_array = array($item1,$item2,$item3,$item4);
$blog->readLogFromList($item_array, $template);
}
このドキュメント以外にもあなたがプラグインを開発するにあたって、リンク先のページもきっと役立つことと思います。