How to know programmatically if a view or a layout file exists in grails

前端 未结 3 328
予麋鹿
予麋鹿 2021-01-12 22:53

I want to know programmatically if a view or a layout exists in grails.

I am thinking in obtain the absolutepath and ask for File.exists but I don\'t know how to obt

相关标签:
3条回答
  • 2021-01-12 23:36

    Since Grails 2.0, you can inject a GrailsConventionGroovyPageLocator:

    GrailsConventionGroovyPageLocator groovyPageLocator
    

    and call

    groovyPageLocator.findViewByPath(...)
    groovyPageLocator.findTemplateByPath(...)
    

    to check if views or templates exist.

    0 讨论(0)
  • 2021-01-12 23:42

    Additionally to what amra said, you can also use grailsAttributes(see docs for GrailsApplicationAttributes). Quick example:

    private templateExists(String name) {
        def template = grailsAttributes.getTemplateUri(name, request)
        def resource = grailsAttributes.pagesTemplateEngine
                                       .getResourceForUri(template)
        return resource && resource.file && resource.exists()
    }
    

    This example is of course for templates but as you can see from the docs, similar method exists for views too.

    0 讨论(0)
  • 2021-01-12 23:46

    I see 2 possibilities

    Search for view file

    If you build a war file you will see that views are stored in WEB-INF/grails-app/views. You can search for that resource.

    def uri = this.getClass().getResource("/grails-app/views/...").toURI()
    if(new File(uri).exists()){...}
    

    Use PathMatchingResourcePatternResolver

    Find a inspiration in assertView method of GrailsUrlMappingsTestCase.

    def patternResolver = new PathMatchingResourcePatternResolver()
    def pathPattern = "grails-app/views/" + ((controller) ? "$controller/" : "") + "${view}.*"
    if (!patternResolver.getResources(pathPattern)) {...}
    
    0 讨论(0)
提交回复
热议问题