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 という名前でプラグインを作成します。


$ ruby script/generate redmine_plugin MyPageBlockExample
生成されるディレクトリ名は vendor/plugins/redmine_my_page_block_example となります。

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: 所属プロジェクト一覧

ラベル名はブロックの名前と同じにする必要があります。

4. Redmineを再起動して確認

こんな感じで「所属プロジェクト一覧」が追加されます。

追加してみるとこんな感じで表示されます。

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 を追加して、名前をそのファイル名から決めてるだけですね。

6. まとめ

  • マイページのブロックはプラグインで簡単に追加できる。
  • Redmine の拡張はドキュメントを読むよりもソースを読んだほうが早いことが多い。

入門Redmine Linux/Windows対応
前田 剛
秀和システム
売り上げランキング: 112182