在 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.gsps

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.findTemplateInBindingGrailsConventionGroovyPageLocator 中的其他类似方法,但似乎也无法在 Grails 应用程序中执行此操作!

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

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无法从插件中找到视图

Grails 覆盖插件服务静态方法

Grails插件bean的覆盖方法

如何在 Grails spring-security-core 插件中覆盖 Login/authenticate 方法?

从 Grails Twitter-Bootstrap 插件覆盖 CSS

Grails 3 Spring Security 覆盖登录表单