2. Viewhookをつかってみる
チケット表示の画面にハンコ欄を表示させよう
プラグインは必ずしも専用の登録画面、表示画面がなくてもうごきます
まずは固定のHTMLを、チケット表示の画面に追加で表示させることを考えてみます
Redmineには、ViewHookと言って、プラグインから任意のHTMLを差し込めるポイントがいくつか用意されています
決まったお作法でかけば、そこにHTMLを追加したり、CSSを差し込んで見栄えを変えたり、JSを差し込んで動作を調整したりできます
できるといいもの
最低限をめざすので、カッコよくうごかなくてオッケー。
最初からかっこいいHTMLではなく、表示する場所を決めて、簡単な文字を追加で出せればOK
「ここにハンコ欄」という文字が出せることがゴールです
https://gyazo.com/1070b99eb853d958974b3ca28f707530
ViewHookのフックポイントはどこだ??
さて、ViewHookにHTMLを差し込むとして、いったいどのあたりに任意のHTMLが差し込めるのでしょう?
RedmineのViewHookのポイントは、公式サイトにも記載があります。
また、QiitaにもViewHookを紹介した記事がいくつかありました!
Hookの箇所は、View (html) に call_hook() する形で差し込まれています。ここのhook名に対応する箇所に、差し込むHTMLを定義すればいいのですが、HookのポイントやHook名がぱっと見わかりません。
Qiitaの記事にあるように、わたしも「プラグイン化すればいんじゃない?」と思ってちょっと試しました(完全版の記事と同じように、call_hook() メソッドにパッチを当てる感じでやっています)
今回はプラグインに同居する形で、development (not production) モードの場合のみ、プラグインの設定画面でチェックボックスでViewHookの表示を切り替えるようにしてみました。
code:ruby
# plugins/redmine_issue_stamps/lib/issue_stamps/redmine_hook_patch.rb
module IssueStamps
# お作法的によくないかもですが、同じパッチファイルにViewHookでCSSを差し込む部分を記載
class Hooks < Redmine::Hook::ViewListener
include IssuesHelper
def view_layouts_base_html_head(context = {})
stylesheet_link_tag('redmine_issue_stamps', plugin: 'redmine_issue_stamps')
end
end
# ViewHookを表示させるパッチ自体はこちら
module RedmineHookPatch
# ApplicationHelperがincludeしている、Redmine::Hooks::Helperのcall_hookをオーバーライド
# する感じです (設定でONの時のみ)
def call_hook(hook, context = {})
result = super
return result unless flag == 'true'
end
end
end
# ruby2.xが前提なので、alias method chainじゃなくて prependつかって拡張します
ApplicationHelper.prepend IssueStamps::RedmineHookPatch unless Rails.env.production?
実際の設定画面はこちら。
プラグインの本来の目的とは外れますが、とりあえずこのようにできました。
対応してみたプルリクエスト(変更)はこちらになります!
設定画面でのViewHookのポイント表示切り替え
https://gyazo.com/72b5a0d9a5ce3e566e563e9c60938107
チケット表示画面のViewHookの箇所
https://gyazo.com/cac37d0cc60a2afe687e8555e106552b
ハンコ欄を差し込むのに手頃そうなのは、view_issues_show_description_bottom のあたりでしょうか。
さて、こんどこそハンコ欄を....!!