Redmine自体に手を入れずに見た目を変更する方法

RedmineRails 製なので、ちょっとした気に入らない部分は直接手を入れたくなるのだけれども、本家のアップデートが早いのでやはりプラグイン形式にしておいた方がいい。なので、拡張ポイントというか、できることをメモしておきます。


以下の4つの方法とそれぞれの例を紹介します。


他に方法があればコメントください。(それが目的


テーマで見た目を変える

これが一番簡単。

例えば、チケットの履歴って、デフォルトではこんな感じで、パッと見でいくつあるのか分かりづらい。
区切り先がユーザ名と変更内容の間に入っていることが原因だと考えられます。


そこで、テーマを作って見やすくすることを考えます。

1.既存テーマをコピー

まず、theme ディレクトリ以下の既存のテーマをコピーします。


$ cd Redmineインストールディレクトリ/pulbic/themes/
$ cp -R alternate newtheme

2.スタイルシートの編集

newtheme/stylesheets/application.css にはこんな感じで追記します。

/* history */
div#history {
  border: solid 1px #898989;
  background-color: #dedede;
}

div#history h3 {
  border-bottom: solid 1px #898989;
}

div#history .journal {
  border-bottom: solid 1px #898989;
  padding-left: 10px;
}
3.テーマの変更

管理者権限で 管理>設定>表示(タブ) より、「テーマ」を 「newtheme」にします

4.結果の確認

こんな感じになります。

プラグインで表示を追加(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
4.Redmine を再起動して確認

プラグインの反映には再起動が必要です。
左下に担当中のチケット数と報告したチケット数が表示されます。

プラグインで言語ファイルの上書き

言語ファイル(config/locales/*.yml)の内容は、プラグインの方が優先されます。
これを利用して文言を変更することができます。

1. プラグイン作成

上記と同様にコマンドで作成します。


$ ruby script/generate redmine_plugin LiteralOverwrite

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 のリンクを削除します。

1. プラグインの作成

上記と同じです。


$ ruby script/generate redmine_plugin IssueViewOverwrite

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を再起動して確認

このように右下がPDFだけになります。

まとめ

  • テーマ -> CSSだけで済む(HTMLタグが増えたり減ったりしない)場合
  • ViewHook -> フックポイントが用意されている場合
  • 言語ファイルの上書き -> 固定の文言を変える場合
  • rhtmlファイル上書き -> 最後の手段

という感じです。
もっとエレガントな方法があればコメントください。


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