在 Grails 2.2 中覆盖插件视图
Posted
技术标签:
【中文标题】在 Grails 2.2 中覆盖插件视图【英文标题】:Overriding plugin views in Grails 2.2 【发布时间】:2013-01-30 15:27:04 【问题描述】:我正在尝试自定义出色的 FilterPane grails 插件的 html 标记,但是遇到了一些困难。 FilterPane 提供了一堆标签来呈现搜索/过滤表单,我想在我的应用程序中覆盖这些标签。
我原以为我可以简单地复制我想从
覆盖的_tagName.gsp
s
plugins/filterpane-2.0.1.1/grails-app/views/filterpane
进入
grails-app/views/filterpane
并修改它们,但是如果使用指定的插件名称属性调用渲染方法,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);
...
所以当指定一个非空的pluginName
时,我们只是抓取插件的视图,从不检查应用程序是否覆盖它。
我认为解决此问题的一种简单方法是仅覆盖 GrailsConventionGroovyPageLocator.findTemplateInBinding
或 GrailsConventionGroovyPageLocator
中的其他类似方法,但似乎也无法在 Grails 应用程序中执行此操作!
我创建了一个覆盖GrailsConventionGroovyPageLocator
的简单类,将findTemplateInBinding
方法替换为在检查插件视图之前检查应用程序视图目录的方法。然后我修改了resources.groovy
,添加了一个doWithSpring闭包来替换默认groovyPageLocator
的beanClass
属性:
def doWithSpring =
def pageLocator = delegate.getBeanDefinition("groovyPageLocator")
pageLocator.beanClass = MyConventionGroovyPageLocator
但是,当我的应用程序启动时,它似乎没有被调用。
我真的很茫然。我原以为这很简单,但它变成了一些蠕虫。有没有人有什么建议?我要做的就是覆盖插件提供的视图...
【问题讨论】:
【参考方案1】:您可以修改插件源,而不是更改模板的位置。
位置是:user_home\.grails\version\projects\project\plugins\plugin-name
【讨论】:
是的,我可以,而且可能会这样,但我真的希望我能找到更好的解决方案!【参考方案2】:我不是 grails 专家,但为了覆盖插件视图,您应该在主项目视图文件夹中重新创建它们。例如,我通过在 /project/views/auth/login.gsp
中简单地创建相同的东西来更改 Spring Security 插件中的 /auth/login.gsp
。如果您对插件文件本身进行更改,卸载插件后可能会丢失它们。
【讨论】:
【参考方案3】:要更改插件模板中的视图,请执行命令
grails install-templates
source
这会将插件的模板复制到您的项目中,然后您可以对其进行自定义。例如,脚手架插件的作用是将文件复制到 src/templates/scaffolding(注意,不是 grails-app/templates/scaffolding)。因此,在您的情况下,我会尝试将文件复制到 src/views/filterpane
【讨论】:
这不起作用,因为@rcgeorge23 描述的原因。从插件运行时,Grails 不会检查您的应用程序的模板。换句话说,插件仅从自身获取模板。以上是关于在 Grails 2.2 中覆盖插件视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Grails spring-security-core 插件中覆盖 Login/authenticate 方法?