Feature #2542 » hook.rb.revised.diff
| lib/redmine/hook.rb (Arbeitskopie) | ||
|---|---|---|
| 17 | 17 | |
| 18 | 18 |
module Redmine |
| 19 | 19 |
module Hook |
| 20 |
include ActionController::UrlWriter |
|
| 21 | ||
| 20 | 22 |
@@listener_classes = [] |
| 21 | 23 |
@@listeners = nil |
| 22 | 24 |
@@hook_listeners = {}
|
| ... | ... | |
| 55 | 57 |
# Calls a hook. |
| 56 | 58 |
# Returns the listeners response. |
| 57 | 59 |
def call_hook(hook, context={})
|
| 58 |
response = '' |
|
| 59 |
hook_listeners(hook).each do |listener| |
|
| 60 |
response << listener.send(hook, context).to_s |
|
| 60 |
returning [] do |response| |
|
| 61 |
hls = hook_listeners(hook) |
|
| 62 |
if hls.any? |
|
| 63 |
request = context[:request] |
|
| 64 |
if request |
|
| 65 |
default_url_options[:host] ||= request.env["SERVER_NAME"] |
|
| 66 |
default_url_options[:port] ||= request.env["SERVER_PORT"] |
|
| 67 |
end |
|
| 68 |
hls.each {|listener| response << listener.send(hook, context)}
|
|
| 69 |
end |
|
| 61 | 70 |
end |
| 62 |
response |
|
| 63 | 71 |
end |
| 64 | 72 |
end |
| 65 | 73 | |
| ... | ... | |
| 91 | 99 |
include ActionView::Helpers::TextHelper |
| 92 | 100 |
include ActionController::UrlWriter |
| 93 | 101 |
include ApplicationHelper |
| 102 | ||
| 103 |
def self.render_on(hook, options={})
|
|
| 104 |
define_method hook do |context| |
|
| 105 |
context[:controller].send(:render_to_string, {:locals => context}.merge(options))
|
|
| 106 |
end |
|
| 107 |
end |
|
| 94 | 108 |
end |
| 95 | 109 | |
| 96 | 110 |
# Helper module included in ApplicationHelper so that hooks can be called |
| ... | ... | |
| 101 | 115 |
# Current project is automatically added to the call context. |
| 102 | 116 |
module Helper |
| 103 | 117 |
def call_hook(hook, context={})
|
| 104 |
Redmine::Hook.call_hook(hook, {:project => @project}.merge(context))
|
|
| 118 |
if is_a?(ActionController::Base) |
|
| 119 |
ctx = {:controller => self, :project => @project, :request => request}
|
|
| 120 |
Redmine::Hook.call_hook(hook, ctx.merge(context)) |
|
| 121 |
else |
|
| 122 |
ctx = {:controller => controller, :project => @project, :request => request}
|
|
| 123 |
Redmine::Hook.call_hook(hook, ctx.merge(context)).join |
|
| 124 |
end |
|
| 105 | 125 |
end |
| 106 | 126 |
end |
| 107 | 127 |
end |
| test/unit/lib/redmine/hook_test.rb (Arbeitskopie) | ||
|---|---|---|
| 67 | 67 |
|
| 68 | 68 |
def test_call_hook |
| 69 | 69 |
@hook_module.add_listener(TestHook1) |
| 70 |
assert_equal 'Test hook 1 listener.', @hook_module.call_hook(:view_layouts_base_html_head)
|
|
| 70 |
assert_equal ['Test hook 1 listener.'], @hook_module.call_hook(:view_layouts_base_html_head)
|
|
| 71 | 71 |
end |
| 72 | 72 |
|
| 73 | 73 |
def test_call_hook_with_context |
| 74 | 74 |
@hook_module.add_listener(TestHook3) |
| 75 |
assert_equal 'Context keys: bar, foo.', @hook_module.call_hook(:view_layouts_base_html_head, :foo => 1, :bar => 'a')
|
|
| 75 |
assert_equal ['Context keys: bar, foo.'], @hook_module.call_hook(:view_layouts_base_html_head, :foo => 1, :bar => 'a')
|
|
| 76 | 76 |
end |
| 77 | 77 |
|
| 78 | 78 |
def test_call_hook_with_multiple_listeners |
| 79 | 79 |
@hook_module.add_listener(TestHook1) |
| 80 | 80 |
@hook_module.add_listener(TestHook2) |
| 81 |
assert_equal 'Test hook 1 listener.Test hook 2 listener.', @hook_module.call_hook(:view_layouts_base_html_head)
|
|
| 81 |
assert_equal ['Test hook 1 listener.', 'Test hook 2 listener.'], @hook_module.call_hook(:view_layouts_base_html_head)
|
|
| 82 | 82 |
end |
| 83 | 83 |
end |