我正在尝试自定义优秀的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.findTemplateInBinding
或GrailsConventionGroovyPageLocator
中的其他类似方法,但似乎无法从内部执行此操作一个Grails应用程序!
我创建了一个简单的类覆盖GrailsConventionGroovyPageLocator
,将findTemplateInBinding
方法替换为检查应用程序视图目录的方法,然后再检查插件。然后我修改了resources.groovy
,添加了一个doWithSpring闭包来替换默认beanClass
的{{1}}属性:
groovyPageLocator
但是,当我的应用程序启动时似乎没有调用它。
我真的很茫然。我预计这会很简单,但它会变成一些蠕虫。有没有人有什么建议?我想做的就是覆盖插件提供的视图......
答案 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
这会将插件的模板复制到您可以自定义的项目中。这与脚手架插件的作用是将文件复制到src / templates / scaffolding(注意,不是 grails-app / templates / scaffolding)。因此,在您的情况下,我会尝试将文件复制到src / views / filterpane