RedmineをPHPに移植したCandyCanev0.8.4をリリースしました。 このリリースによりさまざまなプラグインを開発できるようになりました。完全なプロダクトを作るというのはかなり難しい目標です。そこでプラグインシステムを用意して必要な人が自分の好きな機能を追加できるというのが望ましいと考えていました。CandyCaneのプラグインはCakePHPの流儀で作成する事ができ、これによりプラグインを作ってみる方が増えてくればよいなと思っています。ではプラグインの概要を見てみましょう。

CandyCaneのプラグインの基礎

CandyCaneのプラグインはCakePHPのプラグインです。. CakePHPのMVCをベースにしたコードを書く事でCandyCaneにプラグインとして追加できます。また追加のコードからCandyCaneのモデルやヘルパー、コンポーネントなどを呼び出す事が出来ます。例えばチケットのデータやプロジェクトのデータをモデルから取得できます。作成したページがCandyCaneとやり取りをする為のAPIも用意されています。これらのAPIはプラグインの内部のinit.phpから呼び出します。

画面上部のメニューへのページ追加

アプリケーション全体のレベルのページを追加したい場合は画面左上のメニューにリンクを追加する事になるでしょう。リンクを追加するにはMenuContainerオブジェクトをプラグインの中のinit.phpから使います。

$menuContainer = ClassRegistry::getObject('MenuContainer');
$menuContainer->addTopMenu(
	array(
		'url' => '/cc_nyancat/nyan/index',
		'class' => 'nyan-cat',
		'caption' => 'Nyan Cat',
		'logged' => false,
		'admin' => false
	)
);

プロジェクトタブへのページ追加

CandyCaneの多くのページはプロジェクト以下の要素として動作します。このようなページを作成する場合はページをプロジェクトタブに追加することになります。その場合はMenuContainerクラスを使います。また現在のプロジェクトをURLから推定する為のルーティングの設定が必要です。

$menuContainer->addProjectMenu(
  'nyancat',
  array(
          'plugin' => 'cc_nyancat',
          'controller' => 'cc_nyancat_chart',
          'action' => 'index',
          'class' => '',
          'caption' => 'Nyan Down Chart',
          'params' => 'project_id',
          '_allowed' => true // for bypassing permmission system.
  )
);
// make sure put new route setting which includes project_id
App::import('Core','Router');
Router::connect('/projects/:project_id/nyanchart/:action', array(
  'plugin' => 'cc_nyancat',
  'controller' => 'cc_nyancat_chart'
));

ページ内の特定の場所へのHTML挿入

CandyCaneの既存のページに変更を加えたい場合、テンプレートの構造を元に変更を加えられます。HookContainerクラスのオブジェクトを使って任意のテンプレートをフックできます。テンプレートが分離されているポイントに対しては好きなテンプレートを追加できます。例えばこの場合はNyan Catがissues/relationsテンプレートの後に表示されます。

$hookContainer = ClassRegistry::getObject('HookContainer');
$hookContainer->registerElementHook(
	'issues/relations', // target element name.
	'../../plugins/cc_nyancat/views/elements/nyancat', // additional template you want to inject.
	false // it should be true when you want to inject before the target template.
);

プラグインのインストール

http://www.youtube.com/watch?v=OuoBuQeSFdo

プラグインのインストールには手動の作業が必要ですが、近いうちに自動化する予定です。とはいえ手順はapp/pluginsの下にプラグインを展開するだけです。CandyCaneのプラグインは"cc_"で始まるディレクトリで作成され、CandyCaneは"app/plugins/cc_*"配下のinit.phpを探してプラグインをロードしています。

注)
プラグインのインストールはすでに自動化されました!

実際の例を見るにはcc_nyancat plugin のgithub上のコードを動かしてみてください。みなさんが実際にプラグインを作成して面白い使い方ができるようになることを楽しみしています。

おまけ:各界の反応

http://twitter.com/#!/kakutani/status/147181570883715073