sioaji2012のブログ

普段は組み込み開発でC言語のみです。主にプログラムや勉強日記です

Redmineプラグインもくもく 山梨 #006回 プラグイン作成試し

前回、init.rb を書いただけという状態でした。 今回は、こちら。

チケット詳細ページにいいねを表示する。

既存のviewに何か要素を追加するときは、hook + jsで!

公式ページ hookリスト

www.redmine.org

既存画面に何か追加したい場合に、
上記の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を読むか。

ここまでの結果

表示した "いいね!" を押した場面。

f:id:sioaji2012:20180606211156p:plain


今日は、ここまで。
やっぱり、途中のフック指定するところが、ruby on rails な感じで
勉強しないとわからないので、お勉強しなければならない。…ですね。(^_^;)