{:only_path => true }
end
- # Helper method to directly render a partial using the context:
+ # Helper method to directly render using the context,
+ # render_options must be valid #render options.
#
# class MyHook < Redmine::Hook::ViewListener
# render_on :view_issues_show_details_bottom, :partial => "show_more_data"
# end
#
- def self.render_on(hook, options={})
+ # class MultipleHook < Redmine::Hook::ViewListener
+ # render_on :view_issues_show_details_bottom,
+ # {:partial => "show_more_data"},
+ # {:partial => "show_even_more_data"}
+ # end
+ #
+ def self.render_on(hook, *render_options)
define_method hook do |context|
- if context[:hook_caller].respond_to?(:render)
- context[:hook_caller].send(:render, {:locals => context}.merge(options))
- elsif context[:controller].is_a?(ActionController::Base)
- context[:controller].send(:render_to_string, {:locals => context}.merge(options))
- else
- raise "Cannot render #{self.name} hook from #{context[:hook_caller].class.name}"
+ render_options.map do |options|
+ if context[:hook_caller].respond_to?(:render)
+ context[:hook_caller].send(:render, {:locals => context}.merge(options))
+ elsif context[:controller].is_a?(ActionController::Base)
+ context[:controller].send(:render_to_string, {:locals => context}.merge(options))
+ else
+ raise "Cannot render #{self.name} hook from #{context[:hook_caller].class.name}"
+ end
end
end
end
VIEW
end
+ class SingleRenderOn < Redmine::Hook::ViewListener
+ render_on :view_welcome_index_left, :inline => 'SingleRenderOn 1'
+ end
+
+ class MultipleRenderOn < Redmine::Hook::ViewListener
+ render_on :view_welcome_index_left, {:inline => 'MultipleRenderOn 1'}, {:inline => 'MultipleRenderOn 2'}
+ end
+
# Hooks that stores the call context
class ContextTestHook < Redmine::Hook::ViewListener
cattr_accessor :context
assert_kind_of Hash, context[:request].params
assert_kind_of AccountController, context[:hook_caller]
end
+
+ def test_multiple_hooks
+ Redmine::Hook.add_listener(SingleRenderOn)
+ Redmine::Hook.add_listener(MultipleRenderOn)
+ get '/'
+ assert_equal 1, response.body.scan("SingleRenderOn 1 MultipleRenderOn 1 MultipleRenderOn 2").size
+ end
end