Redmine 自体に手を入れずにマイページのブロックを追加する方法
需要はあるみたいなので、Redmine の本体に手を入れない改造ネタを続けてみます。
前の記事 Redmine自体に手を入れずに見た目を変更する方法 - すえひろがりっっっっ!
Redmineのマイページはユーザ毎にカスタマイズできたりして、ちょっとしたポータルっぽいことができます。
この項目はプラグインで増やすことができます。
この項目はRedmineではブロックと呼びます。(かどうかは知りませんが、変数名がBLOCKなのでここではそう呼ぶことにします)
今回は、自分が所属するプロジェクトへのリンクを一覧表示するブロックを追加してみます。
環境
Ruby | ruby 1.8.7 (2008-08-11 patchlevel 72) |
Redmine | 0.9 RC (rev. 3335) |
Rails | 2.3.5 |
1. プラグインディレクトリの作成
今回は MyPageBlockExample という名前でプラグインを作成します。
生成されるディレクトリ名は vendor/plugins/redmine_my_page_block_example となります。
$ ruby script/generate redmine_plugin MyPageBlockExample
2. ブロックディレクトリの作成
プラグインでブロックを置くディレクトリは決まっていて、
vendor/plugins/プラグインディレクトリ/app/views/my/blocks/
となっています。
今回の場合は vendor/plugins/redmine_my_page_block_example/app/views/my/blocks/ です。
$ mkdir -p vendor/plugins/redmine_my_page_block_example/app/views/my/blocks
3. 言語ファイルとブロックの作成
ブロックは、普通のビューとして rhtml で書きます。
ブロックの名前は、このビューのファイル名から決まります。
正確にはファイル名のうち最初の "." までの文字列から頭の_(アンダースコア)を除いたものがブロックの名前になります。
ここでは _my_project_list.rhml という名前にします。
ブロックの名前は「my_project_list」です
vendor/plugins/redmine_my_page_block_example/app/views/my/blocks/_my_project_list.rhtml
<h3><%= l(:my_project_list) %></h3> <p> <ul> <% Member.find(:all, :conditions => ['user_id = ?', User.current.id]).each do |member| %> <li><%= link_to member.project.name, :controller => 'projects', :action => 'show', :id => member.project_id %></li> <% end %> </ul> </p>
言語ファイルは前の記事と同様 config/locales/ja.yml に以下のように書きます。
ja: my_project_list: 所属プロジェクト一覧
ラベル名はブロックの名前と同じにする必要があります。
5. タネ明かし
ソースを読めば一目瞭然。
lib/redmine/views/my_page/block.rb
module Redmine module Views module MyPage module Block def self.additional_blocks @@additional_blocks ||= Dir.glob("#{RAILS_ROOT}/vendor/plugins/*/app/views/my/blocks/_*.{rhtml,erb}").inject({}) do |h,file| name = File.basename(file).split('.').first.gsub(/^_/, '') h[name] = name.to_sym h end end end end end end
ようするにプラグインの app/views/my/blocks/ 以下の rhml や erb を追加して、名前をそのファイル名から決めてるだけですね。