覆盖Grails 2.2中的插件视图

时间:2013-02-14 18:17:46

标签: grails plugins view gsp taglib

我正在尝试自定义优秀的FilterPane grails插件的HTML标记,但是我遇到了一些困难。 FilterPane提供了一堆用于呈现搜索/过滤器表单的标签,我想在我的应用程序中覆盖它们。

我原以为我可以简单地复制我想要覆盖的_tagName.gsp

plugins/filterpane-2.0.1.1/grails-app/views/filterpane

进入

grails-app/views/filterpane

并修改它们,但是如果使用指定的插件名称属性调用render方法,Grails似乎永远不会检查应用程序是否覆盖插件的视图。

org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateRenderer.findAndCacheTemplate在私有方法中包含以下代码:

...
GroovyPageScriptSource scriptSource;
if (pluginName == null) {
    scriptSource = groovyPageLocator.findTemplateInBinding(templatePath, pageScope);
}  else {
    scriptSource = groovyPageLocator.findTemplateInBinding(pluginName, templatePath, pageScope);
}
...

因此,当指定非null pluginName时,我们只需抓取插件的视图,并且永远不会检查应用程序是否覆盖它。

我认为解决此问题的一种简单方法是覆盖GrailsConventionGroovyPageLocator.findTemplateInBindingGrailsConventionGroovyPageLocator中的其他类似方法,但似乎无法从内部执行此操作一个Grails应用程序!

我创建了一个简单的类覆盖GrailsConventionGroovyPageLocator,将findTemplateInBinding方法替换为检查应用程序视图目录的方法,然后再检查插件。然后我修改了resources.groovy,添加了一个doWithSpring闭包来替换默认beanClass的{​​{1}}属性:

groovyPageLocator

但是,当我的应用程序启动时似乎没有调用它。

我真的很茫然。我预计这会很简单,但它会变成一些蠕虫。有没有人有什么建议?我想做的就是覆盖插件提供的视图......

3 个答案:

答案 0 :(得分:0)

您可以修改插件源,而不是更改模板的位置。

位置为:user_home\.grails\version\projects\project\plugins\plugin-name

答案 1 :(得分:0)

我不是grails专家,但为了覆盖插件视图,您应该在主项目视图文件夹中重新创建它们。例如,我通过在/auth/login.gsp中创建相同的内容,从Spring Security Plugin更改了/project/views/auth/login.gsp。如果您对插件文件本身进行了更改,则在卸载插件时可能会丢失它们。

答案 2 :(得分:0)

要更改插件模板中的视图,请执行命令

grails install-templates

source

这会将插件的模板复制到您可以自定义的项目中。这与脚手架插件的作用是将文件复制到src / templates / scaffolding(注意,不是 grails-app / templates / scaffolding)。因此,在您的情况下,我会尝试将文件复制到src / views / filterpane