2013-02-14 69 views
4

我试图自定义优秀的FilterPane grails插件的HTML标记,但是我遇到了一些困难。 FilterPane提供了一堆用于呈现搜索/过滤器表单的标记,并且我想在我的应用程序中重写这些标记。在Grails 2.2中覆盖插件视图

我原以为我可以简单地复制_tagName.gsp s表示,我想从

plugins/filterpane-2.0.1.1/grails-app/views/filterpane

覆盖到

grails-app/views/filterpane

,并对其进行修改,但它看起来像Grails的永远如果使用指定的插件名称属性调用render方法,则检查应用程序是否覆盖插件的视图。

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关闭替换默认groovyPageLocatorbeanClass属性:

def doWithSpring = { 
    def pageLocator = delegate.getBeanDefinition("groovyPageLocator") 
    pageLocator.beanClass = MyConventionGroovyPageLocator 
} 

然而,这似乎并没有被调用时,我的应用程序启动。

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

回答

0

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

的位置是:user_home\.grails\version\projects\project\plugins\plugin-name

+0

是的,我可以,而且可以得出这样的,但我真的希望我能找到一个更好的解决方案! – rcgeorge23 2013-02-14 20:33:46

0

我不是一个Grails专家,但为了覆盖你的主要项目中,你应该重新创建这些插件的观点意见的文件夹。例如,我通过简单地在/project/views/auth/login.gsp中创建相同的事物,从而改变了Spring Security Plugin中的/auth/login.gsp。如果您对插件文件本身进行了更改,如果您卸载该插件,则可能会丢失它们。

0

为了改变一个插件模板的视图,执行命令

grails install-templates

source

这将插件的模板复制到你的项目,你则可以自定义。比如脚手架插件,它是将文件复制到src/templates/scaffolding(注意,不是grails-app/templates/scaffolding)。因此,你的情况,我会尝试将文件复制到的src /视图/ filterpane

+0

由于@ rcgeorge23描述的原因,这不起作用。从插件运行时,Grails不会检查您的应用程序的模板。换句话说,插件仅从其自身获取其模板。 – Twelve24 2016-04-27 21:48:30