2013-02-14 76 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