Redmine自体に手を入れずに見た目を変更する方法
Redmine は Rails 製なので、ちょっとした気に入らない部分は直接手を入れたくなるのだけれども、本家のアップデートが早いのでやはりプラグイン形式にしておいた方がいい。なので、拡張ポイントというか、できることをメモしておきます。
以下の4つの方法とそれぞれの例を紹介します。
他に方法があればコメントください。(それが目的
テーマで見た目を変える
これが一番簡単。
例えば、チケットの履歴って、デフォルトではこんな感じで、パッと見でいくつあるのか分かりづらい。
区切り先がユーザ名と変更内容の間に入っていることが原因だと考えられます。
そこで、テーマを作って見やすくすることを考えます。
1.既存テーマをコピー
まず、theme ディレクトリ以下の既存のテーマをコピーします。
$ cd Redmineインストールディレクトリ/pulbic/themes/
$ cp -R alternate newtheme
プラグインで表示を追加(View Hooks)
Redmine はプラグインで拡張することが意識されています。
View Hook はあらかじめ定められた場所にプラグインから表示項目の追加を可能とする機構です。
Hookの一覧は Hooks - Redmine にあります。
また,
でも確認することができます。
$ rake redmine:plugins:hook_list
ここでは :view_account_left_bottom を使って、アカウント情報の左下に担当チケット数を表示してみます。
1.プラグインの作成
プラグインの作成方法の詳細は Redmine プラグイン開発入門 - mallowlabsの備忘録 を参照。
$ ruby script/generate redmine_plugin AccountTichets
2.リスナの作成
vendor/plugins/redmine_account_tichets/lib/account_listener.rb として以下のリスナを作成します。
class AccountListener < Redmine::Hook::ViewListener def view_account_left_bottom(context) user = context[:user] assigned_issues = Issue.visible.open.find(:all, :conditions => {:assigned_to_id => User.current.id}) reported_issues = Issue.visible.find(:all, :conditions => {:author_id => User.current.id }) html = '' html << '<h3>Tickets</h3><ul>' html << '<li>assigned: ' + assigned_issues.size.to_s + ' Tickets</li>' html << '<li>reported: ' + reported_issues.size.to_s + ' Tickets</li>' html << '</ul>' html end end
- ViewHookを利用するには Redmine::Hook::ViewListener を継承したリスナクラスを作成します。
- :view_account_left_bottom にフックする場合は view_account_left_bottom というメソッドにします。
- view_account_left_bottom の引数はハッシュで、Hooks - Redmine の Context に相当します。context[:user]で Userオブジェクトが取得できます。この場合はログインユーザ本人です
- ViewListener のメソッドは HTMLを返す必要があります。返されたHTMLはそのまま該当箇所に表示されます。
3.リスナの登録
pluginディレクトリ直下のinit.rb で require するだけです。
require 'redmine' require 'account_listener' # ここを追加 Redmine::Plugin.register :redmine_account_tichets do name 'Redmine Account Tichets plugin' author 'Author name' description 'This is a plugin for Redmine' version '0.0.1' end
プラグインで言語ファイルの上書き
言語ファイル(config/locales/*.yml)の内容は、プラグインの方が優先されます。
これを利用して文言を変更することができます。
2. 言語ファイルの作成
vendor/plugins/redmine_literal_overwrite/config/locales/ja.yml を作成し、以下のように config/locales/ja.yml にある項目を上書きします。
ja: field_tracker: チケット種別 field_tilte: タイトル field_description: 詳細 field_status: 状態
3. Redmine を再起動して確認
プラグインでrhtmlファイルの上書き
どうしようもない場合はもとからあるrhtmlファイルを上書きしてしまうこともできます。
ただし、この方法は本体がアップデートしたときに、もとのファイルが変更されていることに気づかなかったり、もとのファイルが消されて、もう使われなくなっていたりする可能性があるので気を付けましょう。
ここでは、チケット画面の Atom のリンクを削除します。
2. もとのファイルをコピーする
チケット画面は app/views/issues/show.rhtml です。
これを、プラグインディレクトリに、まったく同じ構造で配置します。
一から書き直すよりはもとのファイルをコピーして編集するほうが楽です。(ライセンスに注意)
$ mkdir vendor/plugins/redmine_issue_view_overwrite/app/views/issues
$ cp app/views/issues/show.rhtml vendor/plugins/redmine_issue_view_overwrite/app/views/issues
3. 上書きするファイルの編集
vendor/plugins/redmine_issue_view_overwrite/app/views/issues/show.rhtml を編集します
もとのファイルの最後あたり。
<% other_formats_links do |f| %> <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> <%= f.link_to 'PDF' %> <% end %> <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> <% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> <% end %> <% content_for :header_tags do %> <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %> <%= stylesheet_link_tag 'scm' %> <% end %>
ここから Atom の出力部分を削除します。
<% other_formats_links do |f| %> <%= f.link_to 'PDF' %> <% end %> <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> <% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> <% end %> <% content_for :header_tags do %> <%= stylesheet_link_tag 'scm' %> <% end %>
4. Redmineを再起動して確認
まとめ
- テーマ -> CSSだけで済む(HTMLタグが増えたり減ったりしない)場合
- ViewHook -> フックポイントが用意されている場合
- 言語ファイルの上書き -> 固定の文言を変える場合
- rhtmlファイル上書き -> 最後の手段
という感じです。
もっとエレガントな方法があればコメントください。