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:[email protected] の形式も可
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
と名づけて保存し、プラグインディレクトリに置きます。最後の ?>
の後や、最初の <?
の前にスペースがないことを確認しましょう。ところで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
メソッドの実装に関する詳細情報はこちら |
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()
シンタックスを利用して呼び出します。
メソッド名 | 説明 |
---|---|
createOption(...)
createBlogOption(...) (v2.2)
createCategoryOption(...) (v2.2)
createMemberOption(...) (v2.2)
createItemOption(...) (v3.2)
|
新しいオプションを生成します。 |
deleteOption(...)
deleteBlogOption(...) (v2.2)
deleteCategoryOption(...) (v2.2)
deleteMemberOption(...) (v2.2)
deleteItemOption(...) (v3.2)
|
オプションを削除します。 |
setOption(...)
setBlogOption(...) (v2.2)
setCategoryOption(...) (v2.2)
setMemberOption(...) (v2.2)
setItemOption(...) (v3.2)
|
オプションに値をセットします。 |
getOption(...)
getBlogOption(...) (v2.2)
getCategoryOption(...) (v2.2)
getMemberOption(...) (v2.2)
getItemOption(...) (v3.2)
|
オプションの値を取得します。 |
getAllBlogOptions(...) (v2.2)
getAllCategoryOptions(...) (v2.2)
getAllMemberOptions(...) (v2.2)
getAllItemOptions(...) (v3.2)
|
与えられたオプションにより、すべての値(コンテクストごとの一つの値)の連想配列を返します。 |
getBlogOptionTop(...) (v3.2)
getMemberOptionTop(...) (v3.2)
getCategoryOptionTop(...) (v3.2)
getItemOptionTop(...) (v3.2)
|
与えられたオプションにより、すべての値のうちの最初の値を返します。 |
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 |
(v2.0b) 'プラグインオプションの編集'フォームが生成される前
(v2.2) パラメータ追加 (v3.2) 各オプションにパラメータ追加 |
|
PrePluginOptionsUpdate | (v3.2) プラグインオプションが更新される前。(このイベントを使ってオプションの新しい値を評価したり変更したりできます) |
|
PostPluginOptionsUpdate |
(v2.0b) プラグインオプションの更新後 (v2.2) コンテクストによって異なるパラメータ |
|
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) スキンがデータベースから削除された直後 |
|
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 と共に使うとフォームにフィールドを追加できます。 |
|
SpamCheck | (v3.3) 新しいコメントが追加されるときに呼ばれます。アンチスパムのプラグインはこのイベントを使ってコメントがスパムかどうかマークを付けられます。SpamCheck イベントの詳しい説明は別の文書を参照のこと(SpamCheck API 2.0) |
|
プラグインに簡単にオプションを登録・取得できるように一連のメソッドが用意されています。これらのオプションは直接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()
を再定義してください。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->getAdminURL(),
'tooltip' => 'ツールチップテキスト'
)
);
}
function hasAdminArea()
{
return 1;
}
プラグインディレクトリが 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');
}
このプラグイン依存チェックは、他のプラグインが依存しているプラグインがアンインストールされることも防ぎます。