プラグイン開発についてその2
2008.06.04
前回に続いて「Hello, World!」プラグインの開発を例に説明を続けます。
「Hello, World!」プラグインの機能の一つである【テンプレートに記述すると「Hello, World!」と表示される。】機能
を実装します。
テンプレートに記述して表示することをSOYCMSではブロック機能と呼んでいます。
通常のブロックを用いてエントリーを表示する場合、以下のように記述します。
<div block:id="hoge"> ..... </div block:id="hoge">
プラグインでブロック機能を使う場合はテンプレートに以下のように記述します。
<div cms:plugin="hoge"> ..... </div cms:plugin="hoge">
cms:plugin="<プラグインID>"で指定のプラグインを呼び出すことが出来ます。
まずは適当なページを作成し、テンプレートに以下のように記述しましょう。
<div cms:plugin="helloworld"></div cms:plugin="helloworld">
このままでは何も表示されないため、プラグインにブロック表示機能を追加します。
function init_hello_world(){ .... CMSPlugin::addBlock(HELLO_WORLD_PLUGIN_ID,"page","hello_world_block"); } /** * Hello,World!プラグインのブロック画面 * @return 表示すべきHTML */ function hello_world_block(){ return "<p>Hello,World!</p>"; }
CMSPlugin::addBlock()メソッドを用いてブロック機能を追加します。
第一引数はプラグインID、第二引数はブロックの種類、第三引数にファンクション名を設定します。
第二引数のブロックの種類は現在は「page」のみ設定可能です。今後の拡張によって種類が増える予定です。
ページの確認から実際の表示を確認してみると、次のように表示されます。
表示されない場合はテンプレートにミスはないか、プラグインは有効になっているかを確認して下さい。
また、テンプレートに記述されたブロック内部のHTMLを取得することも可能です。
/** * Hello,World!プラグインのブロック画面 * @param $innerHTML HTML * @param $pageId 現在表示しているページのID * @return 表示すべきHTML */ function hello_world_block($innerHTML,$pageId){ return "<p>Hello,World!</p>"; }
第一引数にテンプレートのブロックのinnerHTMLが入ります。第二引数は現在表示しているページのIDです。
また、SOYCMSのプラグインの実相はcall_user_func()メソッドを用いて実現しているため、Objectを使用することもできます。
たとえば
$obj = new HelloWorldBlock(); CMSPlugin::addBlock(HELLO_WORLD_PLUGIN_ID,"page",array($obj,"hello_world_block"));
のように設定することでHelloWorldBlockクラスのhello_world_blockメソッドが呼ばれるように出来ます。
オブジェクトを利用することでテンプレートに書かれた属性値を受け取ることが出来ます。
例えばテンプレートに以下のように書かれていたとします。
<div cms:plugin="helloworld" cms:arg="100"> <p>.....</p> </div cms:plugin="helloworld">
HelloWorldBlockクラスに次のようなメソッドがあった場合、値を受け取ることが出来ます。
class HelloWorldBlock{ var $arg; function setCms_arg($value){ $this->arg = $value; } function hello_world_block(){ return "引数に" . $this->arg . "が設定されています。"; } }
数字を含む属性値などは受け取ることができない点には注意して下さい(例:arg1)
正しく動作した場合、次のように表示されます。
これで、「Hello,World!」プラグインの開発は終わりです。
お疲れ様でした。