]> source.dussan.org Git - redmine.git/commitdiff
Ability to render multiple partials with view hook (#17763).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 18 Oct 2014 08:09:31 +0000 (08:09 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 18 Oct 2014 08:09:31 +0000 (08:09 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@13449 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redmine/hook.rb
test/integration/lib/redmine/hook_test.rb

index 715cbaf8062a6baff00bbba4def03b549a2d6f56..a20248154e48c70ba51c0306f8dc84c38e12a83a 100644 (file)
@@ -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
index 425e9610ec15bd6b2377bf5b8bcb90b36e6dd7a6..d6d5814027beea5ec1e3fb324d6e31f6fd5d9aba 100644 (file)
@@ -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