http://www.redmine.org/wiki/redmine/Plugins
http://www.redmine.org/wiki/redmine/Plugin_Internals
You can override views but not controllers or models in Redmine. Here's how Redmine/Rails works if you try to override a controller (or model) and a view for a fictional plugin MyPlugin
:
IssueController
in MyPlugin and see it defines a show
actionIssueController
again and see it also defines a show
actionshow
action from the plugin with the one from ../appView loading is very similar but with one small difference (because of Redmine's patch to Engines)
Due to the fact that it is so easy to extend models and controllers the Ruby way (via including modules), Redmine shouldn't (and doesn't) maintain an API for overriding the core's models and/or controllers. Views on the other hand are tricky (because of Rails magic) so an API for overriding them is way more useful (and thus implemented in Redmine).
To override an existing Redmine Core view just create a view file named exactly after the one in ../app/views/ and Redmine will use it. For example to override the project index page add a file to../vendor/plugins/my_plugin/app/views/projects/index.rhtml.
As explained above: you rarely want to override a model/controller. Instead you should either:
A quick example of adding a new method can be found on Eric Davis' Budget plugin. Here he added a new method to Issue called deliverable_subject
and also declared a relationship.
A quick example of wrapping an existing method can be found on Eric Davis' Rate plugin. Here he uses the alias_method_chain
to hook into the UsersHelper and wrap the user_settings_tabs
method. So when the Redmine Core calls user_settings_tabs
the codepath looks like:
UsersHelper#user_settings_tabs
UsersHelper#user_settings_tabs
runs (which is actually UsersHelper#user_settings_tabs_with_rate_tab
)UsersHelper#user_settings_tabs_with_rate_tab
calls the original UsersHelper#user_settings_tabs
(renamed to UsersHelper#user_settings_tabs_without_rate_tab
)UsersHelper#user_settings_tabs_with_rate_tab
returns the combined result to the Redmine core, which is then renderedalias_method_chain
is a pretty advanced method but it's also really powerful.