From ff9be52e45ed67b3d57ccbfee62f7c230738109c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 18 Oct 2014 08:09:31 +0000 Subject: [PATCH] Ability to render multiple partials with view hook (#17763). git-svn-id: http://svn.redmine.org/redmine/trunk@13449 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/hook.rb | 25 +++++++++++++++-------- test/integration/lib/redmine/hook_test.rb | 15 ++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/redmine/hook.rb b/lib/redmine/hook.rb index 715cbaf80..a20248154 100644 --- a/lib/redmine/hook.rb +++ b/lib/redmine/hook.rb @@ -99,20 +99,29 @@ module Redmine {: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 diff --git a/test/integration/lib/redmine/hook_test.rb b/test/integration/lib/redmine/hook_test.rb index 425e9610e..d6d581402 100644 --- a/test/integration/lib/redmine/hook_test.rb +++ b/test/integration/lib/redmine/hook_test.rb @@ -45,6 +45,14 @@ class HookTest < ActionController::IntegrationTest 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 @@ -105,4 +113,11 @@ VIEW 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 -- 2.39.5