4

我正在尝试自定义出色的 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
}

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

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

4

3 回答 3

0

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

于 2014-10-29T21:56:27.807 回答
0

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

地点是:user_home\.grails\version\projects\project\plugins\plugin-name

于 2013-02-14T19:52:02.640 回答
0

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

grails install-templates

资源

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

于 2015-10-04T15:07:58.917 回答