hook.rb
| 1 | module Redmine |
|---|---|
| 2 | module Hook |
| 3 | HOOKS = %w(issue_show project_member_list_header project_member_list_row).collect {|h| h.to_sym} |
| 4 | |
| 5 | @@listener_classes = []
|
| 6 | @@listeners = nil |
| 7 | @@hook_listeners = {}
|
| 8 | |
| 9 | class << self |
| 10 | def add_listener(klass) |
| 11 | @@listener_classes << klass
|
| 12 | end
|
| 13 | |
| 14 | def listeners |
| 15 | @@listeners ||= @@listener_classes.collect {|listener| listener.instance} |
| 16 | end
|
| 17 | |
| 18 | def hook_listeners(hook) |
| 19 | @@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)}
|
| 20 | end
|
| 21 | |
| 22 | def call_hook(hook, context={}) |
| 23 | response = ''
|
| 24 | hook_listeners(hook).each do |listener|
|
| 25 | response << listener.send(hook, context).to_s |
| 26 | end
|
| 27 | response |
| 28 | end
|
| 29 | end
|
| 30 | |
| 31 | class Listener |
| 32 | include Singleton
|
| 33 | |
| 34 | def self.inherited(child) |
| 35 | Redmine::Hook.add_listener(child) |
| 36 | super
|
| 37 | end
|
| 38 | end
|
| 39 | |
| 40 | class ViewExtensionListener < Listener |
| 41 | include ERB::Util |
| 42 | include ActionView::Helpers::TagHelper |
| 43 | include ActionView::Helpers::FormHelper |
| 44 | include ActionView::Helpers::FormTagHelper |
| 45 | include ActionView::Helpers::FormOptionsHelper |
| 46 | include ActionView::Helpers::JavaScriptHelper |
| 47 | include ActionView::Helpers::PrototypeHelper |
| 48 | include ActionView::Helpers::NumberHelper |
| 49 | include ActionView::Helpers::UrlHelper |
| 50 | include ActionController::UrlWriter |
| 51 | include ApplicationHelper
|
| 52 | end
|
| 53 | |
| 54 | module Helper |
| 55 | def call_hook(hook, context={}) |
| 56 | Redmine::Hook.call_hook(hook, context) |
| 57 | end
|
| 58 | end
|
| 59 | end
|
| 60 | end
|
| 61 | |
| 62 | ApplicationHelper.send(:include, Redmine::Hook::Helper) |
| 63 |