【问题标题】:Overriding plugin views in Grails 2.2在 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
}

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

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

【问题讨论】:

    标签: grails plugins view gsp taglib


    【解决方案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 不会检查您的应用程序的模板。换句话说,插件仅从自身获取模板。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2013-03-20
      • 2014-09-07
      • 2011-10-31
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多