我正在尝试自定义出色的 FilterPane grails 插件的 HTML 标记,但是我遇到了一些困难。FilterPane 提供了一堆用于呈现搜索/过滤表单的标签,我想在我的应用程序中覆盖这些标签。
我曾认为我可以简单地复制_tagName.gsp
我想要覆盖的 s
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
默认的属性groovyPageLocator
:
def doWithSpring = {
def pageLocator = delegate.getBeanDefinition("groovyPageLocator")
pageLocator.beanClass = MyConventionGroovyPageLocator
}
但是,当我的应用程序启动时,这似乎没有被调用。
我在这里真的很茫然。我原以为这很简单,但它变成了一些蠕虫。有没有人有什么建议?我想做的就是覆盖插件提供的视图......