Redmineのプラグイン作成を始めようとして難航する要因の1つが、「Redmineプラグイン」といってもいくつか形式があり、それを知らずにやみくもにサンプルを見ていて混乱することがあるのではないか?と思いました。
Redmineの作り方をいろいろ調べてみたときに見た作り方を、今時点で認識している形式で分類します。(名前は整理上自分で勝手に付けたもので、Ruby on RailsやRedmineでそう名付けられているものではありません。また、作り方を理解できていない形式もあるので理解が深まると分類が変わるかもしれません。)
- MVCの各部品を作成するMVCプラグイン
- 既存の表示に追加するView hooksプラグイン*1
- 既存の表示(ビューテンプレート)を差し替えるプラグイン
- 既存の振る舞い(メソッド)を差し替えるパッチプラグイン*2
- マクロを提供するプラグイン
これを知らずに(1つしか方法がないと思って)やみくもにサンプルやドキュメント、ブログ等の記事をあたっていたら、いろいろなやり方に困惑してしまいました。それでも試行錯誤的にいじったり作ったりしているうちに、実は作り方にはいくつか種類があるんだな、ということが(いまさら、やっと)見えてきました。
やりたいことと、プラグイン作成の形式とを結びつける
URLのパス(正規表現パターン)で指定したページに、CSSかJavaScriptを追加して表示をカスタマイズしたい、という場合は、プラグインを作らずにView Customize Pluginを使って設定をするのが早道です(プラグインの作り方を習得しなくてもいいですし)。
独自にデータを持ち保存管理し、そのデータを用いた表示・操作をする場合は、MVCプラグインとして作ります。また、独自のデータはないが、表示は既存とは別に新たなページを用意したい、という場合もMVCプラグインとして作ります。
既存の表示に付けたしたい、という場合は、付けたしたい箇所にView hooksがあればhooksのプラグインとして作ります。View hooksがないときは、既存の表示で使われているビューテンプレート(.html.erb)を差し替える、あるいは、メソッドを差し替えるパッチ(alias_method_chain?)を使って差し替えます。
Wikiの記法を追加したい、という場合はマクロを用意します。