Redmineプラグインもくもく 山梨 #006回 プラグイン作成試し
前回、init.rb を書いただけという状態でした。 今回は、こちら。
チケット詳細ページにいいねを表示する。
既存のviewに何か要素を追加するときは、hook + jsで!
公式ページ hookリスト
既存画面に何か追加したい場合に、
上記のHooks List の中にあるView Hooksを使って実装していく。
パーシャル(Viewの断片ページ)を呼ぶ。
⬇
View Hooksでerbを挿入することになるが、
表示したいhtmlをそのまま挿入とせず、Javascriptで要素を差し込むような感じ。
Redmine本体のビューがとても変わりやすい為、JavaScriptで埋め込んだほうが後で柔軟に対応できる。
■app/views/redmine_iine/hooks/_view_layouts_base_content.html.erb
・'いいね!'のリンクにclass 'redmine-iine'を設定して、クラスで要素を指定。
・リンクが押されたらアラート表示。
・リンクは、'#content .contextual'要素の手前に追加表示する。
<%= link_to 'いいね!', '#', class: 'redmine-iine', style: 'display: none;' %> <script> $('.redmine-iine').on('click', function(e) { e.preventDefault(); alert('いいね!'); }); $(function() { $('.redmine-iine').prependTo('#content .contextual').show(); }); </script>
汎用的なhookポイントを使う
RedmineのHooksでほしい位置に挿入できるようなHooksがないことがある。
(チケットの下に差し込むHookはあっても、上に差し込むのがなかったりなど)
Hookを上記ページからがんばって探すより、
汎用的に使える view_layouts_base_content で差し込んじゃう方を選ぶ感じ。
■lib/redmine_iine/hook.rb
・view_layouts_base_contentのHookを使う。
・html のbody のボトムに差し込まれる
・ここにおいて、(disply: none)、JSで置き換える。
module RedmineIine class Hook < Redmine::Hook::ViewListener def view_layouts_base_content(context = {}) controller = context[:controller] if controller.controller_name == 'issues' && controller.action_name == 'show' controller.render partial: 'redmine_iine/hooks/view_layouts_base_content' end end end end
■init.rb
require_dependency 'redmine_iine/hook' Redmine::Plugin.register :redmine_iine do name 'Redmine いいね!Plugin' author 'sioaji' version '0.0.1' end
実装したい画面のコントローラとアクション名を探すときは
実際にRedmine操作して、ログから追うのが早い。
あとは、routesを読むか。
ここまでの結果
表示した "いいね!" を押した場面。
今日は、ここまで。
やっぱり、途中のフック指定するところが、ruby on rails な感じで
勉強しないとわからないので、お勉強しなければならない。…ですね。(^_^;)